Postfix配置优化需求:避免向使用第三方邮件服务器的域名投递本地邮件
Postfix配置优化需求:避免向使用第三方邮件服务器的域名投递本地邮件
我明白你的痛点——现在你的Postfix把所有托管域名都当成本地虚拟邮箱域名来处理,导致那些用Google Apps的域名,本地发邮件过去时会报错找不到用户,而不是正常投递到Google的服务器。下面给你几个实用的解决方案,都是不用创建系统用户的,符合托管面板的常规做法:
方案1:拆分域名表,区分“托管网站的域名”和“托管邮箱的域名”
这是最清晰、最易维护的方案,核心思路是把Postfix的虚拟邮箱域名范围缩小到真正在你服务器上托管邮箱的域名,而不是所有托管的域名:
- 新建一个专门的表(比如
virtual_mail_domains),只存储那些在你服务器上开通了邮箱服务的域名。 - 修改Postfix主配置
main.cf,把virtual_mailbox_domains指向这个新表:virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_mail_domains.cf - 配置对应的MySQL查询文件
mysql_virtual_mail_domains.cf,内容大概是:user = postfix password = your_db_password dbname = your_db_name query = SELECT domain FROM virtual_mail_domains WHERE domain='%s' - 原来的
domains表只用于DNS托管配置,和Postfix的虚拟邮箱逻辑彻底解绑。
这样做的好处是:
- 只有开通了邮箱服务的域名,Postfix才会本地处理其邮件;
- 对于只托管网站、用第三方邮件的域名,Postfix会自动去查询MX记录,投递到对应的第三方服务器;
- 用户切换邮件服务商时,只要在你的系统里关闭邮箱服务(从
virtual_mail_domains移除域名),再修改MX记录即可,完全不影响其他用户发邮件给他。
方案2:基于邮箱账户存在性动态判断虚拟域名
如果你不想额外维护一张表,可以利用现有的EmailAccount表,让Postfix自动判断:只有当某个域名下存在至少一个邮箱账户时,才视为本地虚拟域名。
修改Postfix的virtual_mailbox_domains对应的MySQL查询,改成:
SELECT domain FROM EmailAccount WHERE domain='%s' GROUP BY domain;
这个查询会返回所有存在邮箱账户的域名,Postfix只会把这些域名当作本地虚拟邮箱域名。
这样的优势是完全自动化:
- 用户在你这里开通邮箱时,只要添加
EmailAccount记录,Postfix就自动把该域名纳入本地处理范围; - 用户删除所有邮箱账户(切换到Google Apps)后,该域名会自动从Postfix的虚拟域名列表中消失,Postfix就会正常走MX路由投递。
方案3:用传输映射强制特定域名走第三方MX
如果上面两种方案都不适合,你还可以用Postfix的transport_maps配置例外,强制指定域名跳过本地虚拟处理,直接走SMTP路由查MX:
- 在
main.cf中添加:transport_maps = mysql:/etc/postfix/mysql_transport_maps.cf - 创建
mysql_transport_maps.cf,配置查询一张存储例外域名的表(比如domain_transports):user = postfix password = your_db_password dbname = your_db_name query = SELECT transport FROM domain_transports WHERE domain='%s' - 在
domain_transports表中,给那些用第三方邮件的域名添加记录,transport字段值设为smtp:(注意冒号不能少)。
这样Postfix遇到这些域名时,会直接使用SMTP传输方式,去查询对方的MX记录投递,而不会去查本地虚拟邮箱表。
额外注意事项
- 不管用哪种方案,修改配置后记得重启Postfix生效:
systemctl restart postfix - 测试时可以用
postmap -q "agti.eng.br" mysql:/etc/postfix/mysql_virtual_mail_domains.cf(对应方案1)来验证域名是否被识别为本地虚拟域名; - 你的Dovecot认证配置(基于
EmailAccount表)不需要改动,因为认证只针对实际的邮箱用户,和域名是否本地处理是独立的逻辑。
备注:内容来源于stack exchange,提问作者Amauri Gabriel
相关产品推荐
相关产品推荐

