开发者社区> 会影> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

使用vmime收取邮件

简介: vmime对邮件格式和邮件协议做了很好的封装,使用起来还是非常方便的。 vmime对于邮件协议都封装在vmime::net名字空间中,主要要用到的对象,有: vmime::net::session,主要用于维护和服务器之间的连接 vmime::net::store,表示一个邮件存储,这是一个基
+关注继续查看

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 #退出,服务器执行删除操作

转载自:https://coolex.info/blog/108.html

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
netty案例,netty4.1中级拓展篇十《Netty接收发送多种协议消息类型的通信处理方案》
在这个案例里我们模拟了;demo01、demo02、demo03三组消息处理handler,他们都统一继承抽象类Packet,并实现里面的getCommand方法。另外可以在这个抽象类中加入一些其他属性,包括;版本、校验、加密等,可以更加方便的用于处理各类通用非业务属性逻辑行为。
186 0
电子邮件加密:PGP 和S/MIME加密的区别
PGP加密和S/MIME加密都被用于电子邮件加密和验证,但二者在多个方面存在差异。
1782 0
button按钮提交form表单的js方法不要使用关键字login
    在使用button按钮提交form表单时,js方法不要使用关键字login,否则你会遇到莫名其妙的警告而无法正常执行!     js代码如下:         function login(){     var username=document.
1059 0
vim的配置:自己修改.vimrc文件,写自己风格的配置
windows下的gvim配置: 1.如果win下的gvim在保存并退出(:wq或ZZ)的时候,提示说无法写入默默路径下的_viminfo文件,那么,我遇到的情况是自己的HOME路径不存在。默认会在HOME路径中的_viminfo中写入。
1054 0
使用CDONTS发送邮件
set myMail=CreateObject("CDONTS.NewMail") myMail.SetLocalIDS(65001) myMail.From=txtMailFrom myMail.
626 0
+关注
59
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载