在 VC++ 專案中加入郵件功能,選擇眾多:自行實作 SMTP/POP3/MIME 協定(需研讀 RFC 821, 822, 1123 等)、使用免費封裝類(功能受限)、呼叫 MAPI(需安裝 Outlook 等客戶端)、或採用成熟組件如 w3 JMail。JMail 功能強大,支援發送、接收、加密、叢集傳輸,雖多用於 ASP,但在 VC++ 中同樣運作良好。本文針對 JMail 4.3 在 VC++ 中的應用展開討論。
建議使用 JMail 4.3(介面較舊版有變動),可從 DIMAC 官網或 VC 知識庫下載。
#import "jmail.dll"
void main() {
CoInitialize(NULL);
{
jmail::ISpeedMailerPtr pSpeedMailer("JMail.SpeedMailer");
pSpeedMailer->SendMail("yourmail@163.com", "webmaster@163.com", "主題:你好!", "正文:大家好才是真的好!", "smtp.163.com");
}
CoUninitialize();
}
實際專案應加入例外處理(見 1.3 節)。
try {
// 發送程式碼
}
catch (_com_error & e) {
cerr << "錯誤號: 0x" << hex << e.Error() << endl;
cerr << "錯誤資訊: " << e.ErrorMessage() << endl;
cerr << "錯誤描述: " << e.Description() << endl;
}

IMessage 提供完整發送功能:
jmail::IMessagePtr pMessage("JMail.Message");
pMessage->From = "mymail@mydomain.com";
pMessage->FromName = "我的名字";
pMessage->AddRecipient("yourmail1@yourdomain.com", "", ""); // 無姓名、無 PGP
pMessage->AddRecipient("yourmail2@yourdomain.com", "收件人名字", "");
pMessage->AddRecipient("yourmail3@yourdomain.com", "收件人名字", "R9Rb7decrQWINuce3uFc0xDG"); // 帶 PGP Key
pMessage->Priority = 3; // 優先級 1-5,3 為中等
pMessage->Charset = "GB2312"; // 編碼,預設 iso-8859-1
pMessage->Subject = "郵件主題";
pMessage->Body = "郵件正文\r\n";
pMessage->AppendText("VC知識庫www.VCKBASE.com歡迎您!");
pMessage->AddAttachment("C:\\CONFIG.SYS", VARIANT_FALSE, "application/octet-stream");
pMessage->AddAttachment("C:\\test.gif", VARIANT_TRUE, "image/gif"); // 內嵌圖片
pMessage->Send("mailserver.com", VARIANT_FALSE);
關鍵在於引用附件中的圖片:AddAttachment 回傳 Content-ID,HTML 中用 <IMG SRC="cid:Content-ID"> 引用。
pMessage->Body = "郵件採用HTML格式,請切換到HTML模式。\r\n";
_bstr_t bstrCID = pMessage->AddAttachment("D:\\logo.gif", VARIANT_TRUE, "image/gif");
char pImgHTML[200];
strcpy(pImgHTML, "<IMG SRC='cid:");
strcat(pImgHTML, (char*)bstrCID);
strcat(pImgHTML, "'>");
pMessage->HTMLBody = "<H2>VC知識庫</H2>";
pMessage->AppendHTML("<BR>www.VCKBASE.com ");
pMessage->AppendHTML(pImgHTML);
pMessage->Send("", VARIANT_FALSE);
標準標頭用 AddNativeHeader,自訂標頭用 AddHeader(自動加 X- 前綴):
pMessage->AddNativeHeader("Message-ID", "VCKBASE:ABCDEFG1234567");
pMessage->AddNativeHeader("Date", "1800-1-1");
pMessage->AddHeader("Originating-IP", "123.345.567.789"); // 偽造 IP
pMessage->AddHeader("Mailer", "MyMailBox 1.0");
pMessage->AddHeader("Company", "MyCompany");
// 要求讀取回條
pMessage->AddNativeHeader("Disposition-Notification-To", "sender@domain.com");
需驗證的伺服器,發送時提供帳號密碼:
pMessage->Send("username:password@mailserver.com");
伺服器名稱設為空字串,JMail 會透過 DNS 查詢目標域 MX 記錄直接投遞:
pMessage->Send("", VARIANT_FALSE);
原理同 SMTP 轉發,指定代理位址即可:
pMessage->AddRecipient("yourmail@yourdomain.com", "", "");
pMessage->Send("192.16.10.11", VARIANT_FALSE);
免費版不支援,需標準版/專業版並安裝 PGP 軟體(如 PGPFreeware)。叢集發送適合大量客戶通知,可結合資料庫自行實作。
The message was undeliverable. All servers failed to receive the messageWSAGetLastError() returned 11001, Host not foundsohumx.sohu.comtest@163.com 或發件人等於收件人,返回 554 Sender address rejected: Access denied(未完待續... 下篇將介紹郵件接收功能)