У меня проблема с подключением к SMTP-серверу через PHPMailer.
<?php
$mail = new PHPMailer();
$mail->isSMTP();
$mail->SMTPDebug = true;
$mail->Host = "ip.ip.ip.ip";
$mail->Port = "25";
$mail->Helo = "";
$mail->SMTPAutoTLS = false;
$mail->SMTPSecure = "";
$mail->SMTPAuth = false;
$mail->Timeout = 10;
$mail->From = "[email protected]";
$mail->FromName = "Sender Name";
$mail->addAddress("[email protected]");
$mail->isHTML(true);
$mail->Subject = "Test";
$mail->Body = "<h1>Test</h1>";if(!$mail->Send()) {
echo $mail->ErrorInfo;
} else {
echo "Mail sent...";
}
Я выяснил основную проблему:
После успешного подключения сервер НЕ отправляет сообщение «220» напрямую. Он не посылает ничего, кроме ожидания EHLO. После любого клиентского ввода сервер отправляет «220 объявлений»! Я проверил это с помощью telnet.
Я новее видел это раньше, и я не знаю, уважает ли он RFC.
220 ПОСЛЕ EHLO делает PHPMailer полностью сбой. Любое последующее сообщение «неправильно понято». Я видел, что PHPMailer ждет подключения 220 после подключения. Но это не удается, потому что сервер ничего не отправляет. По истечении времени ожидания клиент отправляет EHLO. После этого он получает 220, но следующее соединение не удается.
Вот полный вывод связи:
2017-03-30 13:38:48 Connection: opening to ip.ip.ip.ip:587, timeout=10, options=array (
)
2017-03-30 13:38:48 Connection: opened
2017-03-30 13:38:58 SMTP -> get_lines(): $data is ""2017-03-30 13:38:58 SMTP -> get_lines(): $str is ""2017-03-30 13:38:58 SMTP -> get_lines(): timed-out (10 sec)
2017-03-30 13:38:58 SERVER -> CLIENT:
2017-03-30 13:38:58 CLIENT -> SERVER: EHLO conweb1.example.de
2017-03-30 13:38:58 SMTP -> get_lines(): $data is ""2017-03-30 13:38:58 SMTP -> get_lines(): $str is "220 EX-02.example.loc Microsoft ESMTP MAIL Service ready at Thu, 30 Mar 2017 15:38:58 +0200
"2017-03-30 13:38:58 SERVER -> CLIENT: 220 EX-02.example.loc Microsoft ESMTP MAIL Service ready at Thu, 30 Mar 2017 15:38:58 +0200
2017-03-30 13:38:58 SMTP ERROR: EHLO command failed: 220 EX-02.example.loc Microsoft ESMTP MAIL Service ready at Thu, 30 Mar 2017 15:38:58 +0200
2017-03-30 13:38:58 CLIENT -> SERVER: HELO conweb1.example.de
2017-03-30 13:38:58 SMTP -> get_lines(): $data is ""2017-03-30 13:38:58 SMTP -> get_lines(): $str is "250-EX-02.example.loc Hello [ip.ip.ip.ip]
"2017-03-30 13:38:58 SMTP -> get_lines(): $data is "250-EX-02.example.loc Hello [ip.ip.ip.ip]
"2017-03-30 13:38:58 SMTP -> get_lines(): $str is "250-SIZE 36700160
"2017-03-30 13:38:58 SMTP -> get_lines(): $data is "250-EX-02.example.loc Hello [ip.ip.ip.ip]
250-SIZE 36700160
"2017-03-30 13:38:58 SMTP -> get_lines(): $str is "250-PIPELINING
"2017-03-30 13:38:58 SMTP -> get_lines(): $data is "250-EX-02.example.loc Hello [ip.ip.ip.ip]
250-SIZE 36700160
250-PIPELINING
"2017-03-30 13:38:58 SMTP -> get_lines(): $str is "250-DSN
"2017-03-30 13:38:58 SMTP -> get_lines(): $data is "250-EX-02.example.loc Hello [ip.ip.ip.ip]
250-SIZE 36700160
250-PIPELINING
250-DSN
"2017-03-30 13:38:58 SMTP -> get_lines(): $str is "250-ENHANCEDSTATUSCODES
"2017-03-30 13:38:58 SMTP -> get_lines(): $data is "250-EX-02.example.loc Hello [ip.ip.ip.ip]
250-SIZE 36700160
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
"2017-03-30 13:38:58 SMTP -> get_lines(): $str is "250-STARTTLS
"2017-03-30 13:38:58 SMTP -> get_lines(): $data is "250-EX-02.example.loc Hello [ip.ip.ip.ip]
250-SIZE 36700160
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-STARTTLS
"2017-03-30 13:38:58 SMTP -> get_lines(): $str is "250-AUTH LOGIN
"2017-03-30 13:38:58 SMTP -> get_lines(): $data is "250-EX-02.example.loc Hello [ip.ip.ip.ip]
250-SIZE 36700160
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-STARTTLS
250-AUTH LOGIN
"2017-03-30 13:38:58 SMTP -> get_lines(): $str is "250-8BITMIME
"2017-03-30 13:38:58 SMTP -> get_lines(): $data is "250-EX-02.example.loc Hello [ip.ip.ip.ip]
250-SIZE 36700160
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-STARTTLS
250-AUTH LOGIN
250-8BITMIME
"2017-03-30 13:38:58 SMTP -> get_lines(): $str is "250-BINARYMIME
"2017-03-30 13:38:58 SMTP -> get_lines(): $data is "250-EX-02.example.loc Hello [ip.ip.ip.ip]
250-SIZE 36700160
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-STARTTLS
250-AUTH LOGIN
250-8BITMIME
250-BINARYMIME
"2017-03-30 13:38:58 SMTP -> get_lines(): $str is "250 CHUNKING
"2017-03-30 13:38:58 SERVER -> CLIENT: 250-EX-02.example.loc Hello [ip.ip.ip.ip]
250-SIZE 36700160
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-STARTTLS
250-AUTH LOGIN
250-8BITMIME
250-BINARYMIME
250 CHUNKING
2017-03-30 13:38:58 CLIENT -> SERVER: MAIL FROM:<[email protected]>
2017-03-30 13:39:03 SMTP -> get_lines(): $data is ""2017-03-30 13:39:03 SMTP -> get_lines(): $str is "250 EX-02.example.loc Hello [ip.ip.ip.ip]
"2017-03-30 13:39:03 SERVER -> CLIENT: 250 EX-02.example.loc Hello [ip.ip.ip.ip]
2017-03-30 13:39:03 CLIENT -> SERVER: RCPT TO:<[email protected]>
2017-03-30 13:39:03 SMTP -> get_lines(): $data is ""2017-03-30 13:39:03 SMTP -> get_lines(): $str is "250 2.1.0 Sender OK
"2017-03-30 13:39:03 SERVER -> CLIENT: 250 2.1.0 Sender OK
2017-03-30 13:39:03 CLIENT -> SERVER: DATA
2017-03-30 13:39:03 SMTP -> get_lines(): $data is ""2017-03-30 13:39:03 SMTP -> get_lines(): $str is "250 2.1.5 Recipient OK
"2017-03-30 13:39:03 SERVER -> CLIENT: 250 2.1.5 Recipient OK
2017-03-30 13:39:03 SMTP ERROR: DATA command failed: 250 2.1.5 Recipient OK
2017-03-30 13:39:03 SMTP Error: data not accepted.
SMTP Error: data not accepted.SMTP server error: DATA command failed Detail: Recipient OK
SMTP code: 250 Additional SMTP info: 2.1.52017-03-30 13:39:03 CLIENT -> SERVER: QUIT
2017-03-30 13:39:03 SMTP -> get_lines(): $data is ""2017-03-30 13:39:03 SMTP -> get_lines(): $str is "354 Start mail input; end with <CRLF>.<CRLF>
2017-03-30 13:39:03 SMTP ERROR: QUIT command failed: 354 Start mail input; end with <CRLF>.<CRLF>
2017-03-30 13:39:03 Connection: closed
Главный вопрос:
Ошибка вызвана неправильной реализацией протокола PHP-Mailer?
Или SMTP-сервер неправильно настроен?
Не делай этого:
$mail->Timeout = 10;
RFC2821 указывает время ожидания в 300 секунд (5 минут) для первоначального приветствия, и некоторые серверы налагают здесь большую задержку (известную как «поздняя задержка») специально для перехвата несоответствующих клиентов, обычно спам-ботов. PHPMailer уважает это именно по умолчанию Timeout
настройка 300 сек. Если вы укорачиваете его, вы мешаете ему ждать достаточно долго. Работает ли он, если вы установите его на 300 или оставите значение по умолчанию?
Если вы говорите «но я не хочу ждать так долго во время обработки страницы!» — добро пожаловать в мир SMTP — он не предназначен для использования в реальном времени; используйте ретранслятор локального почтового сервера, чтобы устранить эту задержку и позволить почтовому серверу беспокоиться об этом.
Других решений пока нет …