Como encaminhar endereços dinamicamente determinados com o Postfix?

1

Cada mensagem para um usuário local deve ir para um endereço que é obtido executando um comando externo. Esse comando examinará a tag de endereço local, fará chamadas de API para vários processos e, em seguida, calculará o endereço de destino.

Por exemplo, poderíamos usar um arquivo .forward no diretório inicial do usuário para enviar a mensagem ao comando (| comando), que então seria responsável pelo encaminhamento da mensagem também. "Um arquivo alias ou ~ / .forward pode listar qualquer combinação de comandos externos, nomes de arquivos de destino,: include: diretivas ou endereços de email." Veja: www.postfix.org/local.8.html Também: www.postfix.org/aliases.5.html

Talvez seja necessário ajustar apenas o cabeçalho Para e reenviar a mensagem via Postfix? Algo me diz que não é tão simples. O mais simples seria se o próprio Postfix lidasse com todo o trabalho de encaminhamento, como acontece quando o endereço de destino é gravado diretamente no arquivo .forward. Mas o endereço é desconhecido; só pode ser determinado pelo comando. Esse é o problema.

Além disso, se o endereço de destino não puder ser determinado, a mensagem deverá ser devolvida com um aviso de falha fornecido pelo comando.

Solução conforme implementada

Esta solução expande a resposta de Danila. Especificamente, ele redireciona o e-mail para certos usuários do wiki, conhecidos como "pipes" [2], transmitindo-o para "minders" que são designados no wiki [1]. Mas geralmente deve ser aplicável a qualquer retransmissão em que o endereço de destino é determinado dinamicamente por um script.

(a) No arquivo /etc/postfix/main.cf:

transport_maps = regexp:/etc/postfix/transport.regexp
# enable transport mapping based on regular expressions

minder_destination_recipient_limit = 1
# See SINGLE-RECIPIENT DELIVERY [3].  relay-to-minder (master.cf) can handle only a
# single recipient per delivery, and flags DO have the same limitation.

(b) No arquivo /etc/postfix/transport.regexp [4], faça o mapeamento de transporte:

if /^pipe\+.+@zelea\.com$/
# relay all deliveries for pipe users [2] ...
!/^pipe\+bounceSpam@/ minder:
# ... except 'bounceSpam' deliveries, via master.cf 'minder' service
endif

(c) No arquivo /etc/postfix/master.cf, defina o serviço 'minder':

# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
minder    unix  -       n       n       -       1       pipe
  flags=DO user=pipe argv=/usr/local/libexec/relay-to-minder ${sender} ${recipient}
# With maxproc 1 because it's sufficient, let Postfix do all queuing.
# Both flags D and O (adding headers Delivered-To and X-Original-To) require main.cf
# minder_destination_recipient_limit=1 [3]

(d) Torne o script relay-to-minder executável pelo usuário (pipe) especificado em master.cf user =. O conteúdo do script (incluindo a versão mais recente dessas notas de configuração) está localizado em link

O script endereça novamente os cabeçalhos de destino (ainda não tem certeza de que é apropriado), endereça novamente o envelope e o envia de volta ao MTA para entrega final.

Notas

[1] zelea.com/w/Property:Minder

[2] zelea.com/w/Category:Pipe

[3] Esse significado de "pipe" difere de [2]. www.postfix.org/pipe.8.html

[4] www.postfix.org/transport.5.html | www.postfix.org/regexp_table.5.html

Perdoe os links mungados. Eu não ganhei pontos brownie suficientes.

    
por Michael Allan 07.05.2013 / 03:15

1 resposta

2

O jeito certo de fazer isso é criar um novo transporte em master.cf

Algo parecido com isto:

myscript unix -  n  n   -  40   pipe
flags=R user=vmail argv=/path/to/myscript -o SENDER=${sender} -m USER=${user} EXTENSION=${extension}

Você pode usar seus próprios parâmetros.

Então você pode usar o regexp para suas regras de captura

transport_maps = regexp:/etc/postfix/redirect_or_forward.regexp

Em seguida, em /etc/postfix/redirect_or_forward.regexp

Algo como:

 /^user-.*@mydomain\.com/   myscript:

Leia em postfix docs, deve haver explicações mais abrangentes sobre isso. Espero que isso ajude.

    
por 07.05.2013 / 03:35