@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 管理員將其移除。
:)