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

How to send an email with libcurl in C++

本文关键字:libcurl 电子邮件 C++      更新时间:2023-10-16

我正试图使用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

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

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