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

