1. 程式人生 > >VC++ 傳送郵件(使用郵件進行程式異常報告)

VC++ 傳送郵件(使用郵件進行程式異常報告)

由於最近資料解析軟體接入的裝置很多,程式一旦發生異常如果沒有及時恢復,可能會造成資料丟失,比如軟體崩潰,資料庫卡死無法寫入資料,等等因素,會造成軟體工作不正常,因此增加了一個郵件提醒功能(郵件提醒最簡單),某些郵箱綁定了手機或微信,可以同步實時進行提醒,比如我用的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;
}

//呼叫方法


收到的郵件