用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。

时间: 2024-10-07 08:29:37

用vmime收取邮件/解析邮件 教程的相关文章

vmime解析邮件

前文写了使用vmime库通过POP3协议收取邮件,继续写对邮件的解析. 解析邮件相对比较简单,需要将收取的邮件,重新从字符串转换成vmime::message格式,然后就可以获取到自己需要部分的内容了. 首先将vmime::string格式转换为vmime::message: vmime::utility::ref<vmime::message> mail = vmime::create<vmime::message>(); mail->parse(mailContent);

用photoshop绘制邮件盒图标教程

  用photoshop绘制邮件盒图标教程,每个部位都分析的很到位,设计师最重要的技能是审美和视觉传达,可以自己绘绘看 分类: PS入门教程 ps图标制作教程

mime-MIME邮件解析的问题!!!!急请教!

问题描述 MIME邮件解析的问题!!!!急请教! 我想问下,,邮件内容通过UE查看,明显看到其中包含text/plain和text/html两部分,通过outlook或其他查看邮件的软件查看邮件文件,主题内容只显示text/html中的内容.什么情况下,下载的.eml格式文件内容会同时包括text/plain和text/html两部分

把exchange中收到的邮件解析出来,并存入数据库或简单的显示出来

问题描述 现在要做一个东东,需要把exchange中收到的邮件解析出来,并存入数据库.当然关键是怎么从exchange中解析出来,比如说,把发送方.接收方.主题.时间.内容等读出来.请各位高手指点指点,给个方向,有具体例程更好. 解决方案 解决方案二:貌似点击收件箱之后一次性只返回发送方,接收方,主题,时间以及要显示的一封邮件内容,其他邮件的内容只能点一封请求一封饿解决方案三:ie内核webdavsearch请求邮件,返回xml数据,苹果html页面

如果解析邮件地址,有题 需求帮忙

问题描述 编写函数parseMailAddr,解析邮件地址,打印出protocol.username.domainname.publcstaticvoidparseMailUrl(StringmailUrl)例如:mailto://superman@giantstone.com,打印输出:protocol[mailto]username[superman]domainName[giantstone.com]以下是我编的publicclassCopyOfSalutonPublic{publicvo

现在只有不太熟练的C语言基础,要在一个月内用vc7编出一个带界面的邮件解析程序,该怎么办?

问题描述 现在真是急死了,看代码看得不是很懂,更别说写了.现在又要从C++开始学起吗:( 解决方案 解决方案二:支持MIME解析的开源代码应该很多.参照一下即可.还有一个简便的方式.在界面里内嵌一个Outlook对象.就OK了.解决方案三:自己解析的话看rfc1341不难,就是麻烦了点解决方案四:最实际的办法:网上下个例子,边改边学!解决方案五:连C语言基础都不太熟练的,要在一个月内做个带界面的邮件解析程序,我看没戏,除了抄,我看还是外包吧!解决方案六:外包我感兴趣,哈哈.解决方案七:自己写?不

java做收邮件时邮件内容中镶嵌的图片无法正常显示?

问题描述 下面是我解析邮件内容的方法publicvoidgetMailContent(Partpart)throwsMessagingException,IOException{StringcontentType=part.getContentType();intnameindex=contentType.indexOf("name");booleanconname=false;if(nameindex!=-1){conname=true;}if(part.isMimeType(&qu

c++或者C#如何监控本地邮箱的收发邮件和邮件的内容

问题描述 c++或者C#如何监控本地邮箱的收发邮件和邮件的内容 如何用C++或者C#做一个能够监控本地邮箱是否有收发的邮件 以及得到邮件内容小东西 给个大致的思路就可以了 有源码的可以拿来借鉴下,抱歉没有币 万分感谢 解决方案 一个是直接用pop协议去取,一个是用mapi从本地的邮箱客户端去取. 解决方案二: 这个如果不是邮箱所有者的话,就只能嗅探了,只有这一个方法 解决方案三: 先要看你这个客户端有什么实现,支持api查询不,先分析一下再找方法.

PHPMailer邮件类邮件发送

要注意的内容: 1. 邮件的字符集设置, $mail->CharSet = "GB2312";            // 这里指定字符集!在这里我只指定为GB2312因为这样Outlook能正常显示邮件主题,我尝试过设为utf-8但在Outlook下显示乱码. 2. 如果是发送html格式的邮件,那么记得也指定<meta ... charset=GB2312"> 3. 如果你想用它来群发邮件的话,记得修改包含文件函数,如: require("ph