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

Postfix 基于MySQL实现中继认证的配置问题

Postfix 基于MySQL实现中继认证的配置问题

嗨,我来帮你搞定这个Postfix中继认证的问题!你现在的情况是已经能让特定邮件走MySQL里指定的中继服务器,但就是没把认证信息传过去导致被拒,对吧?核心问题是Postfix不会自动把relay_recipient_maps里的内容用作SMTP中继认证,得专门配置SASL认证映射才行,下面一步步来:

第一步:确保Postfix支持SASL认证

首先得确认你的系统安装了SASL相关模块,不同发行版命令不一样:

  • Debian/Ubuntu 系:
    sudo apt-get install libsasl2-modules postfix
    
  • RHEL/CentOS 系:
    sudo yum install cyrus-sasl-plain postfix
    

第二步:调整Postfix主配置(main.cf)

因为你是针对特定发件人test@example.com配置中继,所以用发件人依赖的映射会更精准。打开/etc/postfix/main.cf,添加以下配置:

# 针对特定发件人指定中继服务器
sender_dependent_relayhost_maps = proxy:mysql:/etc/postfix/mysql/sender_relayhost.cf

# 启用SMTP客户端SASL认证
smtp_sasl_auth_enable = yes
# 禁止匿名认证(必须配置,不然中继服务器大概率拒绝)
smtp_sasl_security_options = noanonymous
# 针对特定发件人绑定中继认证信息
sender_dependent_smtp_sasl_password_maps = proxy:mysql:/etc/postfix/mysql/sender_sasl_passwords.cf

# 可选:允许在邮件头标记认证信息,方便排查问题
smtp_sasl_authenticated_header = yes
# 可选:如果中继服务器要求TLS加密,开启这个确保密码不明文传输
smtp_tls_security_level = may

第三步:创建MySQL映射配置文件

你需要新建两个MySQL配置文件,分别对应中继服务器地址和认证信息:

1. sender_relayhost.cf(指定发件人对应的中继服务器)

hosts       = 127.0.0.1:3306
user        = BDD_USER
password    = BDD_PASS
dbname      = BDD_DBNAME
# 这里假设你的domain表有sender字段存发件人地址,relay_host字段存中继服务器(比如smtp.relay.com:587)
query       = SELECT relay_host FROM domain WHERE sender='%s' LIMIT 1

2. sender_sasl_passwords.cf(指定发件人对应的中继认证信息)

hosts       = 127.0.0.1:3306
user        = BDD_USER
password    = BDD_PASS
dbname      = BDD_DBNAME
# 直接读取你原来存的user:password明文
query       = SELECT authentification FROM domain WHERE sender='%s' LIMIT 1

注意:如果你的MySQL表原来没有sender字段,需要调整表结构,新增sender字段并填入test@example.com,对应好relay_host和authentification的值。

第四步:配置权限并验证

Postfix的运行用户(通常是postfix)需要能读取这些MySQL配置文件,所以调整权限:

sudo chmod 600 /etc/postfix/mysql/*.cf
sudo chown postfix:postfix /etc/postfix/mysql/*.cf

然后测试MySQL查询是否能正确返回结果:

# 测试认证信息查询
postmap -q 'test@example.com' mysql:/etc/postfix/mysql/sender_sasl_passwords.cf
# 测试中继服务器查询
postmap -q 'test@example.com' mysql:/etc/postfix/mysql/sender_relayhost.cf

如果能返回对应的user:password和中继地址,说明查询没问题。

最后检查Postfix配置语法并重启服务:

postfix check
sudo systemctl restart postfix

第五步:测试发送邮件

用sendmail发测试邮件验证:

sendmail -f test@example.com your-test-recipient@domain.com
Subject: Test Relay Auth
This is a test email from Postfix relay with auth.
.

然后查看Postfix日志(/var/log/mail.log或/var/log/maillog),如果看到类似smtp_sasl_authenticate: smtp.relay.com:587: username and password accepted的日志,就说明认证成功啦!

额外注意事项

  • 确保中继服务器支持你用的认证方式(你存的是明文user:password,对应PLAIN认证,大部分中继服务器都支持)
  • 如果中继服务器要求特定端口(比如587或465),一定要在relay_host里加上端口号,比如smtp.relay.com:587
  • 不要把MySQL配置文件的权限设得太松,避免密码泄露

备注:内容来源于stack exchange,提问作者PopFR1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 13:18:07