2

我刚开始使用 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

发生什么了?

4

2 回答 2

4

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

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

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

这些是您在查看解决方案之前应该做的修复:

  1. 将您的代码放在一个try/catch块中。POCO 使用异常。
  2. 替换StreamSocketSecureStreamSocket
  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)
于 2012-06-25T20:18:46.210 回答
2

是的,所以我在尝试使用 smtp.gmail.com 时遇到了 login()。这是与使其工作的 SSL 会话通信的摘录。

string host("smtp.gmail.com")
Poco::UInt16 port = 587;

SecureSMTPClientSession session(host, port);

session.open();

Poco::Net::initializeSSL();

SharedPtr<InvalidCertificateHandler> ptrHandler = new AcceptCertificateHandler(false);

Context::Ptr ptrContext = new Context(Context::CLIENT_USE, "", "", "", Context::VERIFY_RELAXED, 9, true, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");

SSLManager::instance().initializeClient(0, ptrHandler, ptrContext);

try
{
  // SSL
  session.login();
  if (session.startTLS(ptrContext))
  {
    session.login(SMTPClientSession::AUTH_LOGIN, "user@gmail.com", "yourpassword");
    session.sendMessage(message);
  }
  session.close();
  Poco::Net::uninitializeSSL();
}
catch (SMTPException &e)
{
  cout << e.message() << endl;
  session.close();
  Poco::Net::uninitializeSSL();
  return 0;
}

原始来源:

http://www.axistasoft.sg/tutorials/cpp/poco/item/sending-email-messages-using-smtp-protocol

于 2012-08-17T02:15:04.880 回答