其他分享
首页 > 其他分享> > c – Poco在SMTPClientSession.login之后停止

c – Poco在SMTPClientSession.login之后停止

作者:互联网

我刚开始使用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() << "-";
}

当我进入调试器时,它运行正常,直到它到达sess.login然后突然表示我在代码中的小条消失但程序继续运行(我没有经验足以知道这意味着什么).我投入的cout内容实际上都没有打印,调试器只是超过了那条线,但没有显示出来.过了一会儿就出现了:

terminate called throwing an exception

发生什么了?

解决方法:

您正在尝试使用SMTP over TLS(传递给SocketAddress的端口465).在关注(2)您的目标:发送电子邮件之前,您必须在POCO中学习(1)TLS和证书处理.

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

我认为你的代码只是挂在TLS握手上,因为它不知道该怎么做.

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

>将代码放在try / catch块中. POCO使用例外.
>将StreamSocket替换为SecureStreamSocket.
>正确初始化SecureStreamSocket的最简单方法是通过Application类.请参阅Applications幻灯片和Util / samples / SampleApp / src / SampleApp.cpp.
>有关如何正确告知应用程序使用哪些证书,请参阅SSLManager的文档.
>不要为login()方法指定主机名.主机名是可选的,应该是客户端主机名,而不是服务器(请参阅SMTP RFC).
>记得实际发送消息!你的代码没有发送它:-)

好的,现在是正在运行的代码.我把第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)

标签:c,email,poco-libraries
来源: https://codeday.me/bug/20191002/1844598.html