在C++中发送电子邮件:库与代码示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在C++中发送电子邮件:库概览与实践示例



发送电子邮件是服务器和桌面应用程序中的标准任务之一。尽管C++没有内置对邮件协议的支持,但存在几个成熟的库,允许您将电子邮件发送(包括附件和TLS/SSL加密)集成到您的项目中。在本文中,我们将探讨三种主要方法:使用libcurl、VMime库和POCO C++ Libraries。



1. 使用libcurl发送电子邮件



libcurl是一个强大的跨平台数据传输库,支持多种协议,包括SMTP、SMTPS和带STARTTLS的SMTP。它是cURL项目的一部分,几乎适用于所有操作系统。



安装libcurl

在Ubuntu/Debian上:

sudo apt-get install libcurl4-openssl-dev

在macOS上(通过Homebrew):

brew install curl

在Windows上,您可以下载预编译的DLL或通过vcpkg编译。



示例:无附件的简单邮件

以下代码连接到SMTP服务器(带SSL的Gmail SMTP),进行身份验证并发送文本邮件。

#include <iostream>#include <string>#include <curl/curl.h>

int main() { CURL *curl = curl_easy_init(); if (!curl) return 1;

// Gmail SMTP 设置 curl_easy_setopt(curl, CURLOPT_URL, "smtps://smtp.gmail.com:465"); curl_easy_setopt(curl, CURLOPT_USERNAME, "您的_email@gmail.com"); curl_easy_setopt(curl, CURLOPT_PASSWORD, "您的_应用密码");

// 邮件数据 const char *payload_text = "To: recipient@example.com\\r" "From: 您的_email@gmail.com\\r" "Subject: 来自C++的测试邮件\\r" "\\r" "你好!这封邮件是通过libcurl发送的。\\r";

curl_easy_setopt(curl, CURLOPT_MAIL_FROM, "您的_email@gmail.com"); struct curl_slist *recipients = NULL; recipients = curl_slist_append(recipients, "recipient@example.com"); curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients); curl_easy_setopt(curl, CURLOPT_READDATA, payload_text);

// 发送 CURLcode res = curl_easy_perform(curl); if (res != CURLE_OK) std::cerr << "错误: " << curl_easy_strerror(res) << std::endl;

curl_slist_free_all(recipients); curl_easy_cleanup(curl); return 0;}


libcurl的特点

  • 支持SMTP、SMTPS(SSL/TLS)和STARTTLS。
  • 可通过MIME格式(手动或使用curl_mime)发送附件。
  • 底层控制——手动构建邮件头和正文。
  • 优秀的文档和社区支持。


2. VMime库



VMime是一个专门用于处理电子邮件的C++库。它提供了用于创建、解析和发送消息的高级API,支持MIME、附件和所有现代邮件协议。



安装VMime

建议使用CMake从源代码编译:

git clone https://github.com/kisli/vmime.gitcd vmimemkdir build && cd buildcmake .. -DVMIME_BUILD_SAMPLES=ONmake -j4sudo make install

使用SSL需要libgsasl和libssl-dev库。



示例:发送带附件的邮件

#include <vmime/vmime.hpp>#include <iostream>

int main() { try { // 创建会话 vmime::shared_ptr<vmime::net::session> session = vmime::net::session::create();

// 配置传输(带SSL的SMTP) vmime::shared_ptr<vmime::net::transport> trans

推荐