首页

C# 用vmime收取邮件/解析邮件 实例源码下载

c#

2021-5-11

用vmime收取邮件/解析邮件

VMIME是一个GNU下开源的第三方类库,主要是支持各种邮件协议的,本文我们来学习一下用vmime收取邮件及vmime解析邮件。

用vmime收取邮件
vmime对邮件格式和邮件协议做了很好的封装,使用起来还是非常方便的。
vmime对于邮件协议都封装在vmime::net名字空间中,主要要用到的对象,有:
vmime::net::session,主要用于维护和服务器之间的连接
vmime::net::store,表示一个邮件存储,这是一个基类,没种邮件协议都有自己的store(如POP3Store,IMAPStore)
vmime::net::folder,表示邮件存储上的文件夹,和store一样,每种邮件协议,都有自己的folder实现
vmime::net::message,表示一封网络邮件,和vmime::message不同,vmime::net::message可能只有邮件的一部分,如邮件头等信息(由使用的邮件协议决定)。
vmime会根据session中设置的邮件协议,创建对应的store。
一些常用操作的实现(POP3协议):
连接邮箱:
vmime::utility::ref<vmime::net::session> session = vmime::create<vmime::net::session>(); //创建session
vmime::utility::ref<vmime::net::store> store = session->getStore(vmine_url); //获得store
store->connect();//连接
vmime::utility::ref<vmime::net::folder>folder = store->getDefaultFolder();//创建folder,路径是默认路径(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()); //执行删除指令
folder->close(true);//关闭文件夹,真正对邮件进行删除
使用当中出现的问题:
按照vmime-book中的例子,在获取邮件的时候,增加了vmime::net::folder::FETCH_FLAGS标签后,会抛出异常,提示不支持该操作。
还有执行了folder->deleteMessage函数之后,邮件没有真正删除。通过抓包和查看源代码后发现,deleteMessage函数是对邮件服务器发送了DELE指令,但是邮件服务器不会立即执行,需要QUIT之后才会真正的删除。而在folder的析构函数中,调用的是folder->close(false)函数来关闭文件夹的,这样在发送QUIT命令之前,会向邮件服务器发送一个RSET命令,将已经被标记为删除的邮件状态充值,所以不会真正的删除邮件。目前只有在执行了删除命令后,显式执行close(true)函数,确保马上发送QUIT命令,让服务器删除邮件。
上述命令真正执行的POP3命令为:
#连接
USER xxx    #用户名
PASS xxx    #密码
STAT         #查询邮件数量和大小
TOP 1 0     #查看序号为1的邮件的头部
RETR 1      #接受第一封邮件的所有内容
DELE 1      #删除第一封邮件
QUIT          #退出,服务器执行删除操作

vmime解析邮件

解析邮件相对比较简单,需要将收取的邮件,重新从字符串转换成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);
   utf8Out.flush();
}
    }
对于html个是的邮件正文,还可以遍历获取里面的embeddedObject,如嵌入的附件图片等,不过目前没有这样的需求,就没有去尝试了。
在真正执行的时候,又发现了一个问题,必须在开始使用前,调用vmime::platform::setHandler<vmime::platforms::posix::posixHandler>();设置平台相关的handler,这里设置的是符合posix的平台,windows貌似也有对应的handler。

资源下载此资源下载价格为3D币(VIP免费),请先
资源文件列表
Vmime.NET/_CleanAll.cmd , 1531
Vmime.NET/Converter/Converter.csproj , 1959
Vmime.NET/Converter/MimeTypes/mime.xml , 163065
Vmime.NET/Converter/Program.cs , 10330
Vmime.NET/Converter/Release/Converter.exe , 20480
Vmime.NET/Converter/RootCertificates/A-Trust-nQual-03.pem , 1406
Vmime.NET/Converter/RootCertificates/AAACertificateServices.pem , 1542
Vmime.NET/Converter/RootCertificates/ACEDICOMRoot.pem , 2074
Vmime.NET/Converter/RootCertificates/ACRaízCerticámaraS.A..pem , 2318
Vmime.NET/Converter/RootCertificates/ActalisAuthenticationRootCA.pem , 2082
Vmime.NET/Converter/RootCertificates/AddTrustClass1CARoot.pem , 1504
Vmime.NET/Converter/RootCertificates/AddTrustExternalCARoot.pem , 1546
Vmime.NET/Converter/RootCertificates/AddTrustPublicCARoot.pem , 1500
Vmime.NET/Converter/RootCertificates/AddTrustQualifiedCARoot.pem , 1514
Vmime.NET/Converter/RootCertificates/AffirmTrustCommercial.pem , 1224
Vmime.NET/Converter/RootCertificates/AffirmTrustNetworking.pem , 1224
Vmime.NET/Converter/RootCertificates/AffirmTrustPremium.pem , 1922
Vmime.NET/Converter/RootCertificates/AffirmTrustPremiumECC.pem , 766
Vmime.NET/Converter/RootCertificates/AmericaOnlineRootCertificationAuthority1.pem , 1344
Vmime.NET/Converter/RootCertificates/AmericaOnlineRootCertificationAuthority2.pem , 2050
Vmime.NET/Converter/RootCertificates/ApplicationCA-JapaneseGovernment.pem , 1340
Vmime.NET/Converter/RootCertificates/AutoridaddeCertificacionFirmaprofesionalA.pem , 1592
Vmime.NET/Converter/RootCertificates/AutoridaddeCertificacionFirmaprofesionalB.pem , 2202
Vmime.NET/Converter/RootCertificates/BaltimoreCyberTrustRoot.pem , 1282
Vmime.NET/Converter/RootCertificates/BuypassClass2CA1.pem , 1232
Vmime.NET/Converter/RootCertificates/BuypassClass2RootCA.pem , 1946
Vmime.NET/Converter/RootCertificates/BuypassClass3CA1.pem , 1232
Vmime.NET/Converter/RootCertificates/BuypassClass3RootCA.pem , 1946
Vmime.NET/Converter/RootCertificates/CADisig.pem , 1492
Vmime.NET/Converter/RootCertificates/CADisigRootR1.pem , 1966
Vmime.NET/Converter/RootCertificates/CADisigRootR2.pem , 1966
Vmime.NET/Converter/RootCertificates/Certigna.pem , 1352
Vmime.NET/Converter/RootCertificates/Certinomis-AutoritéRacine.pem , 2036
Vmime.NET/Converter/RootCertificates/certSIGNROOTCA.pem , 1196
Vmime.NET/Converter/RootCertificates/CertumCA.pem , 1138
Vmime.NET/Converter/RootCertificates/CertumTrustedNetworkCA.pem , 1376
Vmime.NET/Converter/RootCertificates/ChambersofCommerceRoot-2008.pem , 2636
Vmime.NET/Converter/RootCertificates/ChambersofCommerceRoot.pem , 1732
Vmime.NET/Converter/RootCertificates/ChinaInternetNetworkInformationCenterEVCertificatesRoot.pem , 1460
Vmime.NET/Converter/RootCertificates/Class2PrimaryCA.pem , 1320
Vmime.NET/Converter/RootCertificates/CNNICROOT.pem , 1236
Vmime.NET/Converter/RootCertificates/COMODOCertificationAuthority.pem , 1514
Vmime.NET/Converter/RootCertificates/COMODOECCCertificationAuthority.pem , 956
Vmime.NET/Converter/RootCertificates/COMODOHigh-AssuranceSecureServerCA.pem , 1818
Vmime.NET/Converter/RootCertificates/COMODOSSLCA.pem , 1782
Vmime.NET/Converter/RootCertificates/COMODOSSLCA2.pem , 1786
Vmime.NET/Converter/RootCertificates/ComSignCA.pem , 1324
Vmime.NET/Converter/RootCertificates/ComSignSecuredCA.pem , 1356
Vmime.NET/Converter/RootCertificates/CybertrustGlobalRoot.pem , 1340
Vmime.NET/Converter/RootCertificates/CybertrustPublicSureServerSVCA.pem , 1508
Vmime.NET/Converter/RootCertificates/D-TRUSTRootClass3CA22009.pem , 1542
Vmime.NET/Converter/RootCertificates/D-TRUSTRootClass3CA2EV2009.pem , 1562
Vmime.NET/Converter/RootCertificates/DeutscheTelekomRootCA2.pem , 1340
Vmime.NET/Converter/RootCertificates/DigiCertAssuredIDRootCA.pem , 1372
Vmime.NET/Converter/RootCertificates/DigiCertGlobalRootCA.pem , 1360
Vmime.NET/Converter/RootCertificates/DigiCertHighAssuranceCA-3.pem , 2292
Vmime.NET/Converter/RootCertificates/DigiCertHighAssuranceEVCA-1.pem , 2490
Vmime.NET/Converter/RootCertificates/DigiCertHighAssuranceEVRootCA.pem , 1390
Vmime.NET/Converter/RootCertificates/DigitalSignatureTrustCo.GlobalCA1.pem , 1174
Vmime.NET/Converter/RootCertificates/DigitalSignatureTrustCo.GlobalCA3.pem , 1174
Vmime.NET/Converter/RootCertificates/DSTACESCAX6.pem , 1484
Vmime.NET/Converter/RootCertificates/DSTRootCAX3.pem , 1220
Vmime.NET/Converter/RootCertificates/e-GuvenKokElektronikSertifikaHizmetSaglayicisi.pem , 1368
Vmime.NET/Converter/RootCertificates/EBGElektronikSertifikaHizmetSağlayıcısı.pem , 2140
Vmime.NET/Converter/RootCertificates/EC-ACC.pem , 1942
Vmime.NET/Converter/RootCertificates/EECertificationCentreRootCA.pem , 1476
Vmime.NET/Converter/RootCertificates/Entrust.netCertificationAuthority(2048).pem , 1530
Vmime.NET/Converter/RootCertificates/Entrust.netSecureServerCertificationAuthority.pem , 1768
Vmime.NET/Converter/RootCertificates/EntrustRootCertificationAuthority.pem , 1670
Vmime.NET/Converter/RootCertificates/ePKIRootCertificationAuthority.pem , 2066
Vmime.NET/Converter/RootCertificates/EquifaxSecureCA.pem , 1162
Vmime.NET/Converter/RootCertificates/EquifaxSecureeBusinessCA-1.pem , 948
Vmime.NET/Converter/RootCertificates/EquifaxSecureGlobaleBusinessCA-1.pem , 964
Vmime.NET/Converter/RootCertificates/FortiGateCA.pem , 1414
Vmime.NET/Converter/RootCertificates/GeoTrustExtendedValidationSSLCA.pem , 1686
Vmime.NET/Converter/RootCertificates/GeoTrustGlobalCA.pem , 1236
Vmime.NET/Converter/RootCertificates/GeoTrustGlobalCA2.pem , 1262
Vmime.NET/Converter/RootCertificates/GeoTrustPrimaryCertificationAuthority-G2.pem , 1006
Vmime.NET/Converter/RootCertificates/GeoTrustPrimaryCertificationAuthority-G3.pem , 1468
Vmime.NET/Converter/RootCertificates/GeoTrustPrimaryCertificationAuthority.pem , 1290
Vmime.NET/Converter/RootCertificates/GeoTrustSSLCA.pem , 1418
Vmime.NET/Converter/RootCertificates/GeoTrustUniversalCA.pem , 1966
Vmime.NET/Converter/RootCertificates/GeoTrustUniversalCA2.pem , 1970
Vmime.NET/Converter/RootCertificates/GlobalChambersignRoot-2008.pem , 2626
Vmime.NET/Converter/RootCertificates/GlobalChambersignRoot.pem , 1744
Vmime.NET/Converter/RootCertificates/GlobalSignA.pem , 1250
Vmime.NET/Converter/RootCertificates/GlobalSignB.pem , 1376
Vmime.NET/Converter/RootCertificates/GlobalSignRootCA.pem , 1282
Vmime.NET/Converter/RootCertificates/GoDaddyClass2CA.pem , 1472
Vmime.NET/Converter/RootCertificates/GoDaddyRootCertificateAuthority-G2.pem , 1390
Vmime.NET/Converter/RootCertificates/GoogleInternetAuthority.pem , 1010
Vmime.NET/Converter/RootCertificates/GoogleInternetAuthorityG2.pem , 1476
Vmime.NET/Converter/RootCertificates/GTECyberTrustGlobalRoot.pem , 890
Vmime.NET/Converter/RootCertificates/HellenicAcademicandResearchInstitutionsRootCA2011.pem , 1538
Vmime.NET/Converter/RootCertificates/HongkongPostRootCA1.pem , 1188
Vmime.NET/Converter/RootCertificates/http---www.valicert.com-A.pem , 1084
Vmime.NET/Converter/RootCertificates/http---www.valicert.com-B.pem , 1084
Vmime.NET/Converter/RootCertificates/http---www.valicert.com-C.pem , 1084
Vmime.NET/Converter/RootCertificates/IGC-A.pem , 1476
Vmime.NET/Converter/RootCertificates/Izenpe.pem , 2156
Vmime.NET/Converter/RootCertificates/Juur-SK.pem , 1790
Vmime.NET/Converter/RootCertificates/Microsece-SzignoRootCA.pem , 2758
Vmime.NET/Converter/RootCertificates/Microsece-SzignoRootCA2009.pem , 1484
Vmime.NET/Converter/RootCertificates/NetLockArany(ClassGold)Főtanúsítvány.pem , 1500
Vmime.NET/Converter/RootCertificates/NetLockExpressz(ClassC)Tanusitvanykiado.pem , 1934
Vmime.NET/Converter/RootCertificates/NetLockKozjegyzoi(ClassA)Tanusitvanykiado.pem , 2346
Vmime.NET/Converter/RootCertificates/NetLockMinositettKozjegyzoi(ClassQA)Tanusitvanykiado.pem , 2462
Vmime.NET/Converter/RootCertificates/NetLockUzleti(ClassB)Tanusitvanykiado.pem , 1926
Vmime.NET/Converter/RootCertificates/NetworkSolutionsCertificateAuthority.pem , 1434
Vmime.NET/Converter/RootCertificates/OISTEWISeKeyGlobalRootGACA.pem , 1452
Vmime.NET/Converter/RootCertificates/PositiveSSLCA2.pem , 1786
Vmime.NET/Converter/RootCertificates/PSCProcert.pem , 3414
Vmime.NET/Converter/RootCertificates/QuoVadisRootCA2.pem , 2074
Vmime.NET/Converter/RootCertificates/QuoVadisRootCA3.pem , 2392
Vmime.NET/Converter/RootCertificates/QuoVadisRootCertificationAuthority.pem , 2112
Vmime.NET/Converter/RootCertificates/RapidSSLCA.pem , 1414
Vmime.NET/Converter/RootCertificates/RootCAGeneralitatValenciana.pem , 2366
Vmime.NET/Converter/RootCertificates/RSASecurity2048v3.pem , 1254
Vmime.NET/Converter/RootCertificates/S-TRUSTAuthenticationandEncryptionRootCA2005-PN.pem , 1640
Vmime.NET/Converter/RootCertificates/SecureCertificateServices.pem , 1558
Vmime.NET/Converter/RootCertificates/SecureGlobalCA.pem , 1376
Vmime.NET/Converter/RootCertificates/SecureSignRootCA11.pem , 1270
Vmime.NET/Converter/RootCertificates/SecureTrustCA.pem , 1372
Vmime.NET/Converter/RootCertificates/SecurityCommunicationEVRootCA1.pem , 1290
Vmime.NET/Converter/RootCertificates/SecurityCommunicationRootCA.pem , 1244
Vmime.NET/Converter/RootCertificates/SecurityCommunicationRootCA2.pem , 1282
Vmime.NET/Converter/RootCertificates/SoneraClass1CA.pem , 1162
Vmime.NET/Converter/RootCertificates/SoneraClass2CA.pem , 1162
Vmime.NET/Converter/RootCertificates/StaatderNederlandenRootCA-G2.pem , 2102
Vmime.NET/Converter/RootCertificates/StaatderNederlandenRootCA.pem , 1376
Vmime.NET/Converter/RootCertificates/StarfieldClass2CA.pem , 1492
Vmime.NET/Converter/RootCertificates/StarfieldRootCertificateAuthority-G2.pem , 1422
Vmime.NET/Converter/RootCertificates/StarfieldSecureCertificationAuthority.pem , 1834
Vmime.NET/Converter/RootCertificates/StarfieldServicesRootCertificateAuthority-G2.pem , 1448
Vmime.NET/Converter/RootCertificates/StartComCertificationAuthorityA.pem , 2804
Vmime.NET/Converter/RootCertificates/StartComCertificationAuthorityB.pem , 2714
Vmime.NET/Converter/RootCertificates/StartComCertificationAuthorityG2.pem , 1958
Vmime.NET/Converter/RootCertificates/SwisscomRootCA1.pem , 2124
Vmime.NET/Converter/RootCertificates/SwisscomRootCA2.pem , 2124
Vmime.NET/Converter/RootCertificates/SwisscomRootEVCA2.pem , 2132
Vmime.NET/Converter/RootCertificates/SwissSignGoldCA-G2.pem , 2078
Vmime.NET/Converter/RootCertificates/SwissSignPlatinumCA-G2.pem , 2090
Vmime.NET/Converter/RootCertificates/SwissSignSilverCA-G2.pem , 2082
Vmime.NET/Converter/RootCertificates/T-TeleSecGlobalRootClass3.pem , 1390
Vmime.NET/Converter/RootCertificates/TaiwanGRCA.pem , 1980
Vmime.NET/Converter/RootCertificates/TCTrustCenterClass2CAII.pem , 1706
Vmime.NET/Converter/RootCertificates/TCTrustCenterClass3CAII.pem , 1706
Vmime.NET/Converter/RootCertificates/TCTrustCenterUniversalCAI.pem , 1422
Vmime.NET/Converter/RootCertificates/TCTrustCenterUniversalCAIII.pem , 1430
Vmime.NET/Converter/RootCertificates/TDCInternetRootCA.pem , 1530
Vmime.NET/Converter/RootCertificates/TDCOCESCA.pem , 1860
最多只能显示150条信息!
没有账号? 忘记密码?

社交账号快速登录