首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

利用 JMail 組件快速構建郵件程式(上):SMTP 發送全攻略

     編輯:關於VC++

在 VC++ 專案中加入郵件功能,選擇眾多:自行實作 SMTP/POP3/MIME 協定(需研讀 RFC 821, 822, 1123 等)、使用免費封裝類(功能受限)、呼叫 MAPI(需安裝 Outlook 等客戶端)、或採用成熟組件如 w3 JMail。JMail 功能強大,支援發送、接收、加密、叢集傳輸,雖多用於 ASP,但在 VC++ 中同樣運作良好。本文針對 JMail 4.3 在 VC++ 中的應用展開討論。

一、準備篇

1.1 組件安裝

建議使用 JMail 4.3(介面較舊版有變動),可從 DIMAC 官網或 VC 知識庫下載。

1.2 極簡郵件發送範例

#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 節)。

1.3 COM 例外捕捉

try {
    // 發送程式碼
}
catch (_com_error & e) {
    cerr << "錯誤號: 0x" << hex << e.Error() << endl;
    cerr << "錯誤資訊: " << e.ErrorMessage() << endl;
    cerr << "錯誤描述: " << e.Description() << endl;
}

二、郵件發送進階功能

郵件發送程式執行效果

2.1 使用 IMessage 介面發送帶附件郵件

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);

2.2 發送 HTML 格式郵件(含內嵌圖片)

關鍵在於引用附件中的圖片: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);

2.3 自訂郵件標頭

標準標頭用 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");

2.4 SMTP 驗證處理

需驗證的伺服器,發送時提供帳號密碼:

pMessage->Send("username:password@mailserver.com");

2.5 不透過 SMTP 轉發伺服器直接投遞

伺服器名稱設為空字串,JMail 會透過 DNS 查詢目標域 MX 記錄直接投遞:

pMessage->Send("", VARIANT_FALSE);

2.6 透過代理閘道發送

原理同 SMTP 轉發,指定代理位址即可:

pMessage->AddRecipient("yourmail@yourdomain.com", "", "");
pMessage->Send("192.16.10.11", VARIANT_FALSE);

2.7 加密傳輸與叢集發送

免費版不支援,需標準版/專業版並安裝 PGP 軟體(如 PGPFreeware)。叢集發送適合大量客戶通知,可結合資料庫自行實作。

2.8 常見發送錯誤與對策

  • SMTP 伺服器不存在:The message was undeliverable. All servers failed to receive the message
  • 無 SMTP 伺服器且收件者域名錯誤:WSAGetLastError() returned 11001, Host not found
  • 伺服器拒絕轉發非本地帳號:同上第一條錯誤
  • SOHU 等拒絕外部郵件:不設 SMTP 伺服器走 DNS 查詢,或直連 sohumx.sohu.com
  • 發件人被過濾:如 test@163.com 或發件人等於收件人,返回 554 Sender address rejected: Access denied

(未完待續... 下篇將介紹郵件接收功能)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved