VC++ 傳送郵件(使用郵件進行程式異常報告)
阿新 • • 發佈:2019-01-01
由於最近資料解析軟體接入的裝置很多,程式一旦發生異常如果沒有及時恢復,可能會造成資料丟失,比如軟體崩潰,資料庫卡死無法寫入資料,等等因素,會造成軟體工作不正常,因此增加了一個郵件提醒功能(郵件提醒最簡單),某些郵箱綁定了手機或微信,可以同步實時進行提醒,比如我用的139郵箱,或者QQ郵箱,會直接在微信,簡訊上面提醒,實時性還是比較高。
//郵件傳送類-寫成了全域性類
#include "StdAfx.h" #include "e-mail.h" #define CLASS_NAME E_MAIL_Class //類名稱定義 E_MAIL_Class g_EmailClass; //全域性靜態郵件傳送類 /************************************************************************************************************************* * 函式 : String ^CLASS_NAME::SendEmail(String ^pSendEmail, String ^pPassword, String ^pSendServer, String ^pInboxEmail, String ^pCCEmail,String ^pTitle, String ^pContent) * 功能 : 傳送一封郵件 * 引數 : pSendEmail:發件箱;pPassword:發件箱密碼;pSendServer:發件箱伺服器;pInboxEmail:收件箱;pCCEmail:抄送;pTitle:郵件主題;pContent:郵件內容 * 返回 : null:傳送成功;其它:傳送失敗字串 * 依賴 : 底層讀寫函式 * 作者 :
[email protected] * 時間 : 2018-01-18 * 最後修改時間 : 2018-01-20 * 說明 : 用於傳送郵件 *************************************************************************************************************************/ String ^CLASS_NAME::SendEmail(String ^pSendEmail, String ^pPassword, String ^pSendServer, String ^pInboxEmail, String ^pCCEmail, String ^pTitle, String ^pContent) { try { //例項化一個傳送郵件類。 MailMessage ^mailMessage = gcnew MailMessage(); //發件人郵箱地址,方法過載不同,可以根據需求自行選擇。 mailMessage->From = gcnew MailAddress(pSendEmail); //收件人郵箱地址。 mailMessage->To->Add(gcnew MailAddress(pInboxEmail)); //抄送人郵箱地址 if (pCCEmail != nullptr && pCCEmail->Length > 3) { mailMessage->CC->Add(pCCEmail); } //郵件標題。 mailMessage->Subject = pTitle; //郵件內容。 mailMessage->Body = pContent; //例項化一個SmtpClient類。 SmtpClient ^client = gcnew SmtpClient(); //在這裡我使用的是qq郵箱,所以是smtp.qq.com,如果你使用的是126郵箱,那麼就是smtp.126.com。 client->Host = pSendServer; //使用安全加密連線。 client->EnableSsl = true; //不和請求一塊傳送。 client->UseDefaultCredentials = false; //驗證發件人身份(發件人的郵箱,郵箱裡的生成授權碼); client->Credentials = gcnew System::Net::NetworkCredential(pSendEmail, pPassword); //傳送 client->Send(mailMessage); return nullptr; //傳送成功 } catch (Exception^ e) //傳送失敗 { SYS_LOG.Write(__FILE__ + __LINE__ + e->Message); return e->Message; } }
#pragma once #define WIN32_LEAN_AND_MEAN #include "windows.h" #include "systemlog.h" //E-Mail傳送相關 using namespace System::Net::Mail; using namespace System::Text; using namespace System::Data; using namespace System; class E_MAIL_Class { public: //建構函式 E_MAIL_Class() { } //傳送一封郵件 public:String ^SendEmail(String ^pSendEmail, String ^pPassword, String ^pSendServer, String ^pInboxEmail, String ^pCCEmail, String ^pTitle, String ^pContent); //解構函式 ~E_MAIL_Class() { } }; extern E_MAIL_Class g_EmailClass; //全域性靜態郵件傳送類
//添加了一個配置介面
將配置資訊儲存到了ini檔案,儲存的郵箱密碼記得加密,不要明文存放到配置檔案,這裡使用了簡單的AES256進行了加密
//郵件傳送方法,也是用的全域性靜態的,方便隨時呼叫
//傳送一個異常日誌郵件
bool NAME_SPACE::SendErrorEmail(String ^pTitle, String ^pContent)
{
//異常處理
try
{
if (g_EmailConfig.isEnable == false) return false; //沒有開啟發送功能,直接退出
String ^pError;
System::DateTime dt = System::DateTime::Now; //系統時間
//傳送測試郵件
pError = g_EmailClass.SendEmail(
CharToString(g_EmailConfig.SenderEmail), //發件箱email
CharToString(g_EmailConfig.SenderPassword), //發件箱密碼
CharToString(g_EmailConfig.SenderServer), //發件箱伺服器
CharToString(g_EmailConfig.InboxEmail), //收件箱email
CharToString(g_EmailConfig.CCEmail), //抄送email
pTitle, //郵件標題
dt.ToString("yyyy-MM-dd HH:mm:ss") + "\t " + pContent //郵件內容
);
if (pError != nullptr)
{
return false;
}
return true;
}
catch (Exception^ e)
{
SYS_LOG.Write(__FILE__ + __LINE__ + e->Message + e->StackTrace);
}
return false;
}
//呼叫方法
收到的郵件