与Poco Net一起发送电子邮件时停止

时间:2016-02-24 12:11:42

标签: c++ smtp poco-libraries

我正在尝试使用带有此代码的Poco Net库发送电子邮件(我的凭据显然是随意的):

void send_email() {
//   Poco::Net::SMTPClientSession session("localhost", 465);
  const std::string& smtp_host {"mail.example.com"};
  const std::string& smtp_user {"marinos@example.com"};
  const std::string& smtp_passwd {"myPassword"};
  std::string to = "marinos@example.com";
  std::string from = "marinos@example.com";
  std::string subject = "Your first e-mail message sent using Poco Libraries";
  subject = Poco::Net::MailMessage::encodeWord(subject, "UTF-8");
  std::string content = "Well done! You've successfully sent your first message using Poco SMTPClientSession";
  Poco::Net::MailMessage message;
  message.setSender(from);
message.addRecipient(Poco::Net::MailRecipient{Poco::Net::MailRecipient::PRIMARY_RECIPIENT, to});
  message.setSubject(subject);
  message.setContentType("text/plain; charset=UTF-8");
  message.setContent(content, Poco::Net::MailMessage::ENCODING_8BIT);
  try {
    Poco::Net::SMTPClientSession session(smtp_host, 465);
    session.open(); // this is where it halts
    try {
      session.login(Poco::Net::SMTPClientSession::AUTH_LOGIN, smtp_user, smtp_passwd);
      session.sendMessage(message);
      std::cout << "Message successfully sent" << std::endl;
      session.close();
    } catch (Poco::Net::SMTPException& e) {
      std::cerr << e.displayText() << std::endl;
      session.close();
    }
  } catch (Poco::Net::NetException& e) {
    std::cerr << e.displayText() << std::endl;
  }
}

我的程序暂停了。我使用调试器来查找问题,并且在调用session.open()时程序似乎停止了。我在这里做错了吗?

1 个答案:

答案 0 :(得分:1)

由于我不知道您的SMTP服务器的规格,我推测您可能会假设使用SMTPS而不是普通SMTP,因为端口465是SMTPS的默认端口(根据Wikipedia)。我猜这个程序在SSL握手期间停止了。通过查看Poco documentation,我发现存在Poco::Net::SMTPClientSession的SSL版本。因此,您应该尝试使用SecureSMTPClientSession。检查您的邮件服务器是否需要START_TLS,在这种情况下,我猜您应该另外调用bool startTLS()