前文寫了使用vmime庫通過pop3協定收取郵件,繼續寫對郵件的解析。
解析郵件相對比較簡單,需要将收取的郵件,重新從字元串轉換成vmime::message格式,然後就可以擷取到自己需要部分的内容了。
首先将vmime::string格式轉換為vmime::message:
vmime::utility::ref<vmime::message> mail = vmime::create<vmime::message>();
mail->parse(mailcontent);
vmime還提供了一個簡單的幫助類vmime::messageparser友善對message進行解析。
message主要包含了郵件頭和郵件内容,内容又因為multi-part的郵件格式規定,被拆分成了多個vmime::textpart。通常使用到的textpart的子類,有vmime::htmltextpart和vmime::plaintextpart,分别對應郵件body中的content-type為text/html和text/plain。
代碼:
vmime::messageparser mp(mail);
for (int i = 0; i < mp.gettextpartcount(); ++i) //周遊所有的textpart
{
vmime::utility::ref<const vmime::textpart> text = mp.gettextpartat(i);
if (text->gettype().getsubtype() == vmime::mediatypes::text_html) //text/html
vmime::utility::ref<const vmime::htmltextpart> htmltext = text.dynamiccast<const vmime::htmltextpart>();
vmime::utility::outputstreamstringadapter htmlout(htmlcontent);
vmime::utility::charsetfilteredoutputstream utf8out(htmltext->getcharset(), vmime::charset(“utf-8″), htmlout); //強制轉換正文為utf8編碼
htmltext->gettext()->extract(utf8out);
utf8out.flush();
}
else if (text->gettype().getsubtype() == vmime::mediatypes::text_plain) //text/plain
vmime::utility::ref<const vmime::plaintextpart> plaintext = text.dynamiccast<const vmime::plaintextpart>();
vmime::utility::outputstreamstringadapter plainout(plaintextcontent);
vmime::utility::charsetfilteredoutputstream utf8out(plaintext->getcharset(), vmime::charset(“utf-8″), plainout);
plaintext->gettext()->extract(utf8out);
對于html個是的郵件正文,還可以周遊擷取裡面的embeddedobject,如嵌入的附件圖檔等,不過目前沒有這樣的需求,就沒有去嘗試了。
在真正執行的時候,又發現了一個問題,必須在開始使用前,調用vmime::platform::sethandler<vmime::platforms::posix::posixhandler>();設定平台相關的handler,這裡設定的是符合posix的平台,windows貌似也有對應的handler。
轉載自:https://coolex.info/blog/113.html