@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 管理员将其删除。
:)