You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用C++ Poco库发送Gmail邮件出现SMTP异常该如何解决

问题解决方法
  • 修正SMTP连接配置:Gmail SMTP服务不支持无加密的默认25端口访问,必须使用加密连接,对应端口为465(隐式SSL)或587(STARTTLS)。你当前使用的SMTPClientSession仅支持非加密通信,需要替换为SecureSMTPClientSession,同时补充SSL上下文初始化逻辑。
  • 调整谷歌账号验证逻辑:谷歌已禁止使用账号主密码直接登录SMTP服务,你需要先为谷歌账号开启两步验证,再生成应用专用密码,将代码中Password变量替换为该专用密码即可。
  • 调整编译参数:加密通信依赖Poco的NetSSL组件,编译命令需要新增-lPocoNetSSL链接选项。

修改后可运行的代码示例

// 编译命令:g++ -Wall -O3 Email.cc -lPocoNet -lPocoNetSSL -lPocoFoundation -lPocoUtil -o Email && ./Email
#include <cstdlib>
#include <iostream>
#include <Poco/Net/SecureSMTPClientSession.h>
#include <Poco/Net/MailMessage.h>
#include <Poco/Net/SSLManager.h>
#include <Poco/Net/AcceptCertificateHandler.h>
#include <Poco/Net/PrivateKeyPassphraseHandler.h>
#include <Poco/SharedPtr.h>
#include <string>

using namespace Poco::Net;
using namespace Poco;

int main(int argc, char **argv)
{
    std::string Username = "your-email@gmail.com";
    std::string Password = "生成的应用专用密码";

    std::string Receiver = "receiver@gmail.com";
    std::string Name = "Charles";

    std::string Subject = "Hello!";
    std::string Content = "TEXT OF THE EMAIL";

    try
    {
        // 初始化SSL上下文,信任服务端证书
        SharedPtr<InvalidCertificateHandler> pCertHandler = new AcceptCertificateHandler(false);
        Context::Ptr pContext = new Context(Context::TLS_CLIENT_USE, "", "", "", Context::VERIFY_RELAXED, 9, true, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
        SSLManager::instance().initializeClient(0, pCertHandler, pContext);

        MailMessage msg;
        msg.addRecipient(MailRecipient(MailRecipient::PRIMARY_RECIPIENT, Receiver, Name));
        msg.setSender(Username);
        msg.setSubject(Subject);
        msg.setContent(Content);

        // 使用加密会话连接465端口
        SecureSMTPClientSession smtp("smtp.gmail.com", 465);
        smtp.login();
        smtp.login(SMTPClientSession::AUTH_LOGIN, Username, Password);
        smtp.sendMessage(msg);
        smtp.close();
        std::cerr << "Sent mail successfully!" << std::endl;
    }
    catch (std::exception &e)
    {
        std::cerr << "Failed to send mail: " << e.what() << std::endl;
        return EXIT_FAILURE;
    }

    return EXIT_SUCCESS;
}

内容的提问来源于stack exchange,提问作者Carlos López Martínez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 08:48:00