我在一个非常小众的应用程序中采用了 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
用更强大的脚本来替换该脚本,也许在其中实现一些简单的模式匹配等等。