Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Яндекс почта, opencart 2 и php 5.6


Recommended Posts

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

 

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

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

Почтовый протокол: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
Надіслати
Поділитися на інших сайтах


  • 6 months later...

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

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

 

Открываем файл .../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 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.