配置 Postfix 虚拟传输以将邮件传递到任意(本地)地址

配置 Postfix 虚拟传输以将邮件传递到任意(本地)地址

我在一个非常小众的应用程序中采用了 Postfix,这个应用程序没有入站或出站 SMTP 连接(除了通过环回接口)。

我想配置 postfixvirtual传输,以便将邮件发送到与特定模式匹配的任意地址的本地文件。也就是说,假设最终传输是virtual,我希望将 的邮件foo0发送到/var/vmail/foo0,将 的邮件foo100发送到/var/vmail/foo100,等等。这些文件应全部归同一 uid/gid 所有,并通过静态virtual_uid_maps和进行管理virtual_gid_maps

问题在于,具体的目标地址事先并不知道。

真的想要的是这样的:

virtual_mailbox_maps = regexp:/etc/postfix/vmailbox

包含vmailbox类似以下内容:

/^(foo[0-9]*)(@.*)?/ ${1}

但是virtual传输明确不支持正则表达式替换......也不支持socketmap表类型,这将是解决这个特定问题的另一种方法。

我想我可以使用自定义传输来解决这个问题,但我希望不要编写 MDA。

有什么方法可以让它工作吗?

答案1

经过一些额外的研究,我发现这比我想象的要容易。

main.cf

mydestination = localhost

# leave valid recipient checking up to the mda
local_recipient_maps =

# don't permit any outbound mail
default_transport = error:No outbound mail delivery!

# look up transport via transport map
transport_maps = lmdb:transport

transport

# deliver root locally
root@localhost  local:localhost

# deliver everything else via our fakemail transport
*               fakemail:

master.cf

fakemail unix  -       n       n       -       -       pipe
        flags=DBFRXhu directory=/var/spool/vmail user=fakemail:fakemail
        argv=/usr/local/bin/fakemail ${user}

并且fakemail

#!/bin/sh

umask 007
cat >> "$1"

使用上述配置,echo test message | mail -s test root将转到/var/mail/root。任何其他不合格地址将通过fakemail脚本传送到/var/spool/vmail/<user>。例如:

# echo test message | mail -s test1 user001
# echo test message | mail -s test2 user001
# mail -f /var/spool/vmail/user001
Mail version 8.1.2 01/15/2001.  Type ? for help.
"/var/spool/vmail/user001": 2 messages 2 new
>N  1 root@localhost     Sat Nov 11 20:40   16/482   test1
 N  2 root@localhost     Sat Nov 11 20:40   16/482   test2

我们显然可以fakemail用更强大的脚本来替换该脚本,也许在其中实现一些简单的模式匹配等等。

相关内容