Intereting Posts
PHP: Как я могу захватить один файл из каталога без сканирования всего каталога? Вставить уникальные строки из 8 случайных символов PhoneGap. Не удается получить доступ к удаленной базе данных mysql Как загружается mt_rand PHP? Как настроить XAMPP для отправки почты с localhost? Расширение импорта yii не находит класс как сохранить данные, которые пользователь вводил на странице формы после выполнения скрипта? Где размещать глобальные функции в кодеринговом Отсутствуют теги HTML, когда SELECT из MySQL (Codeigniter) Почему `intval (19.9 * 100)` равно `1989`? Использование PHP для отображения атрибутов RSS-ленты Поиск MySQL от нескольких пользователей, предоставленных где предложение – исправление и лучший алгоритм Как отображать записи базы данных в представлении без повторения поля? 403 Запрещено при передаче URL в переменной GET Проблема с php readdir с именем файла японского языка

PHPMailer: ошибка SMTP: не удалось подключиться к SMTP-хосту

Я использовал PHPMailer для нескольких проектов, но теперь я застрял. Это дает мне ошибку:
Ошибка SMTP: не удалось подключиться к узлу SMTP.
Я пробовал отправлять электронную почту от Thunderbird, и она работает! Но не через PHPMailer … Вот настройки из Thunderbird:

Имя сервера: mail.exampleserver.com
Порт: 587
Имя пользователя: user@exampleserver.com
Безопасная аутентификация: нет
Безопасность подключения: STARTTLS

Я сравнил их с сервером в своем последнем проекте, где я использовал PHPMailer, и они были:

Имя сервера: mail.exampleserver2.com
Порт: 465
Имя пользователя: user@exampleserver2.com
Безопасная аутентификация: нет
Безопасность соединения: SSL / TLS

Мой php-код:

$mail = new PHPMailer(); $mail->IsSMTP(); // send via SMTP $mail->Host = SMTP_HOST; // SMTP servers $mail->Port = SMTP_PORT; // SMTP servers $mail->SMTPAuth = true; // turn on SMTP authentication $mail->Username = SMTP_USER; // SMTP username $mail->Password = SMTP_PASSWORD; // SMTP password $mail->From = MAIL_SYSTEM; $mail->FromName = MAIL_SYSTEM_NAME; $mail->AddAddress($aSecuredGetRequest['email']); $mail->IsHTML(true); // send as HTML 

Где я ошибаюсь?

В моем случае это было отсутствие поддержки SSL в PHP, которая дала эту ошибку.

Поэтому я включил расширение = php_openssl.dll

$mail->SMTPDebug = 1; также намекнул на это решение.

Обновление 2017

$mail->SMTPDebug = 2; , см. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting#enabling-debug-output

Поскольку эти вопросы появляются в google, я хотел бы поделиться здесь своим решением для случая, когда PHP был просто обновлен до версии 5.6 (которая имеет более строгие правила SSL).

В вики PHPMailer есть раздел:

https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting#php-56-certificate-verification-failure

Предлагаемое решение включает следующий фрагмент кода:

 $mail->SMTPOptions = array( 'ssl' => array( 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true ) ); 

Это должно работать для PHPMailer 5.2.10 (и выше).

Примечание. Очевидно, что, а также, как было предложено в этой вики, это должно быть временным решением!

Правильное исправление для этого – заменить неверный, неправильно сконфигурированный или самоподписанный сертификат с хорошим.

Ваша проблема, скорее всего,

Безопасность подключения: безопасность подключения STARTTLS: SSL / TLS

Это два разных протокола: используете ли вы правильный, какой бы вы ни использовали в Thunderbird.

Попробуйте установить переменную:

 // if you're using SSL $mail->SMTPSecure = 'ssl'; // OR use TLS $mail->SMTPSecure = 'tls'; 

У меня была аналогичная проблема, и выяснилось, что это директива конфигурации openssl.cafile в php.ini которая должна быть настроена так, чтобы разрешать проверку безопасных одноранговых узлов. Вы просто установили его в расположение файла центра сертификации, такого как тот, который вы можете получить по адресу http://curl.haxx.se/docs/caextract.html .

Эта директива является новой по сравнению с PHP 5.6, поэтому это меня не впечатлило при обновлении с PHP 5.5.

делает mail.exampleserver.com существует ??? , если не попробовать следующий код (у вас должна быть учетная запись gmail)

 $mail->SMTPSecure = "ssl"; $mail->Host='smtp.gmail.com'; $mail->Port='465'; $mail->Username = 'you@gmail.com'; // SMTP account username $mail->Password = 'your gmail password'; $mail->SMTPKeepAlive = true; $mail->Mailer = "smtp"; $mail->IsSMTP(); // telling the class to use SMTP $mail->SMTPAuth = true; // enable SMTP authentication $mail->CharSet = 'utf-8'; $mail->SMTPDebug = 0; 

У меня была такая же проблема, и это было потому, что PHPMailer понял, что сервер поддерживает STARTTLS, поэтому он попытался автоматически обновить соединение с зашифрованным соединением. Мой почтовый сервер находится в той же подсети, что и веб-сервер в моей сети, который находится за нашими брандмауэрами домена, поэтому я не слишком беспокоюсь об использовании шифрования (плюс генерируемые электронные письма не содержат конфиденциальных данных).

Так что я пошел вперед и сделал, изменил SMTPAutoTLS на false в файле class.phpmailer.php.

 /** * Whether to enable TLS encryption automatically if a server supports it, * even if `SMTPSecure` is not set to 'tls'. * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid. * @var boolean */ public $SMTPAutoTLS = false; 

У меня была аналогичная проблема. Я установил PHPMailer версии 1.72, который не готов управлять SSL-соединениями. Обновление до последней версии решило проблему.

Поскольку это популярная ошибка, ознакомьтесь с PHPMailer Wiki по устранению неполадок.

Также это сработало для меня

 $mailer->Port = '587';