如何创建socket到雅虎的smtp服务器?

时间:2014-04-26 15:01:13

标签: php sockets email ssl phpmailer

问题是我想使用stream_socket_client连接到雅虎邮箱的smtp服务器。

$host = 'smtp.mail.yahoo.com';
$port = 587;
$errno = 0;
$errstr = '';

$smtp_conn = stream_socket_client(
    'tls://'.$host . ":" . $port,
    $errno,
    $errstr,
    30
);

,它会出现以下错误

  

警告: stream_socket_client():SSL操作失败,代码为1. OpenSSL错误消息:错误:1408F10B:SSL例程:SSL3_GET_RECORD: C:\ xampp \ htdocs \中的版本号错误index.php 53

我首先使用了 phpMailer ,它运行得很好,但我想自己做。

我该如何解决这个问题?谢谢。

1 个答案:

答案 0 :(得分:2)

端口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)。