如何投递到多个目的地(电子邮件地址和(通过 dovecot-lda)邮箱)

如何投递到多个目的地(电子邮件地址和(通过 dovecot-lda)邮箱)

我使用 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) = '/'; }}

我想知道是否有办法解决这个问题。

相关内容