Sendmail dsn = 5.0.0 Serviço indisponível ao enviar emails pelo PHP para o yahoo

1

Eu recebi uma pergunta sobre o sendmail, já procurei por perguntas semelhantes, mas não consegui encontrar nada que fosse útil para mim.

Atualmente estou usando um servidor (Debian com LAMP Stack) com o sendmail, para enviar e-mails de verificação para registros de usuários no site. Isso geralmente funciona bem, o Gmail, por exemplo recebe os e-mails e tudo funciona perfeitamente. Mas eu descobri recentemente que com o yahoo não funciona de todo, e-mails pareciam não ser recebidos pelo yahoo em tudo. Então eu configurei uma conta do yahoo para testar e observei o seguinte comportamento, que tento descrever da forma mais detalhada possível:

Eu uso o seguinte snippet de código PHP para enviar e-mails:

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

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

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

Eu tenho uma instalação do sendmail trabalhando no servidor, processando o comando mail do PHP.

Como dito, isso funciona completamente bem para quase todos os endereços como destinatários, exceto para o yahoo (e talvez outros que eu não conheço ainda). Usando o formulário no site que aciona o envio do e-mail, recebo o e-mail em segundos. A seguir, o log mostrado em /var/log/mail.log

May  3 14:19:12 btfmx5 sendmail[544]: u43CJCtW000544: from=www-data, size=1174, class=0, nrcpts=1, msgid=<[email protected]>, relay=www-data@localhost
May  3 14:19:13 btfmx5 sm-mta[545]: u43CJDBO000545: from=<[email protected]>, size=1419, class=0, nrcpts=1, msgid=<[email protected]>, proto=ESMTP, daemon=MTA-v4, relay=localhost [127.0.0.1]
May  3 14:19:13 btfmx5 sendmail[544]: u43CJCtW000544: [email protected], 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=<[email protected]>, ctladdr=<[email protected]> (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)

No entanto, quando tento enviar para um endereço do yahoo, o código PHP acima retorna TRUE, mas nenhuma mensagem é recebida na conta do yahoo. O seguinte é o log mostrado neste caso:

May  3 14:26:50 btfmx5 sendmail[571]: u43CQoiH000571: from=www-data, size=1174, class=0, nrcpts=1, msgid=<[email protected]>, relay=www-data@localhost
May  3 14:26:50 btfmx5 sm-mta[572]: u43CQogB000572: from=<[email protected]>, size=1419, class=0, nrcpts=1, msgid=<[email protected]>, proto=ESMTP, daemon=MTA-v4, relay=localhost [127.0.0.1]
May  3 14:26:50 btfmx5 sendmail[571]: u43CQoiH000571: [email protected], 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=<[email protected]>, ctladdr=<[email protected]> (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=<[email protected]>, delay=00:00:00, xdelay=00:00:00, mailer=local, pri=30000, dsn=2.0.0, stat=Sent

Eu agora tentei enviar um e-mail para o endereço do Yahoo usando o sendmail a partir da linha de comando, para obter informações adicionais do modo detalhado.

Mas, para minha surpresa, este e-mail foi recebido pelo yahoo (na pasta de spam, mas quem se importa)! Agora estou completamente perplexo, como diabos isso funciona na linha de comando, mas não quando se usa PHP?

O comando que usei para enviar o e-mail:

echo "Subject: testmail" | sendmail -v [email protected]

E as entradas de log correspondentes em mail.log :

May  3 14:34:35 btfmx5 sendmail[581]: u43CYZp5000581: from=alumpi, size=18, class=0, nrcpts=1, msgid=<[email protected]>, relay=root@localhost
May  3 14:34:35 btfmx5 sm-mta[582]: u43CYZx0000582: from=<[email protected]>, size=340, class=0, nrcpts=1, msgid=<[email protected]>, 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=<[email protected]>, ctladdr=<[email protected]> (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: [email protected], 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)

Saída detalhada do comando sendmail:

[email protected]... 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:<[email protected]> SIZE=18 [email protected]
250 2.1.0 <[email protected]>... Sender ok
>>> RCPT To:<[email protected]>
>>> DATA
250 2.1.5 <[email protected]>... Recipient ok
354 Enter mail, end with "." on a line by itself
>>> .
050 <[email protected]>... 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:<[email protected]> SIZE=340
050 250 sender <[email protected]> ok
050 >>> RCPT To:<[email protected]>
050 >>> DATA
050 250 recipient <[email protected]> ok
050 354 go ahead
050 >>> .
050 250 ok dirdel
050 <[email protected]>... Sent (ok dirdel)
250 2.0.0 u43CYZx0000582 Message accepted for delivery
[email protected]... Sent (u43CYZx0000582 Message accepted for delivery)
Closing connection to [127.0.0.1]
>>> QUIT
221 2.0.0 MYSERVER.de closing connection

Portanto, a questão principal é: Por que o envio para o Gmail, por exemplo, funciona, mas o envio para o Yahoo falha?

A questão secundária: Por que o envio para o yahoo via linha de comando funciona, mas falha via PHP?

Espero ter fornecido todas as informações necessárias, agradeço antecipadamente por sua ajuda!

    
por Beztix 03.05.2016 / 14:54

1 resposta

1

Graças aos comentários, consegui descobrir (sou bastante novo neste tipo de material administrativo, não sabia bem sobre o remetente do envelope e assim por diante ...):

Como visto nos logs, o remetente do envelope usado pelo sendmail ao usar o PHP era [email protected], ao usar a linha de comando era [email protected], então eu tentei alterá-los. MAS isso não foi um problema e não há razão para o comportamento diferente dos dois casos.

Na verdade, apenas me mudei então percebi que eu iria receber uma mensagem de retorno com informações provavelmente útil, se eu usar um endereço de e-mail adequado como envelope remetente / caminho de retorno. Depois de fazer isso, recebi uma mensagem de devolução para este endereço de e-mail que continha:

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

Então, sim, o erro inicial é bastante insipiente:

Como visto no código PHP postado na pergunta, estou enviando o cabeçalho do assunto duas vezes. Uma vez no headers-array e uma vez usando diretamente o subject-parameter da função PHP mail () -. Parece que a maioria dos provedores de email não se importam com isso, mas o yahoo faz isso.

Então, eu limpei meu código PHP para enviar um único assunto e usar um caminho de retorno útil, agora ele funciona perfeitamente (e nem mesmo vai para a pasta de spam):

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

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

if(mail($toEmail, $subject, $message, implode("\r\n",$headers), '-f [email protected]')) {
    return TRUE;
}
    
por 04.05.2016 / 09:00