Как правильно настроить PHPMailer - в данный момент получаю ошибки при отправке писем - PullRequest
0 голосов
/ 26 марта 2019

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

Ошибка, которую мы получаем:

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 
path/to/phpmailer/phpmailer/class.smtp.php on line 355

В то время я использовал конфигурацию PHPMailer:

// enable SMTP debugging.
$mail->SMTPDebug = 0;
//Set PHPMailer to use SMTP
$mail->isSMTP();
//Set SMTP host name.
$mail->Host = "smtp.netregistry.net";
$mail->SMTPAuth = true;
// Username and Password;
$mail->Username = $email;
$mail->Password = $email_pw;
$mail->Port = 25;
// Message information bellow

На основании некоторых исследований я обнаружил, что порт 25 часто блокируется дляпопробуйте предотвратить спам, и он также используется провайдерами (правильно?).Поэтому я перечитал документацию почтового сервера NetRegistry, а также поговорил с их службой поддержки.Если я хотел использовать SSL, мне нужно было использовать порт 465, в противном случае я должен был бы использовать порт 587.

Итак, на моей локальной машине Windows, использующей XAMPP, я попытался использовать следующую конфигурацию:

// Server Settings
$mail->SMTPDebug = 2;
$mail->isSMTP();
$mail->Host = "smtp.netregistry.net";
$mail->SMTPAuth = true;
$mail->Username = $email;
$mail->Password = $email_pw;
$mail->SMTPSecure = "ssl";
$mail->Port = 465;

И все это было помещено в блок try catch, где я ловил исключение, основываясь на том, что я прочитал о том, как PHPMailer обрабатывает ошибки и предупреждения.

Это прекрасно работало на моей локальной машине, и ябыл в состоянии надежно и регулярно отправлять электронные письма с этими настройками.Тем не менее, когда я загрузил это на удаленный хост, он не отправлял ни одного письма (прошло 4 дня с тех пор, как я попробовал это), и не выдает никаких сообщений об ошибках, несмотря на то, что блок catch отображает строку, в которой говорится, что ошибка имеетпроизошло.Я запустил различные конфигурации с аргументом SMTPDebug, установленным в 2, и это дало мне следующее:

При запуске скрипта на удаленном хосте с моими исходными настройками (порт 25) при сбое:

2019-03-25 21:10:12 SERVER -> CLIENT: 220 smtp.netregistry.net
2019-03-25 21:10:12 CLIENT -> SERVER: EHLO website.com.au
2019-03-25 21:10:12 SERVER -> CLIENT: 250-smtp-1.servers.netregistry.net Hello apache.netregistry.net [202.124.241.203]
                                      250-SIZE 52428800
                                      250-8BITMIME
                                      250-PIPELINING
                                      250-AUTH LOGIN PLAIN CRAM-MD5
                                      250-STARTTLS
                                      250 HELP
2019-03-25 21:10:12 CLIENT -> SERVER: STARTTLS
2019-03-25 21:10:12 SERVER -> CLIENT: 220 TLS go ahead
<br />
<b>Warning</b>:  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 <b>\path\to\vendor\phpmailer\phpmailer\class.smtp.php</b> on line <b>355</b><br />
2019-03-25 21:10:13 SMTP Error: Could not connect to SMTP host.
2019-03-25 21:10:13 CLIENT -> SERVER: QUIT
2019-03-25 21:10:13 SERVER -> CLIENT: �������A�;�   MNb���ʋ�]+�
                                      ���M�m3����Kz����f,�b�����<��t�٢��i�ޜ�w�k��PC����c�g�?���I��"r
                                      ��1���$����kKA�L�G����� ��z�<tC�� �s� BP����Tu�xڼH5����ɧ`���e��ڍF������i[�ql@����Gh�D=[���gh������pV����}������������P
2019-03-25 21:10:13 SMTP ERROR: QUIT command failed: �������A�;�    MNb���ʋ�]+�
                                      ���M�m3����Kz����f,�b�����<��t�٢��i�ޜ�w�k��PC����c�g�?���I��"r
                                      ��1���$����kKA�L�G����� ��z�<tC�� �s� BP����Tu�xڼH5����ɧ`���e��ڍF������i[�ql@����Gh�D=[���gh������pV����}������������P
2019-03-25 21:10:13 SMTP Error: Could not connect to SMTP host.
<strong> There was an error sending your packing slip</strong>

Когда я запускаю сценарий с моими обновленными настройками (SSL для порта 465):

2019-03-25 22:15:21 SMTP ERROR: Failed to connect to server: Connection refused (111)
2019-03-25 22:15:21 SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
<strong> There was an error sending your packing slip</strong>

Я предполагаю, что ключевая проблема заключается в том, что я не правильно что-то понимаю здесь, поэтомуесли бы кто-то мог помочь мне понять, где я иду не так, это было бы замечательно.

Спасибо.

РЕДАКТИРОВАТЬ: Одна вещь, которую я забыл упомянуть, говоря сегодня о поддержке Net Registryони предложили установить хост на localhost и порт на 25. Это не сработало.

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

Я только что столкнулся с точно такой же проблемой с Netregistry. Кажется, это нигде не задокументировано, но вот что работает для нас.

Требуемые настройки в настоящее время зависят от версии PHP, установленной в вашей панели NetRegistry CPanel.

Использование localhost в качестве хоста работает для версии PHP 5.5 или ниже.

Для нативной версии или выше (> = PHP 5.6) мы должны установить host для адреса cpanel, например:

$ mail-> Host = "cpxxx.ezyreg.com";

вот наши полные рабочие настройки для PHP 5.6 (по умолчанию для netregistry, насколько я могу судить)

$mail = new PHPMailer();
$mail->SMTPAuth = true;
$mail->IsSMTP(); 
$mail->Host = "cpxxx.ezyreg.com"; //for PHP 5.5 or less on NR this must be "localhost"
$mail->Port = 465;
$mail->IsHTML(true);
$mail->Username = $username;
$mail->Password = $password;
$mail->SMTPSecure = "ssl";  
$mail->Mailer = "smtp"; 

Редактировать : У меня была та же проблема на другом сайте NR CPanel на PHP 5.6, и единственный способ обойти ее - использовать небезопасное SMTP-соединение и локальный хост. Вот рабочие настройки для этого сайта.

$mail = new PHPMailer();
$mail->SMTPAuth = false;
$mail->SMTPSecure = false;
$mail->SMTPAutoTLS = false;
$mail->Host = "localhost";
$mail->Port = 25;
$mail->IsHTML(true);

//username and password below probably unused
//but this is a straight copy paste from our working site.
$mail->Username = $username;
$mail->Password = $pass;

$mail->Mailer = "smtp"; 
$mail->IsSMTP(); 
0 голосов
/ 03 июля 2019

Потратив некоторое время на изучение того, как работает рукопожатие, поскольку почтовый сервер иногда предлагает TLS, PHPMailer автоматически примет и начнет использовать TLS.

Я предполагаю, что это приводит к проблеме спроверка ssl сертификатов netregistry как-то.

Вы можете запретить PHPMailer автоматически использовать TLS с флагом SMTPAutoTLS.Однако мне пришлось продолжать использовать порт 25.Таким образом, мои параметры конфигурации стали такими:

$mail->SMTPDebug = 0;
$mail->isSMTP();
$mail->Host = "smtp.netregistry.net";
$mail->SMTPAuth = true;
$mail->Username = "email";
$mail->Password = "password";
$mail->Port = 25;
$mail->SMTPAutoTLS = false;

Я думаю, что, возможно, PHPMailer должен улучшить свою документацию по этому вопросу, потому что это было не особенно очевидно, но в разделе шифрования вики по устранению неисправностей документы упоминают об этом.Редактирование Radcore его ответа также включало этот флаг, однако я его не заметил, и он не был явно вызван, поэтому я создаю отдельный ответ, чтобы выделить его специально.

Другой ресурс, который я нашелполезно понять, что происходит руководство Amazon по отладке разговоров SMTP .Это дало мне лучшее понимание того, что означают все выходные данные отладки.

...