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@mail.test.invalid
- 左边
@example.com作为该域的收件地址兜底,精确映射可能先匹配;换成具体地址则只转那一条。 - 示例目标域 mail.test.invalid 应是已配置的本地投递域,catchall 是实际本地账户,且不再匹配源 catch-all,避免递归循环;也可指定外部完整邮箱地址(如
ops@example.net,会再转发出去)。 - 多个域要分别写一行,或用正则表(
regexp:/etc/postfix/virtual_regexp)做更灵活的匹配。
确保 example.com 属于正确域类型(例如 virtual_alias_domains),不要同时把同一域放进冲突的本地/虚拟邮箱域类别;hash 后端需在 postconf -m 中可用,已有 maps 也不能直接覆盖丢失。精确地址规则优先于域 catch-all。
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确认配置已被加载。- 用队列 ID 核对重写后的收件人和最终投递状态,再测试一个不应命中规则的域,避免通配范围超过预期。
- 注意:virtual alias 会影响所有匹配域的收件人,包括本已存在的本地账户;生产环境慎用全域通配。
常见问题(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,文件里写正则到地址的映射。