как создать сокет для 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 ответ:
Порт 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).