上文《利用JMail組件快速構建郵件程序(上)》中介紹了郵件的發送,本文將介紹郵件的接收過程,示例代碼運行效果圖如下:
三、郵件接收篇
3.1 利用IPOP3接收郵件
接收郵件時用到的接口是IPOP3, 首先連接上郵件服務器,從Messages中得到郵件信息集合,然後就可以通過遍歷集合取得每條Message中的具體內容。
請看如下代碼:
jmail::IPOP3Ptr pPOP3("JMail.POP3");
// 非必須,設置超時時間為60秒,默認為120秒
pPOP3->Timeout = 60;
// 連接郵件服務器
pPOP3->Connect("webmaster", // 用戶帳號
"password", // 密碼
"pop3.163.com", // POP3服務器
110); // POP3端口
jmail::IMessagesPtr pMessages;
jmail::IMessagePtr pMessage;
pMessages = pPOP3->Messages; // 取得集合
// 已下載的郵件的實際個數(因為第0個ITEM是未用的,所以-1)
long lCount = pMessages->Count - 1;
// 遍歷每封信
for(long i = 1; i <= lCount; i++)
{
pMessage = pMessages->Item[i];
_bstr_t bstrSubject = pMessage->Subject;
_bstr_t bstrFrom = pMessage->From;
_bstr_t bstrBody = pMessage->Body;
printf("(%d)Subject:%s, From:%s, Body:%s\r\n",
i,
(const char*)bstrSubject,
(const char*)bstrFrom,
(const char*)bstrBody);
pMessage.Release();
}
pMessages->Clear(); // 這裡的Clear並不是清除郵件服務器上的郵件
pMessages.Release();
// 斷開連接
pPOP3->Disconnect();
3.2、實現類似Foxmail的遠程管理功能
Foxmail的遠程管理功能非常好用,特別是面對垃圾郵件成災的時候,如果直接收取全部郵件內容無疑會浪費寶貴的時間,所以只要讀取郵件頭的信息我們就可以進行取捨,我們可以利用JMail提供的DownloadHeaders方法來實現這樣的功能,請參考如下代碼:
......
pPOP3->Connect("webmaster","password","pop3.163.com",110);
// 只下載郵件頭信息
pPOP3->DownloadHeaders();
pMessages = pPOP3->Messages;
long lCount = pMessages->Count - 1;
// 遍歷每個郵件頭,遇到不願意收的立刻刪除
for(long i = 1; i <= lCount; i++)
{
pMessage = pMessages->Item[i];
_bstr_t bstrSubject = pMessage->Subject;
_bstr_t bstrFrom = pMessage->From;
// 因為中文主題可能被編碼, 所以不能直接判斷,在這裡只是演示刪除的功能
if(strstr((const char*)bstrSubject, "成人") != NULL)
pPOP3->DeleteSingleMessage(i); // 刪除被認為非法的信息
else
printf("(%d)Subject:%s, From:%s\r\n",
i,
(const char*)bstrSubject,
(const char*)bstrFrom);
pMessage.Release();
}
......
3.3、郵件頭詳細信息的讀取
通過IMessage::Headers得到郵件頭對象,然後用IHeaders::GetText()得到全部頭部信息,或者用IHeaders::GetHeader()得到指定的頭部信息,例如:
jmail::IHeadersPtr pHeaders;
pHeaders = pMessage->Headers;
_bstr_t bstrHeaderText = pHeaders->GetText(); // 得到全部頭部信息
printf("%s\r\n", (const char*)bstrHeaderText);
_bstr_t bstrContentType = pHeaders->GetHeader("Content-Type"); // 得到數據類型
printf("%s\r\n", (const char*)bstrContentType);
pHeaders.Release();
3.4、通過代理接收郵件
通過POP3代理收郵件,程序代碼不需要變動,只需將郵件服務器設置為代理服務器地址,帳號後面加上真實POP3主機的地址即可,例如:代理服務器地址192.16.10.1,需要收取[email protected]中的信, 則設置如下:
郵件服務器: 192.16.10.1
帳號: test#pop3.163.com
3.5、郵件的刪除
在上面我們曾經講到刪除單個郵件的方法:DeleteSingleMessage(long MessageID),如果想清空郵箱則只需要執行DeleteMessages(), 詳細請參考3.2中的代碼。
3.6、一點說明
IPOP3的DownloadMessages方法可以收取所有郵件中的所有數據,當我們通過Connect連接上服務器後,如果不執行DownloadMessages或者DownloadHeaders,則在執行pMessages->Item[i];時它會動態從服務器讀取當前該封郵件的全部數據。
四、關於程序的分發
在發行你的程序時不需安裝整個JMail,只需將jmail.dll注冊一下即可。
例如:regsvr32.exe c:\windows\system32\jmail.dll
(全文完)