Temos um servidor SMTP postfix, usado para retransmitir emails para scripts da web dos clientes. O Postfix está usando a verificação do endereço do destinatário com reject_unverified_recipient
in smtpd_recipient_restrictions
(é obrigatório, caso contrário, devido ao alto número de devoluções indesejadas):
smtpd_recipient_restrictions =
reject_unknown_recipient_domain
reject_unverified_recipient
permit_mynetworks
reject_unauth_destination
check_recipient_access hash:/etc/postfix/validrcptto
O problema é que a primeira vez que algum endereço de e-mail é usado, isso resultará em 450 4.1.1 <[email protected]>: Recipient address rejected: unverified address: Address verification in progress
erros temporários, que o cliente deve tentar novamente mais tarde (conforme definido na seção 4.5.4.1 da RFC 5321 )
Embora o 4xx
erro desapareça em poucos segundos (na grande maioria dos casos, ou seja substituído por 5xx
um erro permanente), os scripts da Web dos clientes (é claro) tentam apenas uma vez.
Embora seja relativamente trivial implementar em scripts da web (substituir SEND_MAIL
por while (count++ < 10) { SEND_MAIL; sleep(3) }
pseudo-código), o número de clientes diferentes, bases de código de terceiros com suas atualizações automáticas etc.
O que eu gostaria é algo como reject_unverified_recipient_after_autoretry=30s
que não responderia imediatamente RCPT TO
, 450 Address verification in progress
mas bloquearia, esperando alguns segundos na esperança de que o Verify(8) termine e tente novamente, e só retorne 450
se após (digamos) 30 segundos o código ainda estiver 450
.
Observação: aceitar todos os e-mails de scripts da web não é aceitável (mesmo se o remetente estiver definido como <>
ou alguma caixa de correio autônoma/bloqueada) - realmente queremos a verificação de endereço e queremos que os aplicativos da web obtenham 5xx
erros se pudermos saber que o e-mail não será capaz de alcançar o destinatário.
Encontrado eventualmente, as opções necessárias (não mencionadas na página de
verify(8)
manual) são:Isso aguardará a conclusão da verificação
RCPT TO
de endereço por 6 iterações de 5 segundos (portanto, até 30 segundos) antes de retornar o erro (sob carga alta, ele tentaria apenas uma vez). Obviamente, se a verificação de endereço terminar antes, ela retornará antes.450 4.1.1 <[email protected]>: Recipient address rejected: unverified address: Address verification in progress
Então exatamente o que eu precisava!
As opções estão disponíveis no Postfix 2.1 e posterior