如何在 C++ 中使用 libcurl 发送电子邮件

How to send an email with libcurl in C++

我正在尝试使用 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),它是 SMTP/SSL 的端口,而不是纯文本 SMTP。 切换到端口25,它不再挂了。

在 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,因为它没有加密。