【问题标题】:How to send an email with libcurl in C++如何在 C++ 中使用 libcurl 发送电子邮件
【发布时间】:2015-11-24 14:35:53
【问题描述】:

我正在尝试使用 libcurl 7.42.1 从 C++ 发送电子邮件。

我已经尝试过他们的示例程序 (http://curl.haxx.se/libcurl/c/smtp-mail.html),它可以构建、运行,但不起作用。

我尝试使用命令行 curl 来做同样的事情,但它表现出与 c++ 中的 libcurl 完全相同的行为(见下文)。 它挂了一段时间然后退出并出现错误(“响应读取失败”)。

我使用了 wireshark 来分析数据包交换,我可以看到,一旦 TCP 连接建立(SYN,SYN-ACK,ACK)我的端点不再发送任何数据包(它应该启动一个SMTP 会话)。

我做错了什么?

这是我使用的命令:

curl --url "smtp://smtp.mail.yahoo.com:465" --mail-from "test-curl" --mail-rcpt "bog2k3@gmail.com" --user "*****@yahoo.com:*****" --upload-file test.txt --verbose

【问题讨论】:

  • 我刚刚发现使用端口 465 是问题的一部分。该端口用于通过 SSL 的 SMTP,我试图使用纯文本 SMTP。我切换到 25 端口,现在我的端点终于可以与服务器进行对话了。
  • 问题是缺少您的 C++ 代码。请显示相关代码并说明确切的问题或错误。 “不起作用” 不是一个好的问题描述。另见How to create a Minimal, Complete, and Verifiable example
  • @jww,我说我使用了示例程序(我链接了它),然后我说命令行出现了完全相同的问题,然后我详细描述了。

标签: c++ curl


【解决方案1】:

在 SMTP 中,发送的第一条消息来自服务器,告诉客户端它已准备好。但是,您使用端口 465。所以我怀疑服务器使用的实际协议是 SMTPS,它基本上是一层 TLS 上的 SMPT,在 TLS 中它是客户端发起通信。这意味着服务器和客户端都等待另一方开始通话,直到一方超时。

修复应该很简单,只需指定 smtps 协议:

curl --url "smtps://smtp.mail.yahoo.com:465" --mail-from "test-curl" --mail-rcpt "bog2k3@gmail.com" --user "*****@yahoo.com:*****" --upload-file test.txt --verbose

相应的示例程序会在这里:

http://curl.haxx.se/libcurl/c/smtp-ssl.html

我真的不建议只在端口 25 上使用 SMTP,因为它没有加密。

【讨论】:

  • 是的,事情就是这样。我在没有手动指定端口的情况下切换到 SMTPS,现在一切正常。
【解决方案2】:

问题在于我使用的端口 (465),它是 SMTP/SSL 的端口,而不是纯文本 SMTP 的端口。 切换到 25 端口,它不再挂起。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 2012-04-27
    • 2012-05-17
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    相关资源
    最近更新 更多