É possível rejeitar certos emails no procmail? [Em rejeições de sessão SMTP com base no conteúdo de email]

1

Vamos supor uma configuração típica na qual o procmail é chamado pelo sendmail para filtrar os emails recebidos em caixas de correio corretas. Isso é feito enquanto a conexão SMTP de entrada para o sendmail ainda está ativa ou está sendo feita após o email já ter sido aceito?

Se o primeiro entao eu entendo que poderia ser possivel para o procmail retornar ao sendmail um erro para que o sendmail responda com um codigo de erro, por exemplo 554 Transaction failed enquanto aceita o SMTP DATA , em vez dos habituais 200?

No meu caso, o sendmail chama o procmail do banco de dados aliases com entradas como esta:

theaddres:   theaddres-somedomain-com.virtual

theaddres-somedomain-com.virtual:   |"/usr/libexec/sm.bin/someuser.virtual somedomain@theaddress"

Que então executa o script do procmail:

root@mda:/etc/mail # less /usr/libexec/sm.bin/someuser.virtual 
/usr/local/bin/procmail -a $1 /usr/local/etc/procmailrc/someuser.virtual

EDITAR:

Adicionando uma explicação mais detalhada. Primeiramente, gostaria de definir se o fluxo descrito abaixo, que é baseado no exemplo da Wikipédia , é possível no SMTP protocolo em tudo. Se sim, então se seria possível com o procmail. Então, se não (o que eu acho que é o caso), se existe uma implementação (por exemplo, milter) em que seria possível.

S: 220 smtp.example.com ESMTP Postfix
C: HELO relay.example.org 
S: 250 Hello relay.example.org, I am glad to meet you
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: DATA
S: 354 End data with <CR><LF>.<CR><LF>
C: From: "Bob Example" <[email protected]>
C: To: "Alice Example" <[email protected]>
C: Cc: [email protected]
C: Date: Tue, 15 January 2008 16:02:43 -0500
C: Subject: Test message
C: 
C: Hello Alice.
C: This is a test message with 5 header fields and 4 lines in the message body.

Now this is what I would like to see:
S (after receiving the first 2 lines out of 4): 452 Requested action not taken: insufficient system storage
C: QUIT
S: 221 Bye
{The server closes the connection}

Assim, o servidor para de receber o email (por exemplo, porque detectou no email a sequência "Esta é uma mensagem de teste") e responde ao cliente com um erro. Nesse caso, é 452, mas pode ser qualquer erro válido em resposta à solicitação de dados . E o cliente pode ou não responder com o QUIT, eu não me importo.

Isso provavelmente depende de como o protocolo SMTP é implementado no nível do TCP. Posso limitar a quantidade de DATA recebida do cliente para, digamos, 50 bytes iniciais (por exemplo, limitando o tamanho do quadro TCP)? O protocolo SMTP me permite responder com um erro enquanto o cliente está enviando o conteúdo de DATA?

Além disso, se o servidor desconectou intencionalmente depois de receber a parte inicial de DATA (em vez de tentar enviar ao cliente um erro), não seria diferente a conexão TCP ser acidentalmente interrompida durante a transmissão do email. Um MTA bem comportado tentaria se reconectar e reenviar o e-mail, um spammer provavelmente não se incomodaria em tentar novamente.

    
por Amiramix 04.05.2016 / 13:20

3 respostas

1

O que você está descrevendo é perfeitamente viável, mas o Sendmail irá produzir uma mensagem de rejeição nesta situação; isso faz parte do design do protocolo. A maneira de fazer isso é fazer o Procmail abortar com um código de saída adequado, para comunicar o motivo do retorno ao Sendmail.

Por exemplo, para retornar um erro "desconhecido do usuário",

:0
* ^Received: from badhelo \(badhost \[10\.9\.8\.7\]\) by yourhost
{ EXITCODE=67 HOST= }

O EXITCODE especifica com qual código de retorno sair, e reatribuir HOST tem o efeito colateral obscuro, mas bem documentado, de abortar o Procmail imediatamente.

Consulte o link para obter mais detalhes e, por exemplo, sysexits.h para uma lista dos códigos de saída reais.

Você não terá controle sobre se isso acontece durante ou após a conclusão da transação SMTP. Minha lembrança de quando o Sendmail ainda era popular era que ele de fato processaria as regras do Procmail enquanto a mensagem estava sendo recebida, mas isso é um detalhe de implementação que pode depender de várias circunstâncias, e talvez mudar entre as versões. De qualquer forma, o SMTP é um protocolo de armazenamento e encaminhamento; se a transação falhar e o cliente já tiver desconectado, o servidor tentará se conectar ao servidor MX do remetente para entregar a devolução. (Existem situações em que isso é indesejável; portanto, por exemplo, uma devolução de uma rejeição não deve ser gerada e entregue.)

De qualquer forma, para que o Procmail possa processar qualquer coisa, você precisará receber a mensagem inteira; explicitamente a falha da transação DATA do SMTP neste estágio final é bastante inútil, pois você não pode desfazer o recebimento. Se você quiser abandonar uma mensagem silenciosamente quando o DATA for concluído, basta entregá-lo em /dev/null .

Dito isto, é benéfico rejeitar o mais cedo possível. Se você puder implementar um bloco de nível de IP contra os remetentes inválidos, isso seria muito mais simples e gentil na pilha de rede. (Entre as linhas que estou lendo, "rede zumbi" - você sabe se esses remetentes estão bloqueados, por exemplo, pelos DNSBLs da Spamhaus?)

    
por 06.05.2016 / 06:27
1

Acho que o procmail age como um mensageiro local que é executado depois que o email é aceito. Basicamente, é o próximo passo na entrega. Portanto, não pode afetar a conexão que está aceitando o email para o processo do sendmail. Pense em um exemplo diferente quando você envia o email localmente para outro usuário local. Ele é aceito primeiro no processo do sendmail e, se o outro usuário local estiver ausente, você receberá uma mensagem de erro por outro e-mail.

    
por 04.05.2016 / 13:44
1

Já pensou em usar o milter (por exemplo, MIMEDefang.org milter)?
O comportamento do MIMEDefang é controlado pelo script customizado do perl. Deve ser possível obter rejeições na sessão SMTP com base no conteúdo da mensagem. Também tornará a solução portátil para outros MTAs, e. postfix.

Exemplos clássicos de MIMEDefang incluem a rejeição de mensagens com altas pontuações de SpamAssassin (spamines). Só pode bloquear a maioria desses e-mails.

    
por 05.05.2016 / 14:56