如何使用C++代码实现Protonmail邮件发送?
C++ 发送ProtonMail 邮件可行实现方案
ProtonMail 原生端到端加密机制会拦截所有直连官方SMTP服务器的第三方请求,不存在直接用普通SMTP客户端连官方服务器发信的可能,目前只有两个可落地的实现路径,根据开发成本要求选择即可。
方案1:本地部署Proton Bridge 对接标准SMTP(推荐,开发成本最低)
这个方案不需要处理Proton专属的加密、认证逻辑,所有和官方服务的交互都由本地运行的Proton Bridge代理完成,只需要像对接普通SMTP服务一样写代码即可:
- 服务配置参数
- Bridge启动后会在本机暴露SMTP服务,默认地址为
127.0.0.1:1025,不需要直连外部Proton服务器 - 认证用的账号密码是Bridge内为第三方客户端生成的专用凭证,不要用网页端登录的主账号密码,否则会认证失败
- 生产环境部署时把Proton Bridge配置为系统后台服务,保持常驻运行即可
- Bridge启动后会在本机暴露SMTP服务,默认地址为
- 可用C++依赖库
- 无Qt依赖的轻量项目选
libsmtpclient,原生支持SMTP认证、TLS,对接本地服务完全够用 - 基于Qt开发的项目直接用Qt Network模块自带的SMTP相关接口即可,不需要额外引入第三方库
- 不想引入专用SMTP库的话直接用
libcurl也能实现SMTP发信,兼容性最好,几乎所有Linux/Windows开发环境都能直接适配
- 无Qt依赖的轻量项目选
方案2:直接对接Proton Open API(无需本地部署Bridge,开发成本高)
如果运行环境不能安装Proton Bridge,可以直接走官方公开的REST接口发信:
- 通信端口为HTTPS标准443端口,发信接口路径为
/mail/v4/messages - 依赖库只需要选一个成熟的C++ HTTP客户端即可,比如
libcurl、cpp-httplib,另外需要链接OpenSSL库处理PGP加解密逻辑 - 注意事项:这个方案需要自行实现SRP登录认证、会话token管理、邮件内容PGP加密签名全流程逻辑,官方没有提供C++版本的官方SDK,所有逻辑需要对照接口规则实现,开发量是方案1的5倍以上,非特殊需求不建议选。
最小可运行示例(基于libcurl + Proton Bridge)
#include <curl/curl.h> #include <string> #include <cstring> size_t readMailContent(void *ptr, size_t size, size_t nmemb, void *userdata) { std::string *content = static_cast<std::string*>(userdata); size_t copyLen = std::min(size * nmemb, content->size()); if (copyLen > 0) { memcpy(ptr, content->c_str(), copyLen); content->erase(0, copyLen); } return copyLen; } int main() { curl_global_init(CURL_GLOBAL_DEFAULT); CURL *curl = curl_easy_init(); if (!curl) { curl_global_cleanup(); return -1; } // 配置本地Proton Bridge SMTP地址 curl_easy_setopt(curl, CURLOPT_URL, "smtp://127.0.0.1:1025"); // 替换为Bridge生成的专用账号密码 curl_easy_setopt(curl, CURLOPT_USERNAME, "your_bridge_smtp_account"); curl_easy_setopt(curl, CURLOPT_PASSWORD, "your_bridge_smtp_password"); // 配置发件人、收件人 curl_easy_setopt(curl, CURLOPT_MAIL_FROM, "<your_mail@proton.me>"); curl_slist *recipients = nullptr; recipients = curl_slist_append(recipients, "<recipient@example.com>"); curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients); // 构造符合SMTP规范的邮件内容,必须带标准邮件头 std::string mailData = "From: your_mail@proton.me\r\n" "To: recipient@example.com\r\n" "Subject: Test Mail From C++\r\n" "\r\n" "This is a test email sent by C++ client with Proton Bridge.\r\n"; curl_easy_setopt(curl, CURLOPT_READFUNCTION, readMailContent); curl_easy_setopt(curl, CURLOPT_READDATA, &mailData); curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); // 本地Bridge自签证书可根据需求调整校验规则 curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); CURLcode res = curl_easy_perform(curl); int ret = res == CURLE_OK ? 0 : -1; curl_slist_free_all(recipients); curl_easy_cleanup(curl); curl_global_cleanup(); return ret; }
编译命令参考:g++ send_proton_mail.cpp -o send_mail -lcurl
运行前确保本地Proton Bridge处于登录运行状态即可正常发信。
内容的提问来源于stack exchange,提问作者Lordoftherings
相关产品推荐
相关产品推荐

