postfix默认将root视为本地用户,邮件直接落盘至/var/spool/mail/root;要转发至qq邮箱,必须配置/etc/aliases映射root: yourname@qq.com并运行newaliases,同时确保mydestination包含localhost且postfix启用本地投递。

Postfix 本身不直接转发系统日志类邮件(比如 root 收到的 cron 报告、logwatch 提醒),它只负责收发“网络 SMTP 流量”。要让 /var/spool/mail/root 里的本地邮件自动转到你的 QQ 邮箱,必须配合 /etc/aliases + newaliases,且 Postfix 必须启用本地投递能力(mydestination 包含 localhost)。
为什么 mail -s "test" root 不触发转发?
很多人执行 echo hi | mail -s test root 后发现邮件进了 /var/spool/mail/root,但没发出去——这是因为 Postfix 默认把 root 当作本地用户处理,不走 SMTP 外发流程。转发的前提是:Postfix 得知道“root 不是本地收件人,而是别名”。
-
mydestination中若包含localhost或本机 hostname,Postfix 就认为root@localhost是本地账户,直接落盘 - 转发必须靠
virtual_alias_maps或aliases映射,且映射目标不能在mydestination列表里(否则又绕回本地) -
/etc/aliases只对本地用户名(如root、postmaster)生效,对完整邮箱地址(如root@example.com)无效
配置 /etc/aliases 实现 root 邮件转发
这是最轻量、最可靠的方式,无需改 Postfix 的网络行为,也不依赖外部 SMTP 认证。
- 编辑
/etc/aliases,添加一行:root: yourname@qq.com - 运行
sudo newaliases—— 这步必须做,否则 Postfix 完全不读/etc/aliases - 确认
mydestination包含localhost(默认就有),否则别名不生效 - 测试:执行
echo "test body" | sudo -u root mail -s "alias test" root,检查 QQ 邮箱是否收到
注意:yourname@qq.com 不能和服务器域名同域(比如服务器 hostname 是 mail.qq.com),否则 Postfix 会再次把它当成本地地址,导致循环或静默丢弃。
Postfix 必须监听本地投递,否则 aliases 失效
如果之前为了“只发信不收信”把 inet_interfaces 改成 loopback-only 或注释了 mydestination,/etc/aliases 就不会被调用。
- 检查
/etc/postfix/main.cf是否有这行:mydestination = $myhostname, localhost.$mydomain, localhost - 确保没有
mydestination =(空值)或mydestination =后只写了外部域名 - 修改后必须运行
sudo postfix reload,不是restart(reload 更快且保留队列) - 验证别名是否加载成功:
postalias -q root hash:/etc/aliases应输出yourname@qq.com
附件或长文本邮件被 QQ 邮箱拒收怎么办?
QQ 邮箱对纯文本邮件内容敏感,空内容、短内容、无主题、含特殊字符(如 ~、^)都可能进垃圾箱甚至丢弃。
- 测试时用完整内容:
echo -e "From: root\nSubject: System Alert\n\n$(date): Disk usage >90%" | mail -s "ALERT" root - 避免使用
mailx -v调试时带大量调试头,QQ 邮箱会直接拦截 - 如果必须发附件,改用
mutt:echo "body" | mutt -s "alert" -a /tmp/log.txt -- yourname@qq.com(需先apt install mutt) - 日志类邮件建议加
X-Original-To: root头,方便 QQ 邮箱识别来源
真正容易被忽略的是:Postfix 的 mydestination 和 /etc/aliases 是绑定生效的,改了一个不改另一个,转发就断在中间。别名映射不是“开关”,而是一条必须全程通畅的管道。











