以下是代码:
$fp = stream_socket_client("smtp.mail.yahoo.com:587", $errno, $errstr, 10);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
fwrite($fp, "EHLO my.hostname\r\n");
echo fgets($fp, 1024).'<br>';
echo fgets($fp, 1024).'<br>';
echo fgets($fp, 1024).'<br>';
echo fgets($fp, 1024).'<br>';
echo fgets($fp, 1024).'<br>';
echo fgets($fp, 1024).'<br>';
fwrite($fp, "STARTTLS\r\n");
fwrite($fp, "EHLO my.hostname\r\n");
echo fgets($fp, 1024).'<br>';
echo fgets($fp, 101024).'<br>';
}
问题是,当我在浏览器中运行时,我得到这些:
220 smtp.mail.yahoo.com ESMTP ready
250-smtp.mail.yahoo.com
250-PIPELINING
250-SIZE 41697280
250-8 BITMIME
250 STARTTLS
220 2.0.0 Start TLS
那么为什么&#34; 220 2.0.0之后的行开始TLS&#34;不显示?这个代码有什么问题或什么?
还有一件事,而不是最后一行中的fwrite($fp, "EHLO my.hostname\r\n");
,我使用了其他命令,如QUIT
但结果相同!!
答案 0 :(得分:2)
发送STARTTLS后,通信进入加密模式,这就是没有其他未加密命令工作的原因。您可能不想陷入加密邮件的困境 - 如果您只想发送邮件,可以使用PHPMailer
答案 1 :(得分:0)
如果您想自己重建现有功能,请阅读文档或已实现此功能的库,不要猜测并询问它是否有效。 RFC 5321中描述了SMTP,RFC3207中描述了STARTTLS的行为。
只是一些提示:在收到STARTTLS的响应之后和发送任何其他命令之前,您需要进行TLS升级。此外,无法保证对EHLO的响应正好是5行。