Postfix (usuários virtuais) + dovecot + peneira: o envelope não contém o destinatário original

2

Eu configurei meu servidor de e-mail seguindo o tutorial do ISPMail com usuários virtuais no postfix + dovecot + peneira. Meu problema é: a envelop "variável" na peneira não contém o destinatário original.

Eu tenho uma conta de e-mail, vamos chamá-la de [email protected] e aliases adicionais configurados para o postfix, que todos enviam para o endereço mencionado acima:

[email protected] -> [email protected]
@domain.com -> [email protected]

O último sendo um endereço abrangente.

O postfix chama o dovecot com a seguinte linha de configuração em master.cfg :

dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -d ${user}@${nexthop} -a ${recipient}

Com peneira eu quero colocar todos os e-mails recebidos para o endereço pega-tudo em uma pasta específica. Meu código de peneira é assim:

if envelope :is :domain "To" "domain.com" {
  fileinto "special-folder";
}

Isso infelizmente não funciona. Aprofundando, descobri que o que está dentro de envelop é sempre o endereço de entrega final, ou seja, [email protected] neste caso. Eu encontrei isso usando a seguinte regra:

if envelope :matches "To" "*" {
  fileinto "${1}";
}

E o registro da peneira me dizendo:

failed to store into mailbox '[email protected]': Mailbox doesn't exist: [email protected].

Eu já estou supondo que isso deve ser um problema em algum lugar entre o postfix e o dovecot, pois o log de e-mail me diz o seguinte:

Aug 29 10:38:27 *** dovecot: lda([email protected]): sieve: msgid=<54003C01.1080704@***>: stored mail into mailbox 'INBOX'
Aug 29 10:38:27 *** dovecot: lda([email protected]): Error: sieve: execution of script /var/vmail/example.org/mail/dovecot.sieve failed, but implicit keep was successful (user logfile /var/vmail/example.org/mail/dovecot.sieve.log may reveal additional details)
Aug 29 10:38:27 *** postfix/pipe[12469]: A31A28006B: to=<[email protected]>, orig_to=<[email protected]>, relay=dovecot, delay=0.29, delays=0.18/0.01/0/0.1, dsn=2.0.0, status=sent (delivered via dovecot service)

Obviamente o postfix declara o destinatário original ([email protected]) e a caixa de correio entregue ([email protected]), mas de alguma forma essa informação se perde no caminho para o dovecot!

    
por Artemis 29.08.2014 / 11:16

2 respostas

3

Após alguns testes (a resposta do masegaloeh e a ajuda de um amigo forneceu algumas dicas úteis) há duas maneiras (ambos parecem funcionar igualmente bem):

  1. Use ${original_recipient} em vez de ${recipient} :

    Como man pipe nos diz " Esta macro se expande para o endereço completo do destinatário antes que qualquer endereço seja reescrito ou aliasing "então é a solução para o meu problema. Portanto, a linha de comando modificada em master.cf deve se parecer com

    dovecot   unix  -       n       n       -       -       pipe
      flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -d ${user}@${nexthop} -a ${original_recipient}
    
  2. Use um X-Original-To header e diga ao dovecot para definir seu envelope para este campo de cabeçalho:

    Como o masegaloeh sugeriu, adicionei O ao postfix de sinalização para adicionar o cabeçalho X-Original-To . Por dentro /etc/dovecot/conf.d/15-lda.conf digo ao dovecot para usar este cabeçalho para o envelope:

    lda_original_recipient_header = X-Original-To
    

    Como o comentário acima dessas opções de configuração nos diz, não devemos usar a opção -a ao chamar dovecot-lda via postfix porque ela substitui essa configuração. Assim, o master.cf se parece com:

    dovecot   unix  -       n       n       -       -       pipe
      flags=DORhu user=vmail:vmail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -d ${user}@${nexthop}
    
por 30.08.2014 / 21:06
3

Esse comportamento ocorreu porque você adicionou {recipient} macro no argumento dovecot-lda . Conforme declarado em man pipe , o postfix substituirá a macro pelo destinatário final (mail.example.org) em vez de não originais ([email protected]).

Em vez de analisar o envelope, você pode analisar outro cabeçalho como X-Original-To . Este cabeçalho pretendia preservar o destinatário original antes de reescrever ou alterar o alias. Para habilitar este cabeçalho, edite master.cf para que a linha dovecot se torne (note que o argumento de flag foi editado)

dovecot   unix  -       n       n       -       -       pipe
  flags=DROhu user=vmail:vmail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -d ${user}@${nexthop} -a ${recipient}

Então seu script de peneira se torna

if header :matches "X-Original-To" "*" {
  fileinto "${1}";
}

Um pouco complicado, mas o resultado é que você pode ter o destinatário original e seus aliases.

    
por 30.08.2014 / 16:34