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

Где я не прав?


person Ilian Andreev    schedule 13.08.2010    source источник


Ответы (12)


Поскольку этот вопрос часто встречается в 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 (и выше).

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

Правильное решение этой проблемы - заменить недействительный, неправильно настроенный или самозаверяющий сертификат исправным.

person Marten Koetsier    schedule 04.04.2016
comment
Это лучший ответ для тех, кто борется с почтой на localhost и сталкивается с проблемами самоподписывания. - person andromeda; 02.09.2017
comment
Согласовано! Это лучшее решение для тех, кто работает в среде разработки. Просто оберните этот код в оператор if, чтобы проверить тип среды. Если среда разработки, используйте этот код, иначе пусть сервер позаботится о сертификации. - person OzzyTheGiant; 21.02.2018
comment
Лучшее решение, после нескольких часов ломки моего мозга всевозможными изменениями параметров кода PHPMailer, это оказалось ошибкой или несовместимостью с более новой версией PHP. Теперь я отправляю с localhost в свою локальную среду разработки. Молодец Мартен! - person Mario; 29.04.2018
comment
Огромное спасибо! Два дня искал решение. - person Fid; 13.01.2019
comment
Боковое примечание: мои сертификаты LetsEncrypt были установлены неправильно в Postfix. Это должно быть fullchain.pem и privkey.pem, - person Fid; 13.01.2019
comment
Отлично работает на localhost - person Ashwin Balani; 27.04.2020
comment
Это было очень полезно. Спасибо - person KTM; 08.07.2020
comment
спасибо большое, это работает - person Gabbr Issimo; 01.03.2021

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

Итак, я включил extension = php_openssl.dll

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

Обновление 2017 г.

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

person wessel    schedule 18.04.2011
comment
Мне было нужно включить это расширение PHP (пункт меню WAMP). Спасибо. - person jwinn; 27.08.2011
comment
Ты мой герой. Я уже несколько часов борюсь с электронной почтой на моем локальном хосте, но это решило все мои проблемы! - person Mikkel R. Lund; 04.04.2012
comment
Как вы включили это расширение? @wessel - person Faisal Ashfaq; 18.04.2014
comment
Как я могу включить extension = php_openssl.dll в хостинге GoDaddy? Спасибо - person Fernando Torres; 28.04.2016

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

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

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

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

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

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

Эта директива появилась в PHP 5.6 впервые, поэтому при обновлении с PHP 5.5 это застало меня врасплох.

person Jasper    schedule 16.06.2015
comment
Я столкнулся с той же проблемой, используя PHP5.6, если я установил одноранговую проверку, установленную на false, в электронных письмах phpmailer переходит в папку спама. Любая идея, как я могу установить путь к сертификату? где взять сертификат? в Debian 8 VPS - person Jobin; 20.02.2016
comment
Спасибо. Для меня это сработало. То есть: cd / etc / php5 && wget curl.haxx.se/ca/cacert.pem && echo openssl.cafile = /etc/php5/cacert.pem ›› /etc/php5/apache2/php.ini - person Szymon Wygnański; 18.09.2017

У меня была такая же проблема, потому что 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;
person Sina Motamedi    schedule 31.01.2017
comment
Спасибо. Вам не нужно редактировать базовый класс, чтобы изменить это, просто выполните $ mail- ›SMTPAutoTLS = false; - person TedMilker; 15.11.2018

Для меня работал следующий код:

$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();
person Dumitru Boaghi    schedule 27.06.2018
comment
Я был настроен скептически, но это помогло. Я думаю, что Gmail нужен набор параметров SMTPOptions, поскольку мой без него не работал. - person ron_g; 05.11.2020

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;   
person Rami Dabain    schedule 27.12.2010

$mail->SMTPDebug = 2; // to see exactly what's the issue

В моем случае это помогло:

$mail->SMTPSecure = false;
$mail->SMTPAutoTLS = false;
person Martin Zvarík    schedule 28.01.2019

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

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

$mailer->Port = '587';
person Francis Sunday    schedule 20.04.2017

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

person David    schedule 22.05.2012

Недавно я столкнулся с этой проблемой, и оказалось, что причина проблемы в том, что корневой сертификат на SMTP-сервере, к которому я подключался, был Корневой сертификат Sectigo, срок действия которого недавно истек.

Если вы подключаетесь к SMTP-серверу с помощью SSL / TLS или STARTTLS, и вы в последнее время ничего не меняли в среде, в которой работает ваш скрипт PHPMailer, и эта проблема внезапно возникла - тогда вы можете проверить, не истек ли срок действия или нет. недействительный сертификат где-то в цепочке сертификатов на сервере.

Вы можете просмотреть цепочку сертификатов сервера, используя openssl s_client.

Для SSL / TLS на порту 465:

openssl s_client -connect server.domain.tld:465 | openssl x509 -text

Для STARTTLS на порту 587:

openssl s_client -starttls smtp -crlf -connect server.domain.tld:587 | openssl x509 -text
person mti2935    schedule 10.06.2020

В моем случае в CPANEL у меня есть опция «Зарегистрировать идентификаторы почты», где я добавляю свой адрес электронной почты, и через 30 минут он отлично работает с простой функцией почты php.

person Dinesh Gurjar    schedule 07.02.2019