Я использовал 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';