Sendmail dsn=5.0.0 Сервис недоступен при отправке почты через PHP на Yahoo

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

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

Я использую следующий PHP-Code-Snippet для отправки писем:

$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-код возвращает TRUE, но в аккаунте 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?

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

1 ответ

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

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

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

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

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

Как видно из PHP-кода, размещенного в вопросе, я отправляю заголовок темы дважды. Один раз в массиве заголовков и один раз напрямую, используя параметр-субъект функции 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;
}
Другие вопросы по тегам