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.