PHPMailer: ошибка SMTP: не удалось подключиться к SMTP-хосту
Я использовал PHPMailer для нескольких проектов, но теперь я застрял. Это дает мне ошибку:
Ошибка SMTP: не удалось подключиться к узлу SMTP.
Я пробовал отправлять электронную почту от Thunderbird, и она работает! Но не через PHPMailer... Вот настройки из Thunderbird:
Имя сервера: mail.exampleserver.com
Порт: 587
Имя пользователя: [email protected]
Безопасная аутентификация: нет
Безопасность подключения: STARTTLS
Я сравнил их с сервером в моем последнем проекте, где я использовал PHPMailer, и они были:
Имя сервера: mail.exampleserver2.com
Порт: 465
Имя пользователя: [email protected]
Безопасная аутентификация: нет
Безопасность соединения: 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
Где я ошибаюсь?
Ответы
Ответ 1
Поскольку эти вопросы появляются в 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 (и выше).
Примечание. Очевидно, что, как и предложено в этой вики, это должно быть временным решением!
Правильное исправление для этого - заменить неверный, неправильно сконфигурированный или самоподписанный сертификат с хорошим.
Ответ 2
В моем случае это было отсутствие поддержки SSL в PHP, которая дала эту ошибку.
Итак, я включил extension = php_openssl.dll
$mail->SMTPDebug = 1;
также намекнул на это решение.
Обновление 2017
$mail->SMTPDebug = 2;
, см. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting#enabling-debug-output
Ответ 3
Ваша проблема, скорее всего, в этом
Безопасность подключения: STARTTLS
Безопасность соединения: SSL/TLS
Это два разных протокола, вы используете правильный, независимо от того, что вы используете в Thunderbird.
Попробуйте установить переменную:
// if you're using SSL
$mail->SMTPSecure = 'ssl';
// OR use TLS
$mail->SMTPSecure = 'tls';
Ответ 4
У меня была аналогичная проблема, и выяснилось, что это была директива конфигурации openssl.cafile
в php.ini
, которую нужно было установить, чтобы разрешить проверку безопасных одноранговых узлов. Вы просто установите его в расположение файла центра сертификации, такого как тот, который вы можете получить в http://curl.haxx.se/docs/caextract.html.
Эта директива является новой по сравнению с PHP 5.6, поэтому это меня не впечатлило при обновлении с PHP 5.5.
Ответ 5
У меня была та же проблема, и именно потому, что 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 certificates are valid.
* @var boolean
*/
public $SMTPAutoTLS = false;
Ответ 6
Есть ли mail.exampleserver.com????, если не попробовать следующий код (у вас должна быть учетная запись gmail)
$mail->SMTPSecure = "ssl";
$mail->Host='smtp.gmail.com';
$mail->Port='465';
$mail->Username = '[email protected]'; // 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;
Ответ 7
Следующий код работал для меня:
$mail = new PHPMailer(true);
$mail->isSMTP();// Set mailer to use SMTP
$mail->CharSet = "utf-8";// set charset to utf8
$mail->SMTPAuth = true;// Enable SMTP authentication
$mail->SMTPSecure = 'tls';// Enable TLS encryption, 'ssl' also accepted
$mail->Host = 'smtp.gmail.com';// Specify main and backup SMTP servers
$mail->Port = 587;// TCP port to connect to
$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
);
$mail->isHTML(true);// Set email format to HTML
$mail->Username = 'Sender Email';// SMTP username
$mail->Password = 'Sender Email Password';// SMTP password
$mail->setFrom('[email protected]', 'John Smith');//Your application NAME and EMAIL
$mail->Subject = 'Test';//Message subject
$mail->MsgHTML('HTML code');// Message body
$mail->addAddress('User Email', 'User Name');// Target email
$mail->send();
Ответ 8
У меня была аналогичная проблема. Я установил PHPMailer версии 1.72, который не готов управлять SSL-соединениями. Обновление до последней версии решило проблему.
Ответ 9
Так как это популярная ошибка, ознакомьтесь с PHPMailer Wiki по устранению неполадок.
И это сработало для меня
$mailer->Port = '587';
Ответ 10
$mail->SMTPDebug = 2; // to see exactly what the issue
В моем случае это помогло:
$mail->SMTPSecure = false;
$mail->SMTPAutoTLS = false;
Ответ 11
В моем случае в CPANEL у меня есть опция "Зарегистрировать почтовые идентификаторы", где я добавляю свой адрес электронной почты, и через 30 минут он отлично работает с простой функцией php mail.