【问题标题】:Why anything does not show the lines after 220 2.0.0 Start TLS?为什么在 220 2.0.0 Start TLS 之后没有显示行?
【发布时间】:2014-04-26 17:00:13
【问题描述】:

代码如下:

$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   

那么为什么“220 2.0.0 Start TLS”之后的行没有显示?代码有问题还是什么?

还有一件事,而不是最后一行的fwrite($fp, "EHLO my.hostname\r\n");,我使用了其他命令,如QUIT,但结果相同!!

【问题讨论】:

  • “那么为什么“220 2.0.0 Start TLS”之后的行不显示? - 你启动了 TLS。如果您需要测试连接,请尝试openssl s_client -starttls smtp -connect smtp.mail.yahoo.com:587。浏览器无法为您提供任何有用的信息,因为它不理解STARTTLS 命令。

标签: php ssl smtp


【解决方案1】:

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

https://github.com/Synchro/PHPMailer

【讨论】:

  • 感谢您的提示,我想我知道了;)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2019-07-03
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 2020-06-13
    • 1970-01-01
    相关资源
    最近更新 更多