Poco 在 SMTPClientSession.login 后停止

sin*_*inθ 2 c++ email poco-libraries

我刚刚开始使用 Poco 库并尝试创建一个电子邮件程序(我对此几乎一无所知)。以下是我的代码(除了我到目前为止遇到的问题之外,它可能还有其他问题,但我刚刚开始研究它)

    int main(int argc, char** argv)
{
    Poco::Net::SocketAddress add("smtp.gmail.com:465");
    Poco::Net::StreamSocket sock(add);
    Poco::Net::SMTPClientSession sess(sock);
    std::cout << "-";
    sess.login(
            "gmail.com",
            Poco::Net::SMTPClientSession::AUTH_LOGIN,
            "----",
            "----"
    );
    Poco::Net::MailMessage msg;
    Poco::Net::MailRecipient resp(Poco::Net::MailRecipient::PRIMARY_RECIPIENT,"michaelrgoldfine@gmail.com");
    msg.addRecipient(resp);
    std::string content("HELP SOS");
    msg.encodeWord(content);
    std::cout << msg.getContent() << "-";
}
Run Code Online (Sandbox Code Playgroud)

当我进入调试器时,它运行良好,直到到达 sess.login 然后突然代表我在代码中的小条消失了,但程序继续运行(我没有足够的经验知道这意味着什么)。我放入的 cout 内容实际上都没有打印出来,调试器只是越过了该行,但没有任何显示。过了一会儿,出现了这样的情况:

terminate called throwing an exception
Run Code Online (Sandbox Code Playgroud)

发生什么了?

mar*_*o.m 5

您正在尝试使用基于 TLS 的 SMTP(端口 465 传递到SocketAddress)。您必须一次性学习 (1) POCO 中的 TLS 和证书处理,然后再专注于 (2) 您的目标:发送电子邮件。

我建议从更简单的例子开始学习 POCO。samples您可以在POCO 源代码的各个目录中找到示例代码。

我认为你的代码只是挂在 TLS 握手上,因为它不知道要做什么。

在查看解决方案之前,您应该进行以下修复:

  1. 将您的代码放在一个try/catch块中。POCO 使用异常。
  2. StreamSocket用。。。来代替SecureStreamSocket
  3. 正确初始化的最简单方法SecureStreamSocket是通过Application类。请参阅应用幻灯片和Util/samples/SampleApp/src/SampleApp.cpp
  4. SSLManager有关如何正确告诉应用程序要使用哪些证书的信息,请参阅文档。
  5. 不要为该login()方法指定主机名。主机名是可选的,并且应该是客户端主机名,而不是服务器主机名(请参阅 SMTP RFC)。
  6. 记得实际发送消息!您的代码未发送:-)

好的,现在来运行代码。我将步骤 4 和 6 作为练习,但此代码至少会运行 TLS 握手,会告诉您它无法验证服务器的证书,如果您在终端上对证书问题回答“是”,它将失败SMTP 身份验证。

class MiniApp : public Poco::Util::Application {
    int main(const vector <string>& args) {
        try {
            Poco::Net::SocketAddress add("smtp.gmail.com:465");
            Poco::Net::SecureStreamSocket sock(add);
            Poco::Net::SMTPClientSession session(sock);
            session.login(Poco::Net::SMTPClientSession::AUTH_LOGIN, "user", "pw");
            Poco::Net::MailMessage msg;
            Poco::Net::MailRecipient recipient(Poco::Net::MailRecipient::PRIMARY_RECIPIENT,
                                    "michaelrgoldfine@gmail.com");
            msg.addRecipient(recipient);
            string content("HELP SOS");
            msg.encodeWord(content);
        } catch (Poco::Exception& e) {
            cout << "Error: " << e.displayText() << endl;
            return -1;
        }
        return 0;
    }
};

POCO_APP_MAIN(MiniApp)
Run Code Online (Sandbox Code Playgroud)