как создать сокет для smtp-сервера yahoo? [дубликат]


На этот вопрос уже есть ответ здесь:

Проблема в том, что я хочу подключиться к smtp-серверу yahoo mails с помощью stream_socket_client.
$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:xampphtdocsindex.php on line 53

Сначала я использовал phpMailer, и это сработало просто отлично, но я хочу сделать это сам.

Как я могу решить эту проблему? Спасибо.

1 3

1 ответ:

Порт 587 (submission) не используется для прямого 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).