Отправка письмо через SSL/TLS порт

Discussion in 'PHP' started by RRR_RRR, 26 Apr 2016.

  1. RRR_RRR

    RRR_RRR Member

    Joined:
    20 Jun 2012
    Messages:
    396
    Likes Received:
    35
    Reputations:
    0
    Есть скрипт для отправки мыло на php. Там нужно прописать смтп данные. Беру данные mail.ru
    При отправке пишет что нужно отправить через ssl.
    Меняю порт на 465 и письмо не отправляется. Должен ли я установить ssl сертификат на сервер чтоб мог отправить через данные протокол ?
     
  2. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
  3. RRR_RRR

    RRR_RRR Member

    Joined:
    20 Jun 2012
    Messages:
    396
    Likes Received:
    35
    Reputations:
    0

    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


    Скрип на денвере
     
  4. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Потому что протоколы не только портом и наличием сертификата отличаются. Надо чтобы скрипт понял, что ты от него хочешь.
     
    RRR_RRR likes this.
  5. RRR_RRR

    RRR_RRR Member

    Joined:
    20 Jun 2012
    Messages:
    396
    Likes Received:
    35
    Reputations:
    0
    поможет ли установка опен сервера ? а то денвер уже старенький
     
  6. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Не в сервере дело. Код отправки письма покажи.
     
  7. rct

    rct Active Member

    Joined:
    13 Jun 2015
    Messages:
    359
    Likes Received:
    107
    Reputations:
    7
    Дело не в номере порта, а в том, что ты не шифруешь передаваемые данные.

    Основные шаги процедуры создания защищённого сеанса связи:

    • клиент подключается к серверу, поддерживающему TLS, и запрашивает защищённое соединение;
    • клиент предоставляет список поддерживаемых алгоритмов шифрования и хеш-функций;
    • сервер выбирает из списка, предоставленного клиентом, наиболее надёжные алгоритмы среди тех, которые поддерживаются сервером, и сообщает о своём выборе клиенту;
    • сервер отправляет клиенту цифровой сертификат для собственной аутентификации. Обычно цифровой сертификат содержит имя сервера, имя удостоверяющего центра сертификации и открытый ключ сервера;
    • клиент может связаться с сервером доверенного центра сертификации и подтвердить аутентичность переданного сертификата до начала передачи данных;
    • для генерации сеансового ключа для защищённого соединения клиент шифрует случайно сгенерированную цифровую последовательность открытым ключом сервера и посылает результат на сервер. Учитывая специфику алгоритма асимметричного шифрования, используемого для установления соединения, только сервер может расшифровать полученную последовательность, используя свой закрытый ключ.
    На этом заканчивается процедура подтверждения связи. Между клиентом и сервером установлено безопасное соединение, данные, передаваемые по нему, шифруются и расшифровываются с использованием ключа шифрования до тех пор, пока соединение не будет завершено.

    При возникновении ошибки на любом из вышеуказанных шагов подтверждение связи завершится с ошибкой и соединение не будет установлено.
     
  8. RRR_RRR

    RRR_RRR Member

    Joined:
    20 Jun 2012
    Messages:
    396
    Likes Received:
    35
    Reputations:
    0
    PHP:
    <?php
    include('smtp.php');
    $smtp_charset 'koi8-r';
    $smtp_from '';
    $subject '';



    $socket=fsockopen($smtp_host$smtp_port);

    echo 
    fgets($socket);
    //посылаем EHLO
    fputs($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($socketbase64_encode($smtp_username) . "\r\n");
    echo 
    fgets($socket);
    //пароль
    fputs($socketbase64_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\n
    fputs($socket$headersbase64_encode($msg)."\r\n.\r\n");
    echo 
    fgets($socket);


    /*письмо отправлено, лог ответов сервера выглядит так
    220 mail.ru ESMTP Thu, 07 Feb 2008 03:32:20 +0300
    250-mx34.mail.ru Hello smtp.mail.ru [217.8.236.128]
    250-SIZE 31457280
    250-8BITMIME
    250-AUTH PLAIN LOGIN
    250 PIPELINING
    334 VXNlcm5hbWU6
    334 UGFzc3dvcmQ6
    235 Authentication succeeded
    250 OK
    250 Accepted
    354 Enter message, ending with "." on a line by itself
    250 OK id=1JMuge-0006sO-00
    */
    ?>
    PHP:
    <?php
    $smtp_username 
    '';
    $smtp_port '465';
    $smtp_host 'smtp.mail.ru';
    $smtp_password ''
    $smtp_charset 'koi8-r';
    ?>
     
  9. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    $socket=fsockopen('ssl://' . $smtp_host, $smtp_port);
    Вроде так было. Тему в раздел PHP надо перенести.
     
    RRR_RRR likes this.
  10. t0ma5

    t0ma5 Reservists Of Antichat

    Joined:
    10 Feb 2012
    Messages:
    828
    Likes Received:
    815
    Reputations:
    90
    как минимум нужно чтобы пыха была собрана с openssl + openssl должен поддерживать тип шифрования(tls,ssl3 etc.) + должен поддерживать один из шифров, список которых предоставляет сервер

    если есть консоль - попробуй просто подключиться

    openssl s_client -crlf -connect server_name:465

    и посмотреть пройдет ли коннект, шифры если что можно глянуть

    openssl ciphers -V

    а вообще в логе почтового демона оседают какие нить ошибки?

    -----------------------

    про логи нагнал похоже, не увидел что через fsockopen конект идет, тогда в логе самого пхп может что нить подозрительное быть
     
    _________________________
    #10 t0ma5, 26 Apr 2016
    Last edited: 26 Apr 2016
    RRR_RRR likes this.
  11. RRR_RRR

    RRR_RRR Member

    Joined:
    20 Jun 2012
    Messages:
    396
    Likes Received:
    35
    Reputations:
    0
    Вариант 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. Буду копать в эту сторону. Всем спасибо