O postfix rejeita um email de saída com vários destinos devido a um endereço inválido

4

Estou enviando meus e-mails usando o Postfix e tenho uma lista considerável de e-mails para enviar newsletters. Então eu prefiro empacotar minhas requisições SMTP em uma definindo um dos e-mails como To e um monte mais como Bcc (no PHP).

Meu problema é que, se um dos e-mails for inválido, o Postfix rejeitará toda a solicitação, causando o seguinte erro:

5.1.1 : Recipient address rejected: User unknown in local recipient table

Seria ótimo se eu pudesse configurar o Postfix de maneira que ele despejasse o inválido, mas enviasse o resto. Eu sei que posso validar os endereços eu mesmo antes de usá-los em um e-mail, mas eu prefiro que seja feito pelo Postfix.

[UPDATE]

Aqui está o conteúdo do maillog:

Nov 18 16:20:28 mail postfix/smtpd[12922]: 14A5FB812E1: client=localhost[127.0.0.1]
Nov 18 16:20:28 mail postfix/smtpd[12922]: 14A5FB812E1: reject: RCPT from localhost[127.0.0.1]: 550 5.1.1 <mehran_hotmail.com>: Recipient address rejected: User unknown in local recipient table; from=<mehran@localhost> to=<mehran_hotmail.com> proto=ESMTP helo=<localhost>

Este erro é gerado enquanto eu tentei enviar um email com [email protected] como o destinatário principal e mehran_hotmail.com como Bcc .

[UPDATE]

Este é o registro completo associado à solicitação:

Nov 19 09:47:01 mail postfix/smtpd[20947]: connect from localhost[127.0.0.1]
Nov 19 09:47:01 mail postfix/smtpd[20947]: EC281B81BCE: client=localhost[127.0.0.1]
Nov 19 09:47:01 mail postfix/smtpd[20947]: warning: Illegal address syntax from localhost[127.0.0.1] in RCPT command: <mehran@?????.com>
Nov 19 09:47:01 mail postfix/smtpd[20947]: disconnect from localhost[127.0.0.1]

Este é um novo cenário (que leva ao mesmo problema) no qual usei um endereço de e-mail correto ( To e Bcc possuem endereços de e-mail corretos, mas não o mesmo endereço), mas desta vez o endereço de e-mail foi rejeitado porque o Postfix não o reconhece. Eu usei caracteres não-ASCII como para o nome de domínio (mehran @ مهران. Com). Eu não me importo se o Postfix suporta endereços não-ASCII ou não, é só que quando ele rejeita um endereço, todo o pedido é rejeitado !! E nenhum email é enviado para [email protected] (que é nomeado em To )!

Agora a mensagem de erro retornada ao meu código (PHP feito MUA) é:

5.1.3 Bad recipient address syntax

Quanto ao código PHP que interage com SMTP server:

$mail = new \Zend_Mail('utf-8');
$mail->setMessageId($mail->createMessageId());

foreach ($array_to as $to) {
    $mail->addTo($to['email'], $to['name']);
}
foreach ($array_cc as $to) {
    $mail->addCc($to['email'], $to['name']);
}
foreach ($array_bcc as $to) {
    $mail->addBcc($to['email'], $to['name']);
}

$mail->setSubject($subject);
$mail->setBodyHtml($body);
$mail->setFrom($current_user_email, $current_user_name);
$mail->setDate(new \Zend_Date());

$smtp = createSmtpConnection();
$smtp->send($mail);

Como você pode ver, usei o Zend Framework (v1) e meu código é bastante simples. As variáveis $array_* são matrizes simples que contêm os endereços de e-mail. No meu cenário de teste, existem apenas dois endereços de email, um para To e outro para Bcc .

    
por Mehran 18.11.2014 / 13:03

3 respostas

5

TLDR: Seu caso é um cliente de email com comportamento anormal na transação SMTP adequada. Talvez algo errado no seu código PHP. Veja este tópico na lista de discussão postfix . Uma citação do autor do Postfix nesse tópico

You are mistaken. You have no evidence whatsoever that Postfix rejects the entire message.

It is known that SOME SMTP CLIENT programs will give up delivering a message when one recipient is not accepted, even when the other recipients are good.

Como a rejeição de SMTP funciona

Primeiro, faremos o tour da transação SMTP. Abaixo está como o SMTP funciona em baixo nível. Você pode sempre tentar via telnet / netcat.

Caso 1 Esta é a transação quando há um único destinatário.

S: 220 smtp.example.net Simple Mail Transfer Service Ready
C: HELO client.example.com
S: 250 Hello client.example.com
C: MAIL FROM:<[email protected]>
S: 250 OK
C: RCPT TO:<[email protected]>
S: 250 OK
C: DATA
S: 354 Send message content; end with <CRLF>.<CRLF>
C: The message data (body text, subject, e-mail header, attachments etc) is sent
C: .
S: 250 2.0.0 Ok: queued as D7D3E84403
C: QUIT
S: 221 Bye

Assim, o SMTP é o protocolo de chatty, toda vez que o comando de emissão do cliente (HELO / MAIL / RCPT / DATA / QUIT), o servidor deve respondê-lo antes que a transação continue. Neste caso, toda a resposta tem código 250, ou na linguagem humana eu aceitei .

Transação SMTP de

Caso 2 para vários destinatários

S: 220 smtp.example.net Simple Mail Transfer Service Ready
C: HELO client.example.com
S: 250 Hello client.example.com
C: MAIL FROM:<[email protected]>
S: 250 OK
C: RCPT TO:<[email protected]>
S: 250 OK
C: RCPT TO:<[email protected]>
S: 250 OK
C: RCPT TO:<[email protected]>
S: 250 OK
C: DATA
S: 354 Send message content; end with <CRLF>.<CRLF>
C: The message data (body text, subject, e-mail header, attachments etc) is sent
C: .
S: 250 2.0.0 Ok: queued as D7D3E84403
C: QUIT
S: 221 Bye

Neste exemplo, há três destinatários. Estamos usando vários comandos RCPT em uma única transação. O comando RCPT é um comando especial. Esse comando pode ser repetido várias vezes para uma determinada mensagem de email para entregar uma única mensagem de email a vários destinatários.

Caso 3 Se alguns destinatários rejeitarem (mas não todos), a transação foi continuada. Aqui a transação de amostra.

S: 220 smtp.example.net Simple Mail Transfer Service Ready
C: HELO client.example.com
S: 250 Hello client.example.com
C: MAIL FROM:<[email protected]>
S: 250 OK
C: RCPT TO:<[email protected]>
S: 250 OK
C: RCPT TO:<[email protected]>
S: 550 5.1.1 <[email protected]>: Recipient address rejected: User unknown in local recipient table
C: RCPT TO:<[email protected]>
S: 250 OK
C: DATA
S: 354 Send message content; end with <CRLF>.<CRLF>
C: The message data (body text, subject, e-mail header, attachments etc) is sent
C: .
S: 250 2.0.0 Ok: queued as D7D3E84403
C: QUIT
S: 221 Bye

Por que o servidor ainda aceita o email? Porque existem dois destinatários válidos ao lado de um inválido.

Disclaimer: Acima dos recursos retirados aqui .

(sem sucesso) Tentativa de reproduzir o problema

OK, tentei reproduzir seu problema na minha caixa. Este é o meu código PHP com biblioteca PHPMailer . (Eu não estou familiarizado com o zend Framework)

<?php
require '../PHPMailerAutoload.php';

$internaldomain = 'in.example.com';
$externaldomain = 'ex.example.com';

$mail = new PHPMailer;

$mail->isSMTP();
$mail->SMTPDebug = 2;
$mail->Host = "smtp6.example.com";
$mail->Port = 25;
$mail->SMTPAuth = false;

$mail->setFrom('from@' . $internaldomain, 'First Last');
$mail->addAddress('valid@' . $externaldomain, 'valid 1');
$mail->AddBCC('bounce@' . $internaldomain, 'valid 3');
$mail->AddBCC('invaliduser@' . $internaldomain, 'invalid user');
$mail->AddBCC('root@' . $internaldomain, 'valid 4');

$mail->Subject = 'PHPMailer SMTP test';
$mail->IsHTML(false);
$mail->Body    = "This is test";

if (!$mail->send()) {
    echo "Mailer Error: " . $mail->ErrorInfo;
} else {
    echo "Message sent!";
}

Como SMTPDebug foi ativado, a saída contém uma transação SMTP completa. Esta saída é semelhante ao exemplo acima.

SERVER -> CLIENT: 220 smtp6.example.net ESMTP at your service
CLIENT -> SERVER: EHLO web.example.net
SERVER -> CLIENT: 250-smtp6.example.net
                  250-PIPELINING
                  250-SIZE 10240000
                  250-VRFY
                  250-ETRN
                  250-ENHANCEDSTATUSCODES
                  250-8BITMIME
                  250 DSN
CLIENT -> SERVER: MAIL FROM:<[email protected]>
SERVER -> CLIENT: 250 2.1.0 Ok
CLIENT -> SERVER: RCPT TO:<[email protected]>
SERVER -> CLIENT: 250 2.1.5 Ok
CLIENT -> SERVER: RCPT TO:<[email protected]>
SERVER -> CLIENT: 250 2.1.5 Ok
CLIENT -> SERVER: RCPT TO:<[email protected]>
SERVER -> CLIENT: 550 5.1.1 <[email protected]>: Recipient address rejected: User unknown in local recipient table
SMTP ERROR: RCPT TO command failed: 550 5.1.1 <[email protected]>: Recipient address rejected: User unknown in local recipient table
CLIENT -> SERVER: RCPT TO:<[email protected]>
SERVER -> CLIENT: 250 2.1.5 Ok
CLIENT -> SERVER: DATA
SERVER -> CLIENT: 354 End data with <CR><LF>.<CR><LF>
CLIENT -> SERVER: Date: Wed, 19 Nov 2014 09:28:16 +0700
CLIENT -> SERVER: To: valid 1 <[email protected]>
CLIENT -> SERVER: From: First Last <[email protected]>
CLIENT -> SERVER: Subject: PHPMailer SMTP test
CLIENT -> SERVER: Message-ID: <[email protected]>
CLIENT -> SERVER: X-Priority: 3
CLIENT -> SERVER: X-Mailer: PHPMailer 5.2.9 (https://github.com/PHPMailer/PHPMailer/)
CLIENT -> SERVER: MIME-Version: 1.0
CLIENT -> SERVER: Content-Type: text/plain; charset=iso-8859-1
CLIENT -> SERVER: Content-Transfer-Encoding: 8bit
CLIENT -> SERVER:
CLIENT -> SERVER: This is test
CLIENT -> SERVER:
CLIENT -> SERVER: .
SERVER -> CLIENT: 250 2.0.0 Ok: queued as D7D3E84403
CLIENT -> SERVER: QUIT
SERVER -> CLIENT: 221 2.0.0 Bye

e a entrada do maillog

Nov 19 09:28:16 cache postfix/smtpd[14865]: D7D3E84403: client=unknown[192.168.192.100]
Nov 19 09:28:16 cache postfix/smtpd[14865]: D7D3E84403: reject: RCPT from unknown[192.168.192.100]: 550 5.1.1 <[email protected]>: Recipient address rejected: User unknown in local recipient table; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<web.example.net>
Nov 19 09:28:16 cache postfix/cleanup[14867]: D7D3E84403: message-id=<[email protected]>
Nov 19 09:28:17 cache postfix/qmgr[1200]: D7D3E84403: from=<[email protected]>, size=617, nrcpt=3 (queue active)
Nov 19 09:28:17 cache postfix/local[14870]: D7D3E84403: to=<[email protected]>, relay=local, delay=0.21, delays=0.21/0/0/0, dsn=2.0.0, status=sent (delivered to mailbox)
Nov 19 09:28:17 cache postfix/smtp[14869]: D7D3E84403: to=<[email protected]>, relay=example.org[192.168.3.3]:25, delay=0.22, delays=0.21/0/0/0.01, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 3jj7Hj0pM3z5Twh)
Nov 19 09:28:17 cache postfix/local[14868]: D7D3E84403: to=<[email protected]>, relay=local, delay=0.23, delays=0.21/0/0/0.02, dsn=2.0.0, status=sent (forwarded as 165E084404)
Nov 19 09:28:17 cache postfix/qmgr[1200]: D7D3E84403: removed

Bem, parece que na minha caixa, o postfix e o PHPMailer se comportam em circunstâncias normais. Você pode usar isso para comparar com maillog na sua caixa:)

    
por 19.11.2014 / 05:09
1

Não é bem assim que funcionam os servidores de correio. Eles são projetados para enviar o email ou retornar o erro / motivo da falha ao usuário final se algo não funcionar. Alterar esse comportamento altera a maneira como o SMTP funciona.

Como a página da Wiki em NDRs diz:

NDRs are a basic SMTP function. As soon as an MTA has accepted a mail for forwarding or delivery it cannot silently delete ("drop") it; it has to create and send a bounce message to the originator if forwarding or delivery failed.

    
por 18.11.2014 / 13:13
-1

Modifique seu arquivo Postfix / main.cf removendo o comentário da seguinte entrada no arquivo. Reinicie o postfix e tente enviar novamente.

local_recipient_maps

O que estava acontecendo no cliente do aplicativo de e-mail tentando enviar e-mail é diferente de você realizar um teste via linha de comando, pois o fluxo de e-mail é permitido na linha de comando para continuar, mas falhou imediatamente quando um endereço local ruim foi detectado.

    
por 24.02.2016 / 17:18

Tags