天天看點

vmime解析郵件

前文寫了使用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

上一篇: 初試xslt

繼續閱讀