问题是我想使用 stream_socket_client
连接到 yahoo mails 的 smtp 服务器.
$host = 'smtp.mail.yahoo.com';
$port = 587;
$errno = 0;
$errstr = '';
$smtp_conn = stream_socket_client(
'tls://'.$host . ":" . $port,
$errno,
$errstr,
30
);
它给出了以下错误
Warning: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages: error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number in C:\xampp\htdocs\index.php on line 53
我首先使用phpMailer,它工作得很好,但我想自己做。
如何解决这个问题?谢谢。
最佳答案
端口 587(提交)不用于直接 TLS 连接,但您需要执行普通连接,读取 SMTP 欢迎,发送 EHLO 并读取响应,然后发出 STARTTLS 命令并读取响应。只有这样(并且只有在成功响应 STARTTLS 后),您才能将现有套接字升级到 TLS。使用 Perl 工具 swaks,您可以看到对话框:
=== Trying smtp.mail.yahoo.com:587...
=== Connected to smtp.mail.yahoo.com.
<- 220 smtp.mail.yahoo.com ESMTP ready
-> EHLO my.hostname
<- 250-smtp.mail.yahoo.com
<- 250-PIPELINING
<- 250-SIZE 41697280
<- 250-8 BITMIME
<- 250 STARTTLS
-> STARTTLS
<- 220 2.0.0 Start TLS
=== TLS started with cipher TLSv1:RC4-SHA:128
=== TLS no local certificate set
=== TLS peer DN="/C=US/ST=CA/L=Sunnyvale/O=Yahoo! Inc./OU=Yahoo Mail/CN=smtp.mail.yahoo.com"
如果您想进行直接 SSL 连接,则必须使用端口 465 (smtps)。
关于php - 如何创建雅虎 smtp 服务器的套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23312635/