使用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
相关产品推荐
相关产品推荐

