Назад | Перейти на главную страницу

Sendmail dsn = 5.0.0 Служба недоступна при отправке писем с помощью PHP на Yahoo

У меня вопрос по sendmail, я уже искал похожие вопросы, но не нашел ничего полезного для меня.

В настоящее время я использую сервер (Debian со стеком LAMP) с sendmail для отправки проверочного письма для регистрации пользователей на веб-сайте. Обычно это работает нормально, например, Gmail. получает почту, и все работает отлично. НО недавно я обнаружил, что с yahoo это вообще не работает, кажется, что Yahoo не получает почту вообще. Итак, я сам создал учетную запись Yahoo для тестирования и заметил следующее поведение, которое я стараюсь описать как можно подробнее:

Я использую следующий фрагмент кода PHP для отправки писем:

$toEmail = '...';
$subject = '...';
$message = '...';

$headers   = array();
$headers[] = "MIME-Version: 1.0";
$headers[] = "Content-type: text/plain; charset=utf-8";
$headers[] = "From: noreply@MYSERVER.de";
$headers[] = "Subject: {$subject}";
$headers[] = "X-Mailer: PHP/".phpversion();

if(mail($toEmail, $subject, $message, implode("\r\n",$headers))) {
    return TRUE;
}

Я получил установку sendmail, работающую на сервере, обрабатывающую mail-команду из PHP.

Как уже говорилось, это прекрасно работает почти для всех адресов получателей, кроме yahoo (и, возможно, других, о которых я еще не знаю). Используя форму на веб-сайте, которая запускает отправку почты, я получаю письмо в течение нескольких секунд. Ниже приведен журнал, показанный на /var/log/mail.log

May  3 14:19:12 btfmx5 sendmail[544]: u43CJCtW000544: from=www-data, size=1174, class=0, nrcpts=1, msgid=<201605031219.u43CJCtW000544@MYSERVER.de>, relay=www-data@localhost
May  3 14:19:13 btfmx5 sm-mta[545]: u43CJDBO000545: from=<www-data@MYSERVER.de>, size=1419, class=0, nrcpts=1, msgid=<201605031219.u43CJCtW000544@MYSERVER.de>, proto=ESMTP, daemon=MTA-v4, relay=localhost [127.0.0.1]
May  3 14:19:13 btfmx5 sendmail[544]: u43CJCtW000544: to=TESTADDRESS@gmail.com, ctladdr=www-data (33/33), delay=00:00:01, xdelay=00:00:01, mailer=relay, pri=31174, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (u43CJDBO000545 Message accepted for delivery)
May  3 14:19:13 btfmx5 sm-mta[547]: STARTTLS=client, relay=gmail-smtp-in.l.google.com., version=TLSv1/SSLv3, verify=FAIL, cipher=ECDHE-RSA-AES128-GCM-SHA256, bits=128/128
May  3 14:19:13 btfmx5 sm-mta[547]: u43CJDBO000545: to=<TESTADDRESS@gmail.com>, ctladdr=<www-data@MYSERVER.de> (33/33), delay=00:00:00, xdelay=00:00:00, mailer=esmtp, pri=121419, relay=gmail-smtp-in.l.google.com. [64.233.184.26], dsn=2.0.0, stat=Sent (OK 1462278313 o16si26784998wme.6 - gsmtp)

Однако, когда я пытаюсь отправить сообщение на адрес Yahoo, приведенный выше PHP-код возвращает ИСТИНА, но почта не поступает на учетную запись Yahoo. В этом случае показан следующий журнал:

May  3 14:26:50 btfmx5 sendmail[571]: u43CQoiH000571: from=www-data, size=1174, class=0, nrcpts=1, msgid=<201605031226.u43CQoiH000571@MYSERVER.de>, relay=www-data@localhost
May  3 14:26:50 btfmx5 sm-mta[572]: u43CQogB000572: from=<www-data@MYSERVER.de>, size=1419, class=0, nrcpts=1, msgid=<201605031226.u43CQoiH000571@MYSERVER.de>, proto=ESMTP, daemon=MTA-v4, relay=localhost [127.0.0.1]
May  3 14:26:50 btfmx5 sendmail[571]: u43CQoiH000571: to=TESTADDRESS@yahoo.com, ctladdr=www-data (33/33), delay=00:00:00, xdelay=00:00:00, mailer=relay, pri=31174, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (u43CQogB000572 Message accepted for delivery)
May  3 14:26:51 btfmx5 sm-mta[574]: STARTTLS=client, relay=mta5.am0.yahoodns.net., version=TLSv1/SSLv3, verify=FAIL, cipher=ECDHE-RSA-AES128-GCM-SHA256, bits=128/128
May  3 14:26:53 btfmx5 sm-mta[574]: u43CQogB000572: to=<TESTADDRESS@yahoo.com>, ctladdr=<www-data@MYSERVER.de> (33/33), delay=00:00:03, xdelay=00:00:03, mailer=esmtp, pri=121419, relay=mta5.am0.yahoodns.net. [66.196.118.37], dsn=5.0.0, stat=Service unavailable
May  3 14:26:53 btfmx5 sm-mta[574]: u43CQogB000572: u43CQrgB000574: DSN: Service unavailable
May  3 14:26:53 btfmx5 sm-mta[574]: u43CQrgB000574: to=<www-data@MYSERVER.de>, delay=00:00:00, xdelay=00:00:00, mailer=local, pri=30000, dsn=2.0.0, stat=Sent

Теперь я попытался отправить электронное письмо на адрес Yahoo с помощью sendmail из командной строки, чтобы получить дополнительную информацию из подробного режима.

Но, к моему удивлению, это письмо пришло на yahoo (в папке со спамом, да кого это волнует)! Теперь я совершенно озадачен, как, черт возьми, это работает из командной строки, но не при использовании PHP?

Команда, которую я использовал для отправки почты:

echo "Subject: testmail" | sendmail -v TESTADDRESS@yahoo.com

И соответствующие записи журнала в mail.log:

May  3 14:34:35 btfmx5 sendmail[581]: u43CYZp5000581: from=alumpi, size=18, class=0, nrcpts=1, msgid=<201605031234.u43CYZp5000581@MYSERVER.de>, relay=root@localhost
May  3 14:34:35 btfmx5 sm-mta[582]: u43CYZx0000582: from=<alumpi@MYSERVER.de>, size=340, class=0, nrcpts=1, msgid=<201605031234.u43CYZp5000581@MYSERVER.de>, proto=ESMTP, daemon=MTA-v4, relay=localhost [127.0.0.1]
May  3 14:34:37 btfmx5 sm-mta[582]: STARTTLS=client, relay=mta7.am0.yahoodns.net., version=TLSv1/SSLv3, verify=FAIL, cipher=ECDHE-RSA-AES128-GCM-SHA256, bits=128/128
May  3 14:34:39 btfmx5 sm-mta[582]: u43CYZx0000582: to=<TESTADRESS@yahoo.com>, ctladdr=<alumpi@MYSERVER.de> (1000/1000), delay=00:00:04, xdelay=00:00:04, mailer=esmtp, pri=30340, relay=mta7.am0.yahoodns.net. [63.250.192.45], dsn=2.0.0, stat=Sent (ok dirdel)
May  3 14:34:39 btfmx5 sendmail[581]: u43CYZp5000581: to=TESTADRESS@yahoo.com, ctladdr=alumpi (1000/1000), delay=00:00:04, xdelay=00:00:04, mailer=relay, pri=30018, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (u43CYZx0000582 Message accepted for delivery)

Подробный вывод команды sendmail:

TESTADDRESS@yahoo.com... Connecting to [127.0.0.1] via relay...
220 MYSERVER.de ESMTP Sendmail 8.14.4/8.14.4/Debian-8; Tue, 3 May 2016 14:34:35 +0200; (No UCE/UBE) logging access from: localhost(OK)-localhost [127.0.0.1]
>>> EHLO MYSERVER.de
250-MYSERVER.de Hello localhost [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-EXPN
250-VERB
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH DIGEST-MD5 CRAM-MD5
250-DELIVERBY
250 HELP
>>> VERB
250 2.0.0 Verbose mode
>>> MAIL From:<alumpi@MYSERVER.de> SIZE=18 AUTH=alumpi@MYSERVER.de
250 2.1.0 <alumpi@MYSERVER.de>... Sender ok
>>> RCPT To:<TESTADDRESS@yahoo.com>
>>> DATA
250 2.1.5 <TESTADDRESS@yahoo.com>... Recipient ok
354 Enter mail, end with "." on a line by itself
>>> .
050 <TESTADDRESS@yahoo.com>... Connecting to mta7.am0.yahoodns.net. via esmtp...
050 220 mta1523.mail.gq1.yahoo.com ESMTP ready
050 >>> EHLO MYSERVER.de
050 250-mta1523.mail.gq1.yahoo.com
050 250-PIPELINING
050 250-SIZE 41943040
050 250-8BITMIME
050 250 STARTTLS
050 >>> STARTTLS
050 220 Start TLS
050 >>> EHLO MYSERVER.de
050 250-mta1523.mail.gq1.yahoo.com
050 250-PIPELINING
050 250-SIZE 41943040
050 250 8BITMIME
050 >>> MAIL From:<alumpi@MYSERVER.de> SIZE=340
050 250 sender <alumpi@MYSERVER.de> ok
050 >>> RCPT To:<TESTADDRESS@yahoo.com>
050 >>> DATA
050 250 recipient <TESTADDRESS@yahoo.com> ok
050 354 go ahead
050 >>> .
050 250 ok dirdel
050 <TESTADDRESS@yahoo.com>... Sent (ok dirdel)
250 2.0.0 u43CYZx0000582 Message accepted for delivery
TESTADDRESS@yahoo.com... Sent (u43CYZx0000582 Message accepted for delivery)
Closing connection to [127.0.0.1]
>>> QUIT
221 2.0.0 MYSERVER.de closing connection

Итак, главный вопрос: почему отправка, например, на Gmail работает, а отправка на Yahoo не работает?

Второй вопрос: почему отправка на Yahoo через командную строку работает, но не работает через PHP?

Надеюсь, я предоставил всю необходимую информацию, заранее благодарю за помощь!

Благодаря комментариям я смог понять это (я новичок в подобных админках, плохо разбирался в отправителе конверта и так далее ...):

Как видно из журналов, отправителем конверта, используемым sendmail при использовании PHP, был www-data@MYSERVER.de, при использовании командной строки это был alumpi@MYSERVER.de, поэтому я попытался изменить их. НО это не было проблемой и не причиной различного поведения двух случаев.

На самом деле, тупой я только тогда понял, что получу рикошет с, вероятно, полезной информацией, если я использую правильный почтовый адрес в качестве отправителя / обратного пути конверта. После этого я получил сообщение о недоставке на этот адрес электронной почты, которое содержало:

554 Message not allowed - Headers are not RFC compliant[291]

Так что да, первоначальная ошибка весьма незаметна:

Как видно из PHP-кода, опубликованного в вопросе, я дважды отправляю заголовок темы. Один раз в массиве заголовков и один раз напрямую с использованием параметра subject функции PHP mail (). Кажется, что большинству почтовых провайдеров это наплевать, но yahoo делает это.

Итак, я очистил свой PHP-код, чтобы отправить одну тему и использовать полезный путь возврата, теперь он работает отлично (и даже не попадает в папку для спама):

$toEmail = '...';
$subject = '...';
$message = '...';

$headers   = array();
$headers[] = "MIME-Version: 1.0";
$headers[] = "Content-type: text/plain; charset=utf-8";
$headers[] = "From: noreply@MYSERVER.de";
$headers[] = "X-Mailer: PHP/".phpversion();

if(mail($toEmail, $subject, $message, implode("\r\n",$headers), '-f ME@MYADDRESS.de')) {
    return TRUE;
}