Prestashop 1.6 и SwiftMailer с версией PHP 5.6 - ошибка fsockopen - PullRequest
1 голос
/ 31 мая 2019

У меня проблема с отправкой почты с использованием версии Swiftmailer, поставляемой с PS1.6

Swift Ошибка: не удалось установить SMTP-соединение [ssl: //mail.wineofthemonth.co.za: 465]: fsockopen вернул номер ошибки 0 и строку ошибки \ '\'

Это связано с тем, что начиная с PHP 5.6 для опции verify_peer по умолчанию установлено значение true.

Теперь я обнаружилразличные инструкции о том, как установить для проверки peer значение false:

$https['ssl']['verify_peer'] = FALSE;
$https['ssl']['verify_peer_name'] = FALSE;

Проблема в том, что нет места, чтобы установить это в версии Swiftmailer, которая используется в Prestashop.

Итакмой вопрос, где в классе / mail.php или где-либо еще я установил бы в verify_peer значение false?

Вот строка в mail.php, которая, я думаю, относится к этому:

$connection = new Swift_Connection_SMTP(
                    $configuration['PS_MAIL_SERVER'],
                    $configuration['PS_MAIL_SMTP_PORT'],
                    $configuration['PS_MAIL_SMTP_ENCRYPTION'] == 'ssl' ? Swift_Connection_SMTP::ENC_SSL : (($configuration['PS_MAIL_SMTP_ENCRYPTION'] == 'tls' ? Swift_Connection_SMTP::ENC_TLS : Swift_Connection_SMTP::ENC_OFF))
                );

Существует также метод sendMailtest, который может дать больше ясности:

public static function sendMailTest($smtpChecked, $smtpServer, $content, $subject, $type, $to, $from, $smtpLogin, $smtpPassword, $smtpPort = 25, $smtpEncryption)
    {
        $result = false;
        try {
            if ($smtpChecked)
            {
                $smtp = new Swift_Connection_SMTP($smtpServer, $smtpPort, ($smtpEncryption == 'off') ?
                    Swift_Connection_SMTP::ENC_OFF : (($smtpEncryption == 'tls') ? Swift_Connection_SMTP::ENC_TLS : Swift_Connection_SMTP::ENC_SSL));
                $smtp->setUsername($smtpLogin);
                $smtp->setpassword($smtpPassword);
                $smtp->setTimeout(5);
                $swift = new Swift($smtp, Configuration::get('PS_MAIL_DOMAIN'));
            }
            else
                $swift = new Swift(new Swift_Connection_NativeMail(), Configuration::get('PS_MAIL_DOMAIN'));

            $message = new Swift_Message($subject, $content, $type);

            if ($swift->send($message, $to, $from))
                $result = true;

            $swift->disconnect();
        } catch (Swift_ConnectionException $e) {
            $result = $e->getMessage();
        } catch (Swift_Message_MimeException $e) {
            $result = $e->getMessage();
        }

        return $result;
    } 

В качестве альтернативы, где в любом файле conf или ini я могу установить false для параметра verify_peer?

1 Ответ

0 голосов
/ 31 мая 2019

Это работает для меня:

  1. Открыть файл /tools/swift/classes/Swift/Transport/StreamBuffer.php
  2. В строке 263, непосредственно перед $this->_stream =, добавьте эти две строки:

    $options['ssl']['verify_peer'] = FALSE;

    $options['ssl']['verify_peer_name'] = FALSE;

Код должен выглядеть следующим образом:

[...]

$options = array();
if (!empty($this->_params['sourceIp'])) {
    $options['socket']['bindto'] = $this->_params['sourceIp'].':0';
}
$options['ssl']['verify_peer'] = FALSE;
$options['ssl']['verify_peer_name'] = FALSE;
$this->_stream = @stream_socket_client($host.':'.$this->_params['port'], $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, stream_context_create($options));

[...]

Надеюсь, это поможет!

...