Postfix 如何把所有邮件重定向到单个用户?
用 Postfix 的 virtual_alias_maps 把所有入站邮件重定向到一个用户或邮箱:编辑 main.cf、编写 /etc/postfix/virtual 通配规则、postmap 生效,并附排查与 FAQ。
用 Postfix 的虚拟别名表(virtual alias map):在 main.cf 里指定 virtual_alias_maps = hash:/etc/postfix/virtual,然后在 /etc/postfix/virtual 里写一条通配规则把任意收件人映射到目标用户,最后 postmap 生成索引并 reload 即可。 这是测试环境收口邮件、防止误发外网的经典做法。
1. 修改 main.cf
sudo nano /etc/postfix/main.cf
添加(或修改)这一行:
virtual_alias_maps = hash:/etc/postfix/virtual
2. 编写虚拟别名规则
编辑 /etc/postfix/virtual,写入通配映射:
# 把发向本域任意收件人的邮件都转给 catchall 用户
@example.com catchall
- 左边
@example.com匹配该域下任意收件地址;换成具体地址则只转那一条。 - 右边可以是本机用户名,也可以是完整邮箱地址(如
ops@example.net,会再转发出去)。 - 多个域要分别写一行,或用正则表(
regexp:/etc/postfix/virtual_regexp)做更灵活的匹配。
3. 生成索引并生效
sudo postmap /etc/postfix/virtual
sudo systemctl reload postfix
postmap 会生成 virtual.db,Postfix 实际读取的是这个索引文件——每次改完 virtual 都必须重跑 postmap,否则不生效。
4. 验证与排查
- 发一封测试邮件后用
tail -f /var/log/mail.log(Ubuntu/Debian)或/var/log/maillog(RHEL/CentOS)观察投递路径。 postconf virtual_alias_maps确认配置已被加载。- 注意:virtual alias 会影响所有匹配域的收件人,包括本已存在的本地账户;生产环境慎用全域通配。
观测云对照
邮件网关是业务链路的一环,重定向配置错误会导致"用户收不到邮件"这类投诉。把 Postfix 所在主机的 mail.log 通过 DataKit 采集到观测云,在日志查看器里按 to=<...>、status= 过滤投递记录;再配一条监控器,对 status=bounced/deferred 数量设阈值告警,配置写错、队列堆积都能第一时间收到钉钉/企微通知。
常见问题(FAQ)
Q:能重定向到外部邮箱(如 Gmail)吗?
A:可以,virtual 文件右侧写完整外部地址即可。但注意你的 Postfix 必须有对外 relay 能力,否则会被对端拒收。
Q:改了 virtual 文件没生效?
A:九成是忘了 postmap /etc/postfix/virtual。Postfix 读的是 .db 索引,不是文本文件本身。
Q:想按收件人正则匹配转发怎么办?
A:把 virtual_alias_maps 指向 regexp: 类型的表,例如 virtual_alias_maps = regexp:/etc/postfix/virtual_regexp,文件里写正则到地址的映射。