Como entregar para vários destinos (endereços de e-mail e caixas de correio (via dovecot-lda))

2

Estou usando o exim e o dovecot. Todos os usuários são virtuais, ou seja, eles são provenientes de um banco de dados. Uma pesquisa de endereços de destino para um determinado localpart@domain pode gerar várias linhas contendo a caixa de correio de destino ou o endereço de email de destino.

O seguinte roteador funciona bem para entregar todos os e-mails corretamente:

pg_aliases:
  driver = redirect
  directory_transport = address_file
  data = ${sg{\
              ${lookup pgsql { SELECT CASE WHEN substr(c_dest, 1, 1) = '/' THEN (c_dest||'@@'||c_domain) ELSE c_dest END FROM aliases WHERE c_local = '${quote_pgsql:$local_part}' AND c_domain = realDomain('${quote_pgsql:$domain}');}}}\
              {/(.+)@@(.+)}\
              {/var/spool/mail/\/\/Maildir/}}

Esse "código" é antigo e inicialmente não escrito por mim, mas funciona e eu vejo o porquê: se o destino for uma caixa de correio ( /mailboxname ), ele o converterá em um caminho que fará com que directory_transport seja invocado. Caso contrário, o destino é um endereço que fará com que o driver redirecionar lide com isso.

No entanto, gostaria de usar o dovecot-lda para entrega local agora.

Isso significa que precisarei chamar um transporte que levará o nome da caixa de correio e o domínio de $address_data e entregará a ele:

dovecot_lda:
  driver = pipe
  command = /usr/libexec/dovecot/dovecot-lda -d ${extract{dest}{$address_data}}@${extract{domain}{$address_data}} -f $sender_address -a $original_local_part@$original_domain
  ...

No entanto, não vejo como fazer a chamada do roteador redirect nesse transporte. Ao usar um roteador accept separado além do roteador redirect , ele só será enviado para a primeira caixa de correio de destino, pois não parece manipular resultados de várias linhas na pesquisa address_data do roteador:

pg_dovecot:
  driver = accept
  transport = dovecot_lda
  condition    = ${lookup pgsql { SELECT substr(c_dest, 2) AS dest, c_domain AS domain FROM aliases WHERE c_local = '${quote_pgsql:$local_part}' AND c_domain = realDomain('${quote_pgsql:$domain}') AND substr(c_dest, 1, 1) = '/'; }}
  address_data = ${lookup pgsql { SELECT substr(c_dest, 2) AS dest, c_domain AS domain FROM aliases WHERE c_local = '${quote_pgsql:$local_part}' AND c_domain = realDomain('${quote_pgsql:$domain}') AND substr(c_dest, 1, 1) = '/'; }}

Gostaria de saber se existe uma maneira de resolver este problema.

    
por ThiefMaster 10.10.2012 / 21:09

0 respostas

Tags