Por que o procmail envia uma cópia de uma mensagem de entrada ao remetente se encontrar um código de saída?

3

Eu tenho um processo procmail muito simples que recebe um email de entrada e o redireciona para um script:

LOGFILE=/home/foo/procmail-log
VERBOSE=yes
MAILDIR=/var/spool/mail/foo
DEFAULT=/var/spool/mail/foo
SHELL=/bin/sh

:0
! '/home/foo/scripts/blah/blah.sh'

O script de shell tem uma condição que gera um arquivo para o endereço de email de um remetente e, se for encontrado, sai:

grep i "$SENDER" /home/foo/scripts/blah/blah2.txt

if [[ $? -eq 0 ]] ; then
    exit 1
fi

Quando isso acontece, quero que o procmail simplesmente desista / descarte a mensagem.

Curiosamente, no entanto, se isso disparar, o procmail recebendo o valor que eu acabei de encontrar e tentando enviar um email para ele.

No log do procmail, vejo:

procmail: Notified comsat: "foo@:/usr/sbin/sendmail -oi [email protected] [email protected]"
From [email protected]  Thu Feb  6 22:31:47 2014
 Subject: Test
  Folder: /usr/sbin/sendmail -oi [email protected] sender     3165
procmail: Executing "/usr/sbin/sendmail,-oi,[email protected],[email protected]"

Por que isso está acontecendo? Existe alguma maneira eu posso configurar o procmail para não fazer isso? Eu só quero que ele desista e solte o e-mail anterior que estava processando. Eu tentei códigos de saída diferentes (0, 1, 77), mas procmail sempre faz a mesma coisa. Alguma idéia?

    
por Mike B 07.02.2014 / 08:32

2 respostas

3

O Procmail faz grandes esforços para garantir que o e-mail não seja perdido, mesmo se a entrega falhar. De acordo com man procmail , os e-mails serão devolvidos ao remetente como último recurso:

   ORGMAIL     Usually  the system mailbox (ORiGinal MAIL‐
               box).  If, for some  obscure  reason  (like
               'filesystem  full')  the  mail could not be
               delivered, then this mailbox  will  be  the
               last resort.  If procmail fails to save the
               mail in here (deep, deep trouble :-),  then
               the mail will bounce back to the sender

Há, no entanto, uma variável de ambiente que pode ser definida para permitir que o email seja descartado em vez de devolvido:

   DELIVERED   If set to 'yes' procmail will  pretend  (to
               the  mail  agent)  the mail has been deliv‐
               ered.  If mail cannot  be  delivered  after
               having  met this assignment (set to 'yes'),
               the mail will be lost (i.e.,  it  will  not
               bounce).
    
por 07.02.2014 / 08:59
0

Vamos examinar sua ação:

:0
! 'script'

O significado dos backticks é "use a saída de script como uma string aqui". Então, se o seu script gerar [email protected] , a receita será efetivamente equivalente a

:0
! [email protected]

que significa encaminhar a mensagem para [email protected] . O comportamento que você descreve não deve, portanto, ser surpreendente; Procmail está fazendo exatamente o que você está dizendo para fazer.

Se você quiser apenas descartar a mensagem completamente se o seu script retornar com sucesso, você pode tentar este truque:

:0W
| script

Isso é basicamente o mesmo que o formail -D exemplo para suprimir duplicatas ; se o script retornar um status de saída bem-sucedida, a mensagem será considerada entregue; mas como o script não o entrega em qualquer lugar, na verdade ele está perdido. (Você obviamente precisará alterar a lógica do seu script para que o código de saída seja o inverso do que é agora.)

Caso você queira que a sintaxe seja resolvida para você, aqui está uma tentativa mais geral de fazer o que você acha que estava fazendo:

:0
? script
! somewhere

que encaminhará para somewhere se o código de saída de script for zero (como em sucesso); ou possivelmente

# Capture the output from script in WHERE
WHERE='script'
# Also capture its exit code
ERR=$?

# Forward to $WHERE if $ERR is zero
:0
* ERR ?? ^^0^^
! $WHERE

(Vários detalhes arcanos da sintaxe incomum do Procmail estão presentes aqui. O operando ?? examina o valor da variável nomeada; a ^^ anchor corresponde ao início / fim da string de entrada.)

Se o seu script não for mais complexo do que isso, você também pode incorporá-lo. (Observe a correção de sintaxe com um traço antes da opção i e a inversão do status de saída com ! ):

:0
* ! ? grep -i "$SENDER" /home/foo/scripts/blah/blah2.txt
! somewhere
    
por 10.02.2014 / 18:22