
本周接了个需求,需要从客户的邮箱服务器拉取邮件,并使用AI对邮件进行分类,内行人都知道,这难不倒我们……
本周不重复造轮子的原则,到网上一顿检索,最终VMime进行决赛圈。那么VM到底是什么样的呢?
一 VMime概述VMime是一个专注于电子邮件协议的实现与处理的类库,它支持IMAP、POP3、SMTP等核心协议,适用于需要深度集成邮件功能的应用场景。还有一点需要值得关注的是它有着自身独特的优势,如:
平台兼容性:可在Linux、Windows、MAC系统上编译及运行。良好的协议支持:如POP、IMAP、SMTP邮件协议,且支持SSL/TLS加密传输。数据模型支持:提供对MIME消息格式(附件等)的解析与生成。开源协议:LGPL协议,允许在开源和商业项目中免费使用。PS:本文底部提供VMime开发指导手册
二 核心功能使用与代码演示1. 在程序中使用VMime
首先,需要确保已经对VMime进行了正确的编译和安装,如果要将VMime应用于你的项目中,需要对头文件进行正确的引用。头文件引用如下:
#include <vmime/vmime.hpp>如果没有正确安装的话,查看VMime开发指导手册第1.3章节。
2. 使用VMime连接SMTP服务器发送邮件
主要是使用VMime中的vmime::net::transport管理协议链接并使用相应的方法对认证规则进行设置。对应的代码如下:
#include <vmime/vmime.hpp>int main() { // 初始化VMime库 vmime::platform::setHandler<vmime::platforms::posix::posixHandler>(); // 创建会话并配置SMTP vmime::shared_ptr<vmime::net::session> session = vmime::net::session::create(); vmime::utility::url url("smtp://smtp.gmail.com:587"); vmime::shared_ptr<vmime::net::transport> tr = session->getTransport(url); // 设置TLS与认证 tr->setProperty("connection.tls", true); tr->setProperty("auth.username", "user@gmail.com"); tr->setProperty("auth.password", "your-password"); tr->setCertificateVerifier(vmime::make_shared<vmime::security::cert::defaultCertificateVerifier>()); // 构建邮件内容 vmime::messageBuilder mb; mb.setSubject(vmime::text("VMime测试邮件")); mb.setSender(vmime::mailbox("sender@example.com")); mb.getRecipients().appendAddress(vmime::mailbox("receiver@example.com")); mb.setTextContent("这是一封通过VMime发送的测试邮件。"); // 发送邮件 tr->connect(); tr->send(mb.construct()); tr->disconnect(); return 0;}如上就已经轻松完成了SMTP邮件服务器的连接和邮件内容的发送。
3. 使用VMime对邮件进行接收
这里以IMAP协议为例,代码示例如下:
vmime::shared_ptr<vmime::net::store> store = session->getStore(vmime::utility::url("imap://imap.gmail.com"));store->setProperty("auth.username", "user@gmail.com");store->setProperty("auth.password", "your-password");store->connect();vmime::shared_ptr<vmime::net::folder> inbox = store->getDefaultFolder();inbox->open(vmime::net::folder::MODE_READ_ONLY);std::vector<vmime::shared_ptr<vmime::net::message>> messages;inbox->fetchMessages(messages);for (auto msg : messages) { vmime::shared_ptr<vmime::message> parsedMsg = msg->parse(); std::cout << "主题:" << parsedMsg->getSubject().generate() << std::endl;}三 高级功能使用与代码演示1. 使用VMime处理附件
// 添加附件vmime::messageBuilder mb;mb.attach(vmime::make_shared<vmime::fileAttachment>( "test.pdf", vmime::mediaType("application/pdf"), vmime::platform::getHandler()->getFileProvider()->queryFile("/path/to/test.pdf")));2. 使用VMime进行MIME协议解析
vmime::shared_ptr<vmime::message> msg = vmime::messageParser::parse(data);for (size_t i = 0; i < msg->getBodyPartCount(); ++i) { vmime::shared_ptr<vmime::bodyPart> part = msg->getBodyPartAt(i); if (part->getBody()->getContentType().getType() == "text/plain") { std::string textContent = part->getBody()->getContent()->generate(); }}最后还有一点需要关注的就是VMime中也提供了异常处理类vmime::exception。主要用来处理网络超时以及协议处理等异常场景。
四 参考资料官网:https://www.vmime.org/