Перейти к содержанию

Рекомендуемые сообщения

Здравствуйте.

 

Пытаюсь настроить оповещения через Яндекс.Почту.

Мои настройки:

Почтовый протокол:SMTP

SMTP Имя сервера: ssl://smtp.yandex.ru

SMTP порт: 465

 

Мои ошибки:

2017-04-03 12:06:40 - PHP Warning:  fsockopen(): SSL operation failed with code 1. OpenSSL Error messages:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in .../system/library/mail.php on line 167
2017-04-03 12:06:40 - PHP Warning:  fsockopen(): Failed to enable crypto in .../system/library/mail.php on line 167
2017-04-03 12:06:40 - PHP Warning:  fsockopen(): unable to connect to ssl://smtp.yandex.ru:465 (Unknown error) in .../system/library/mail.php on line 167

 

Когда делаю так:

SMTP Имя сервера: tls://smtp.yandex.ru

SMTP порт: 587

 

Получаю ошибку:

2017-04-03 15:05:34 - PHP Warning:  stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in .../system/library/mail.php on line 221

 

Нашёл вот такой комментарий на зарубежном форуме:

This is due to PHP 5.6 verifies SSL certificates by default. You need to change the file class.smtp.php in line 238:

public function connect($host, $port = null, $timeout = 30, $options = array()) {
       if (count($options) == 0) {
           $options['ssl'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true);
       }

Только как это теперь применить к opencart и почему SSL3_GET_SERVER_CERTIFICATE:certificate verify failed?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Решение:

На сервере не были установлены корневые сертификаты. У меня Debian, но это не принципиально:

apt-get install ca-certificates

- ставим набор корневых сертификатов

 php -r 'print_r(openssl_get_cert_locations());' | grep '\[default_cert_file\]' | awk '{print $3}' 

определяем где php ищет корневой сертификат

у меня /usr/lib/ssl/cert.pem

wget http://curl.haxx.se/ca/cacert.pem -O /usr/lib/ssl/cert.pem

Скачиваю в нужный путь корневой сертификат

На всякий случай перезапустил apache и php

 

Получил эту ошибку:  MAIL FROM not accepted from server!

 

В файле .../system/library/mail.php

 if ($this->verp) {
 fputs($handle, 'MAIL FROM: <' . $this->from  . '>XVERP' . "\r\n");
  } else {
 fputs($handle, 'MAIL FROM: <' . $this->from  . '>' . "\r\n");
  }

Меняем на это

if ($this->verp) {
fputs($handle, 'MAIL FROM: <' . $this->smtp_username  . '>XVERP' . "\r\n");
 } else {
fputs($handle, 'MAIL FROM: <' . $this->smtp_username  . '>' . "\r\n");
}

Уже работает! Но в письме заголовки From и Reply-To идут от имени клиента. Плохо, не все такие письма примут, а если примут, то с предупреждением, что жулики.

Находим в этом же файле такое:

        $header .= 'From: =?UTF-8?B?' . base64_encode($this->sender) . '?= <' . $this->from . '>' . PHP_EOL;
        
        if (!$this->reply_to) {
            $header .= 'Reply-To: =?UTF-8?B?' . base64_encode($this->sender) . '?= <' . $this->from . '>' . PHP_EOL;

И делаем так:

        $header .= 'From: =?UTF-8?B?' . base64_encode($this->sender) . '?= <' . $this->smtp_username . '>' . PHP_EOL;
        
        if (!$this->reply_to) {
            $header .= 'Reply-To: =?UTF-8?B?' . base64_encode($this->sender) . '?= <' . $this->smtp_username . '>' . PHP_EOL;

Надеюсь кому-нибудь поможет.

  • +1 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Решение для тех, кто шлет почту через сервер с самоподписанным сертификатом.

Не рекомендуется, но можно просто тупо выключить проверку сертификата.

 

Открываем файл .../system/library/mail.php

 

ищем строку 167:

$handle = fsockopen($hostname, $this->smtp_port, $errno, $errstr, $this->smtp_timeout);

меняем ее на это :

$streamContext = stream_context_create([
    'ssl' => [
      'verify_peer'      => false,
      'verify_peer_name' => false
    ]
]);

$handle = stream_socket_client($hostname.':'.$this->smtp_port,
    $errno,
    $errstr,
    $this->smtp_timeout,
    STREAM_CLIENT_CONNECT,
    $streamContext);

Проверяем отправку, ошибок сертификата больше нет.

  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.