我使用 exim 和 dovecot。所有用户都是虚拟的,即他们来自数据库。查找给定的目标地址localpart@domain
可能会产生包含目标邮箱或目标电子邮件地址的多个行。
以下路由器可以正常工作,可以正确传送所有电子邮件:
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/\$2/\$1/Maildir/}}
那个“代码”很旧,最初不是我写的,但它能工作,我知道为什么:如果目标是邮箱(/mailboxname
),它会将其转换为路径,这将导致directory_transport
调用。否则,目标是地址,这将导致重定向司机来处理。
不过,我现在想使用它dovecot-lda
进行本地送货。
这意味着我需要调用一个传输程序,然后从中获取邮箱名称和域$address_data
并将其传递给它:
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
...
但是,我看不出有办法让redirect
路由器调用该传输。当使用accept
除路由器之外的单独路由器redirect
时,它只会传送到第一个目标邮箱,因为它似乎无法处理address_data
路由器查找中的多行结果:
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) = '/'; }}
我想知道是否有办法解决这个问题。