我正在尝试使用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
答案 0 :(得分: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,因为它没有加密。
答案 1 :(得分:0)
问题在于我使用的端口(465),它是SMTP / SSL的端口,而不是纯文本SMTP。 切换到端口25,它不再挂起。