Я не могу отправлять почту с помощью SwiftMailer или PHPMailer с Localhost, используя gmail

Недавно мне не удалось отправить почту через php на локальном хосте. Я использую PHPMailer и SwiftMailer в разных частях приложения.

С SwiftMailer я получаю это:

Connection could not be established with host smtp.gmail.com [ #0]

С PHPMailer сообщение такое:

SMTP Error: Could not connect to SMTP host.

Мои настройки в SwiftMailer выглядят так:

$transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')
->setUsername(APP_GMAIL_EMAIL)
->setPassword(APP_GMAIL_PWD);

Я просмотрел несколько потоков здесь, в SO и в других местах, и попробовал много «исправлений», но сообщения об ошибках остаются прежними. Вот некоторые «решения», которые я пробовал:

  1. Включить OpenSSL inphp.ini (ранее он был выключен)
  2. Изменить smtp.gmail.com на smtp.googlemail.com
  3. Замените smtp.gmail.com определенными IP-адресами Gmail.
  4. Замените smtp.gmail.com на gethostbyname('smtp.gmail.com')
  5. Добавьте ->setSourceIp('0.0.0.0') к приведенному выше коду создания экземпляра после setUsername и setPassword.

Этот код ранее работал, и я не уверен, что могло сломать функцию. В рамках устранения неполадок я только что подтвердил, что аналогичный код на общем хостинге Linux удовлетворительно отправляет электронную почту, предполагая, что проблема каким-то образом связана с моей средой. Таким образом, я даже пробовал разные источники доступа в Интернет, на случай, если это дело провайдера.

Как расколоть этот орех?


person Ifedi Okonkwo    schedule 29.04.2015    source источник
comment
Прочтите документацию по устранению неполадок PHPMailer.   -  person Synchro    schedule 30.04.2015


Ответы (1)


Мне удалось решить проблему, по крайней мере, с SwiftMailer. Решение, должно быть, возникло после моего обновления PHP с 5.2.5 до 5.6, которая сейчас у меня есть. Инсайт пришел с этой страницы:

https://github.com/swiftmailer/swiftmailer/issues/544

Если вы используете PHP 5.6, ошибка возникает из-за «параметров контекста SSL», используемых для контекста потока в swiftmailer. В PHP 5.6 verify_peer и verify_peer_name по умолчанию было установлено значение TRUE, поэтому PHP проверяет сертификат SSL. В настоящее время невозможно отключить его в swiftmailer с помощью некоторых опций.

Вы можете отключить проверку SSL, изменив функцию «_installSocketConnection» в StreamBuffer.php. Добавьте эти строки перед командой stream_socket_client:

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

Было бы здорово, если бы эти параметры можно было установить без взлома кода.

Спасибо https://stackoverflow.com/a/29448735/2554788, который первым указал мне на указанный пост.

Кстати, путь к StreamBuffer.php такой:

\lib\classes\Swift\Transport

Предупреждение: это решение основано на взломе кода внутри класса и, вероятно, потерпит неудачу, скажем, после обновления SwiftMailer версий (в этом случае вам нужно будет вернуться и снова взломать код).

Возможно, более свежие версии SwiftMailer объединили свои действия в PHP 5.6 (в настоящее время я использую SwiftMailer 5.1). Я намерен попробовать обновить как можно скорее, надеясь, что есть элегантное решение этой проблемы.

person Ifedi Okonkwo    schedule 30.04.2015
comment
Спасибо, Ифеди Оконкво. Решение мне помогло. - person Kiran; 22.12.2015