Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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.