如何基于收件人域名配置Postfix将邮件投递至自定义MailDir路径
嘿,不用折腾多个Postfix实例啦!你的需求完全可以用Postfix的虚拟邮箱映射功能搞定,比postmulti简单太多,我给你一步步讲清楚:
核心思路
我们要利用Postfix的virtual_mailbox_maps把每个「用户名@域名」组合直接映射到对应的自定义MailDir路径,再配合虚拟投递代理完成邮件存储,同时配置发件人身份映射确保能正常发信。
具体配置步骤
1. 声明负责的域名
首先在Postfix主配置文件/etc/postfix/main.cf里,告诉Postfix哪些域名是我们要处理的:
# 把目标域名设为虚拟邮箱域名 virtual_mailbox_domains = domain1.com domain2.com
2. 创建收件人到MailDir的映射表
新建一个映射文件,比如/etc/postfix/virtual_mailbox_maps,按你的需求填写条目:
user1@domain1.com some/custom/MailDir/ user2@domain2.com different/custom/MailDir/ user3@domain1.com custom/user3/domain1/mail/ user3@domain2.com different/user3/domain2/mail/
注意每个条目末尾的/很重要,Postfix会识别这是MailDir格式的路径。
然后生成Postfix能识别的哈希表:
postmap /etc/postfix/virtual_mailbox_maps
3. 配置投递规则
回到main.cf,添加以下配置,告诉Postfix怎么处理这些虚拟邮箱的投递:
# 指定使用virtual投递服务 virtual_transport = virtual # 设置路径基准为根目录,让映射里的路径直接作为绝对路径生效 virtual_mailbox_base = /
4. 确保投递服务正常运行
检查/etc/postfix/master.cf里有没有virtual服务的条目,默认应该存在,如果没有就补上:
virtual unix - n n - - virtual
5. 配置发件人身份验证(支持发邮件)
要让用户能从这些地址发邮件,需要把发件人地址和可登录的系统/SASL用户绑定。新建/etc/postfix/smtpd_sender_login_maps:
user1@domain1.com local_user1 user2@domain2.com local_user2 user3@domain1.com local_user3 user3@domain2.com local_user3
这里的local_user1等是系统中存在的用户(或者你用SASL认证的用户名)。同样生成哈希表:
postmap /etc/postfix/smtpd_sender_login_maps
然后在main.cf里启用这个映射:
smtpd_sender_login_maps = hash:/etc/postfix/smtpd_sender_login_maps # 确保允许认证后的用户发信 smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
6. 权限检查
最后别忘了给Postfix运行用户(通常是postfix)赋予这些MailDir路径的读写权限,比如:
chown -R postfix:postfix /some/custom/MailDir/ /different/custom/MailDir/ /custom/user3/ /different/user3/
为什么不用postmulti?
多个Postfix实例会大幅增加管理复杂度,比如要维护多套配置、日志,还要处理端口冲突等问题。而虚拟邮箱配置是Postfix原生支持的轻量方案,完全能满足你的需求。
重启Postfix让配置生效:
systemctl restart postfix
备注:内容来源于stack exchange,提问作者user10709800




