Есть скрипт для отправки мыло на php. Там нужно прописать смтп данные. Беру данные mail.ru При отправке пишет что нужно отправить через ssl. Меняю порт на 465 и письмо не отправляется. Должен ли я установить ssl сертификат на сервер чтоб мог отправить через данные протокол ?
http://test1.ru:443/ <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>400 Bad Request</title> </head><body> <h1>Bad Request</h1> <p>Your browser sent a request that this server could not understand.<br /> Reason: You're speaking plain HTTP to an SSL-enabled server port.<br /> Instead use the HTTPS scheme to access this URL, please.<br /> <blockquote>Hint: <a href="https://localhost/"><b>https://localhost/</b></a></blockquote></p> <hr> <address>Apache/2.2.22 (Win32) mod_ssl/2.2.22 OpenSSL/1.0.1c PHP/5.3.13 Server at localhost Port 443</address> </body></html> https://test1.ru:80/ При соединении с test1.ru:80 произошла ошибка. SSL получило запись, длина которой превышает максимально допустимую. Код ошибки: SSL_ERROR_RX_RECORD_TOO_LONG Скрип на денвере
Потому что протоколы не только портом и наличием сертификата отличаются. Надо чтобы скрипт понял, что ты от него хочешь.
Дело не в номере порта, а в том, что ты не шифруешь передаваемые данные. Основные шаги процедуры создания защищённого сеанса связи: клиент подключается к серверу, поддерживающему TLS, и запрашивает защищённое соединение; клиент предоставляет список поддерживаемых алгоритмов шифрования и хеш-функций; сервер выбирает из списка, предоставленного клиентом, наиболее надёжные алгоритмы среди тех, которые поддерживаются сервером, и сообщает о своём выборе клиенту; сервер отправляет клиенту цифровой сертификат для собственной аутентификации. Обычно цифровой сертификат содержит имя сервера, имя удостоверяющего центра сертификации и открытый ключ сервера; клиент может связаться с сервером доверенного центра сертификации и подтвердить аутентичность переданного сертификата до начала передачи данных; для генерации сеансового ключа для защищённого соединения клиент шифрует случайно сгенерированную цифровую последовательность открытым ключом сервера и посылает результат на сервер. Учитывая специфику алгоритма асимметричного шифрования, используемого для установления соединения, только сервер может расшифровать полученную последовательность, используя свой закрытый ключ. На этом заканчивается процедура подтверждения связи. Между клиентом и сервером установлено безопасное соединение, данные, передаваемые по нему, шифруются и расшифровываются с использованием ключа шифрования до тех пор, пока соединение не будет завершено. При возникновении ошибки на любом из вышеуказанных шагов подтверждение связи завершится с ошибкой и соединение не будет установлено.
PHP: <?phpinclude('smtp.php');$smtp_charset = 'koi8-r';$smtp_from = '';$subject = '';$socket=fsockopen($smtp_host, $smtp_port);echo fgets($socket);//посылаем EHLOfputs($socket, "EHLO $smtp_host\r\n");echo fgets($socket);echo fgets($socket);echo fgets($socket);echo fgets($socket);echo fgets($socket);//запрашиваем авторизациюfputs($socket, "AUTH LOGIN\r\n");echo fgets($socket);//логинfputs($socket, base64_encode($smtp_username) . "\r\n");echo fgets($socket);//парольfputs($socket, base64_encode($smtp_password) . "\r\n");echo fgets($socket);//от кого письмоfputs($socket, "MAIL FROM: <$smtp_username>\r\n");echo fgets($socket);//получательfputs($socket, "RCPT TO: <$mail_to>\r\n");echo fgets($socket);//команда DATA говорит серверу что сейчас начнем передавать письмоfputs($socket, "DATA\r\n");echo fgets($socket);//формируем письмо$headers='';//заголовок указывает куда отвечать на письмо$headers .= "Reply-To: \r\n";//версия mime$headers .= "MIME-Version: 1.0\r\n";//mime тип и кодировка$headers .= "Content-Type: text/html; charset=\"$smtp_charset\"\r\n";//следует указать 8бит для русских символов$headers .= "Content-Transfer-Encoding: base64\r\n";//поле от кого (можно вставить левые данные)$headers .= "From: \r\n";$headers .= "To: $mail_to <$mail_to>\r\n";$headers .= "Subject: =?koi8-r?B?" . base64_encode($subject) . "?=\r\n";$headers .= "X-Priority: 3\r\n\r\n";//сообщение$msg .= '';//отправляем письмо (обратите внимание на \r\n.\r\nfputs($socket, $headers. base64_encode($msg)."\r\n.\r\n");echo fgets($socket);/*письмо отправлено, лог ответов сервера выглядит так220 mail.ru ESMTP Thu, 07 Feb 2008 03:32:20 +0300250-mx34.mail.ru Hello smtp.mail.ru [217.8.236.128]250-SIZE 31457280250-8BITMIME250-AUTH PLAIN LOGIN250 PIPELINING334 VXNlcm5hbWU6334 UGFzc3dvcmQ6235 Authentication succeeded250 OK250 Accepted354 Enter message, ending with "." on a line by itself250 OK id=1JMuge-0006sO-00*/?> PHP: <?php$smtp_username = '';$smtp_port = '465';$smtp_host = 'smtp.mail.ru';$smtp_password = ''; $smtp_charset = 'koi8-r';?>
$socket=fsockopen('ssl://' . $smtp_host, $smtp_port); Вроде так было. Тему в раздел PHP надо перенести.
как минимум нужно чтобы пыха была собрана с openssl + openssl должен поддерживать тип шифрования(tls,ssl3 etc.) + должен поддерживать один из шифров, список которых предоставляет сервер если есть консоль - попробуй просто подключиться openssl s_client -crlf -connect server_name:465 и посмотреть пройдет ли коннект, шифры если что можно глянуть openssl ciphers -V а вообще в логе почтового демона оседают какие нить ошибки? ----------------------- про логи нагнал похоже, не увидел что через fsockopen конект идет, тогда в логе самого пхп может что нить подозрительное быть
Вариант M_script вроде должен работать , при коннекте выскакивает еррор Warning: fsockopen() [function.fsockopen]: unable to connect to ssl://smtp.mail.ru:465 (Unable to find the socket transport "ssl" - did you forget to enable it when you configured PHP?) Кажется я не подключил библиотеку в php.ini. Буду копать в эту сторону. Всем спасибо