php - 如何创建雅虎 smtp 服务器的套接字?

标签 php sockets email ssl phpmailer

问题是我想使用 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/

相关文章:

javascript - 如何在强制重新加载时替换页面内容?

php - Twitter api 1.1 的 Oauth header 问题

c++ - ESP32和Kotlin服务器之间的套接字延迟不一致

linux - 在 Linux 上使用 VB.net 的 Windows TCP 套接字连接

c - 如何获取与 TCP 套接字关联的接口(interface)名称/索引?

PhpMailer - 无法向大量订阅者发送新闻通讯

java - 尝试连接到本地 SMTP 服务器时 Camel 出现连接异常

php - 在 MySQL 中选择部分列标题

php - 通过环境提供数据库凭据而不是硬编码

email - Mandrill 和 MailChimp 的 SPF 配置?