PHPMailer: ошибка SMTP: не удалось подключиться к узлу SMTP - PullRequest
43 голосов
/ 13 августа 2010

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

Где я не прав?

Ответы [ 11 ]

83 голосов
/ 04 апреля 2016

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

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

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

48 голосов
/ 19 апреля 2011

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

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

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

Обновление 2017

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

12 голосов
/ 13 августа 2010

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

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

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

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

// if you're using SSL
$mail->SMTPSecure = 'ssl';
// OR use TLS
$mail->SMTPSecure = 'tls';
6 голосов
/ 01 февраля 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;
6 голосов
/ 16 июня 2015

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

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

4 голосов
/ 27 декабря 2010

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;   
2 голосов
/ 27 июня 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('example@mail.com', '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();
1 голос
/ 28 января 2019
$mail->SMTPDebug = 2; // to see exactly what's the issue

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

$mail->SMTPSecure = false;
$mail->SMTPAutoTLS = false;
0 голосов
/ 07 февраля 2019

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

0 голосов
/ 20 апреля 2017

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

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

$mailer->Port = '587';
...