为什么在220 2.0.0 Start TLS之后没有显示任何行?

时间:2014-04-26 17:00:13

标签: php ssl smtp

以下是代码:

$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但结果相同!!

2 个答案:

答案 0 :(得分:2)

发送STARTTLS后,通信进入加密模式,这就是没有其他未加密命令工作的原因。您可能不想陷入加密邮件的困境 - 如果您只想发送邮件,可以使用PHPMailer

https://github.com/Synchro/PHPMailer

答案 1 :(得分:0)

如果您想自己重建现有功能,请阅读文档或已实现此功能的库,不要猜测并询问它是否有效。 RFC 5321中描述了SMTP,RFC3207中描述了STARTTLS的行为。

只是一些提示:在收到STARTTLS的响应之后和发送任何其他命令之前,您需要进行TLS升级。此外,无法保证对EHLO的响应正好是5行。