You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 13:34:33