@pablo dot livardo:我认为您发现的问题是由客户端/服务器使用的加密方法之间的差异造成的。
端口 465 用于 SMTPS,服务器在收到您的连接后立即启动加密。 因此,您的代码将起作用。
端口 587 用于提交(MSA 或邮件提交代理),其工作原理类似于端口 25。 服务器接受您的连接,但不会激活加密。 如果你想要在端口 587 上进行加密连接,你必须在没有加密的情况下连接到它,你必须开始与服务器对话(使用 EHLO),然后你必须要求服务器使用 STARTTLS 命令启动加密连接。 服务器启动加密,现在您也可以启动客户端的加密。
简而言之,您不能使用
<?php $fp = fsockopen("tls://mail.example.com", 587, $errno, $errstr); ?>
但您可以使用
<?php $fp = stream_socket_client("mail.example.com:587", $errno, $errstr); ?>
在发送 STARTTLS 命令后,您可以启用加密
<?php stream_socket_enable_crypto($fp, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT); ?>
附注:我之前在这个页面上的笔记完全错误,所以我要求 php.net 管理员将其删除。
:)