91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

  • 大小: 9.09M
    文件類型: .rar
    金幣: 1
    下載: 0 次
    發(fā)布日期: 2020-12-14
  • 語言: C#
  • 標(biāo)簽: 郵件??

資源簡介


用vmime收取郵件/解析郵件

VMIME是一個GNU下開源的第三方類庫,主要是支持各種郵件協(xié)議的,本文我們來學(xué)習(xí)一下用vmime收取郵件及vmime解析郵件。

用vmime收取郵件
vmime對郵件格式和郵件協(xié)議做了很好的封裝,使用起來還是非常方便的。
vmime對于郵件協(xié)議都封裝在vmime::net名字空間中,主要要用到的對象,有:
vmime::net::session,主要用于維護(hù)和服務(wù)器之間的連接
vmime::net::store,表示一個郵件存儲,這是一個基類,沒種郵件協(xié)議都有自己的store(如POP3Store,IMAPStore)
vmime::net::folder,表示郵件存儲上的文件夾,和store一樣,每種郵件協(xié)議,都有自己的folder實(shí)現(xiàn)
vmime::net::message,表示一封網(wǎng)絡(luò)郵件,和vmime::message不同,vmime::net::message可能只有郵件的一部分,如郵件頭等信息(由使用的郵件協(xié)議決定)。
vmime會根據(jù)session中設(shè)置的郵件協(xié)議,創(chuàng)建對應(yīng)的store。
一些常用操作的實(shí)現(xiàn)(POP3協(xié)議):
連接郵箱:
vmime::utility::ref<vmime::net::session> session = vmime::create<vmime::net::session>(); //創(chuàng)建session
vmime::utility::ref<vmime::net::store> store = session->getStore(vmine_url); //獲得store
store->connect();//連接
vmime::utility::ref<vmime::net::folder>folder = store->getDefaultFolder();//創(chuàng)建folder,路徑是默認(rèn)路徑(inbox)
folder->open(vmime::net::folder::MODE_READ_WRITE);//以讀寫的形式打開
獲取郵件:
std::vector<vmime::utility::ref<vmime::net::message> > allMessages = folder->getMessages();
folder->fetchMessages(allMessages, vmime::net::folder::FETCH_ENVELOPE);  //獲取所有郵件的頭部信息,包含sender, recipients, date, subject
vmime::string mailContent;
vmime::utility::outputStreamStringAdapter out(mailContent);
resultMsg->extract(out);  //找到需要的郵件后,下載到本地,保存到string中,這里vmime::string是std::string的typedef
刪除郵件:
folder->deleteMessage(resultMsg->getNumber()); //執(zhí)行刪除指令
folder->close(true);//關(guān)閉文件夾,真正對郵件進(jìn)行刪除
使用當(dāng)中出現(xiàn)的問題:
按照vmime-book中的例子,在獲取郵件的時候,增加了vmime::net::folder::FETCH_FLAGS標(biāo)簽后,會拋出異常,提示不支持該操作。
還有執(zhí)行了folder->deleteMessage函數(shù)之后,郵件沒有真正刪除。通過抓包和查看源代碼后發(fā)現(xiàn),deleteMessage函數(shù)是對郵件服務(wù)器發(fā)送了DELE指令,但是郵件服務(wù)器不會立即執(zhí)行,需要QUIT之后才會真正的刪除。而在folder的析構(gòu)函數(shù)中,調(diào)用的是folder->close(false)函數(shù)來關(guān)閉文件夾的,這樣在發(fā)送QUIT命令之前,會向郵件服務(wù)器發(fā)送一個RSET命令,將已經(jīng)被標(biāo)記為刪除的郵件狀態(tài)充值,所以不會真正的刪除郵件。目前只有在執(zhí)行了刪除命令后,顯式執(zhí)行close(true)函數(shù),確保馬上發(fā)送QUIT命令,讓服務(wù)器刪除郵件。
上述命令真正執(zhí)行的POP3命令為:
#連接
USER xxx    #用戶名
PASS xxx    #密碼
STAT         #查詢郵件數(shù)量和大小
TOP 1 0     #查看序號為1的郵件的頭部
RETR 1      #接受第一封郵件的所有內(nèi)容
DELE 1      #刪除第一封郵件
QUIT          #退出,服務(wù)器執(zhí)行刪除操作

vmime解析郵件

解析郵件相對比較簡單,需要將收取的郵件,重新從字符串轉(zhuǎn)換成vmime::message格式,然后就可以獲取到自己需要部分的內(nèi)容了。
首先將vmime::string格式轉(zhuǎn)換為vmime::message:
vmime::utility::ref<vmime::message> mail = vmime::create<vmime::message>();
mail->parse(mailContent);
vmime還提供了一個簡單的幫助類vmime::messageParser方便對message進(jìn)行解析。
message主要包含了郵件頭和郵件內(nèi)容,內(nèi)容又因?yàn)閙ulti-part的郵件格式規(guī)定,被拆分成了多個vmime::textPart。通常使用到的textPart的子類,有vmime::htmlTextPart和vmime::plainTextPart,分別對應(yīng)郵件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); //強(qiáng)制轉(zhuǎn)換正文為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);
   utf8Out.flush();
}
    }
對于html個是的郵件正文,還可以遍歷獲取里面的embeddedObject,如嵌入的附件圖片等,不過目前沒有這樣的需求,就沒有去嘗試了。
在真正執(zhí)行的時候,又發(fā)現(xiàn)了一個問題,必須在開始使用前,調(diào)用vmime::platform::setHandler<vmime::platforms::posix::posixHandler>();設(shè)置平臺相關(guān)的handler,這里設(shè)置的是符合posix的平臺,windows貌似也有對應(yīng)的handler。


資源截圖

代碼片段和文件信息

using?System;
using?System.xml;
using?System.xml.XPath;
using?System.IO;
using?System.Collections.Generic;
using?System.Text;

namespace?CertCompressor
{
????class?Program
????{
????????///?
????????///?Purpose:?
///?-?Read?all?PEM?files?and?write?them?into?one?TXT?file
///?-?Read?mime?types?from?xml?file?and?convert?to?INI?format
????????///?

????????static?void?Main(string[]?args)
????????{
????????????Console.SetBufferSize(100?5000);

????????????StringBuilder?s_Text?=?new?StringBuilder(100000);

????????????String?s_WorkDir?=?Directory.GetCurrentDirectory();
????????????int?Pos?=?s_WorkDir.IndexOf(“\\Converter\\“);
????????????if?(Pos?????????????????throw?new?Exception(“Invalid?directory.?This?program?must?run?in?\“...\\Converter\\

?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----

?????目錄??????????0??2013-12-26?21:56??Vmime.NET

?????目錄??????????0??2013-12-26?21:51??Vmime.NET\libvmime

?????文件???????1531??2015-11-21?08:36??Vmime.NET\_CleanAll.cmd

?????目錄??????????0??2014-01-02?15:20??Vmime.NET\Converter

?????文件???????1959??2013-12-29?13:28??Vmime.NET\Converter\Converter.csproj

?????目錄??????????0??2013-12-29?12:29??Vmime.NET\Converter\MimeTypes

?????文件?????163065??2013-12-29?12:29??Vmime.NET\Converter\MimeTypes\mime.xml

?????文件??????10330??2014-01-26?21:11??Vmime.NET\Converter\Program.cs

?????目錄??????????0??2014-01-02?15:20??Vmime.NET\Converter\Release

?????文件??????20480??2014-01-26?21:11??Vmime.NET\Converter\Release\Converter.exe

?????目錄??????????0??2013-12-26?22:12??Vmime.NET\Converter\RootCertificates

?????文件???????1406??2013-12-26?12:25??Vmime.NET\Converter\RootCertificates\A-Trust-nQual-03.pem

?????文件???????1542??2013-12-26?12:28??Vmime.NET\Converter\RootCertificates\AAACertificateServices.pem

?????文件???????2074??2013-12-26?12:29??Vmime.NET\Converter\RootCertificates\ACEDICOMRoot.pem

?????文件???????2318??2013-12-26?12:32??Vmime.NET\Converter\RootCertificates\ACRaízCerticámaraS.A..pem

?????文件???????2082??2013-12-26?18:18??Vmime.NET\Converter\RootCertificates\ActalisAuthenticationRootCA.pem

?????文件???????1504??2013-12-26?12:26??Vmime.NET\Converter\RootCertificates\AddTrustClass1CARoot.pem

?????文件???????1546??2013-12-26?12:26??Vmime.NET\Converter\RootCertificates\AddTrustExternalCARoot.pem

?????文件???????1500??2013-12-26?12:26??Vmime.NET\Converter\RootCertificates\AddTrustPublicCARoot.pem

?????文件???????1514??2013-12-26?12:26??Vmime.NET\Converter\RootCertificates\AddTrustQualifiedCARoot.pem

?????文件???????1224??2013-12-26?12:26??Vmime.NET\Converter\RootCertificates\AffirmTrustCommercial.pem

?????文件???????1224??2013-12-26?12:26??Vmime.NET\Converter\RootCertificates\AffirmTrustNetworking.pem

?????文件???????1922??2013-12-26?12:26??Vmime.NET\Converter\RootCertificates\AffirmTrustPremium.pem

?????文件????????766??2013-12-26?12:26??Vmime.NET\Converter\RootCertificates\AffirmTrustPremiumECC.pem

?????文件???????1344??2013-12-26?12:26??Vmime.NET\Converter\RootCertificates\AmericaOnlineRootCertificationAuthority1.pem

?????文件???????2050??2013-12-26?12:26??Vmime.NET\Converter\RootCertificates\AmericaOnlineRootCertificationAuthority2.pem

?????文件???????1340??2013-12-26?12:31??Vmime.NET\Converter\RootCertificates\ApplicationCA-JapaneseGovernment.pem

?????文件???????1592??2013-12-26?12:27??Vmime.NET\Converter\RootCertificates\AutoridaddeCertificacionFirmaprofesionalA.pem

?????文件???????2202??2013-12-26?12:27??Vmime.NET\Converter\RootCertificates\AutoridaddeCertificacionFirmaprofesionalB.pem

?????文件???????1282??2013-12-26?12:27??Vmime.NET\Converter\RootCertificates\BaltimoreCyberTrustRoot.pem

............此處省略819個文件信息

評論

共有 條評論