如何配置Postfix通过Gmail中继发送邮件并保留本地域名邮件本地投递
看你的需求是让Postfix把非本地域名的邮件通过Gmail中继发送,同时像nick@mordor.saundersconsulting.tech这类本地域名的邮件,依然直接投递到本地邮箱,不用走Gmail中继。结合你用的Ubuntu 22.04环境,咱们一步步来配置:
一、先搞定Gmail的应用专用密码
现在Gmail不允许直接用账号密码登录第三方SMTP工具了,必须先做两步验证,再生成专属的应用密码:
- 登录你的Gmail账号,进入「账号设置」→「安全」板块
- 先开启「两步验证」(如果还没开的话)
- 找到「应用专用密码」选项,生成一个专门给Postfix用的密码,把这个密码记好,后面要用到。
二、安装必要的软件包
打开终端,先安装Postfix和SASL认证模块(Postfix靠这个和Gmail的SMTP服务器做身份校验):
sudo apt update && sudo apt install postfix libsasl2-modules
安装过程会弹出Postfix配置向导,先选「Internet Site」,然后输入你的本地域名(比如mordor.saundersconsulting.tech),后续我们还要手动改配置,这里先填好基础信息就行。
三、修改Postfix主配置文件
编辑/etc/postfix/main.cf文件,用nano或者你习惯的编辑器都可以:
sudo nano /etc/postfix/main.cf
找到并修改以下关键配置项,如果没有就手动添加:
1. 配置中继主机(指向Gmail SMTP)
relayhost = [smtp.gmail.com]:587
加方括号是为了让Postfix直接连接这个服务器,不用查询它的MX记录。
2. 开启SMTP认证并指定密码文件
smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_sasl_security_options = noanonymous
3. 开启TLS加密(Gmail强制要求)
smtp_use_tls = yes smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
4. 确保本地域名邮件本地投递
确认mydestination配置已经包含你的本地域名,这样Postfix会把发往这个域名的邮件直接投到本地邮箱,不走中继:
mydestination = $myhostname, mordor.saundersconsulting.tech, localhost.localdomain, localhost
$myhostname就是你的服务器主机名,确保它也在列表里。
改完后按Ctrl+O保存,Ctrl+X退出编辑器。
四、创建并配置SASL密码文件
现在创建存储Gmail账号和应用密码的文件:
sudo nano /etc/postfix/sasl_passwd
在里面添加一行内容,格式是「中继主机 用户名:应用密码」:
[smtp.gmail.com]:587 your-gmail-account@gmail.com:your-app-specific-password
把your-gmail-account@gmail.com换成你自己的Gmail邮箱,your-app-specific-password换成刚才生成的应用专用密码。
保存退出后,用Postfix的postmap工具生成加密的hash文件:
sudo postmap /etc/postfix/sasl_passwd
五、设置文件权限保证安全
密码文件不能让其他用户读取,所以修改权限:
sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db sudo chown root:root /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
六、重启Postfix让配置生效
sudo systemctl restart postfix
七、测试配置是否正常
1. 测试本地邮件投递
像你之前那样用swaks测试本地邮件,确认还是能正常投递到本地邮箱:
swaks --to nick@mordor.saundersconsulting.tech --server localhost
查看/var/log/postfix.log,应该会看到类似你之前日志里的status=sent (delivered to mailbox)记录,说明本地投递没问题。
2. 测试中继发送到外部邮箱
测试发送到Gmail或者其他外部邮箱:
swaks --to saunders.nicholas@gmail.com --from nicholas@mordor.saundersconsulting.tech --server localhost
查看日志,如果看到relay=smtp.gmail.com[xxx.xxx.xxx.xxx]:587这类记录,并且最终显示status=sent,说明中继配置成功了。
常见问题排查
如果遇到投递失败,先看/var/log/postfix.log找原因:
- 要是提示认证失败,检查应用密码是否正确,或者两步验证有没有开启、应用密码是不是对应Postfix生成的。
- 要是TLS相关错误,确认
smtp_tls_CAfile路径正确,也可以运行sudo update-ca-certificates更新证书。 - 要是本地邮件还是走中继,检查
mydestination是否正确包含你的本地域名,Postfix会优先处理这个列表里的域名,直接本地投递。
备注:内容来源于stack exchange,提问作者Nicholas Saunders

