Debian系统下如何配置Exim4仅在远程服务器返回特定拒绝信息时通过中继投递邮件
我完全懂你的困扰——明明自己的服务器IP没在任何正经黑名单里,却被AT&T这类服务商拿DNSBL/RBL当借口拒信,不想一直花钱用中继,只在碰到这种特定错误时才切换过去,对吧?下面咱们一步步来配置Exim4实现这个需求:
1. 先搞定中继服务的基础配置(如果你的中继需要认证)
首先得把中继的账号信息存好:
- 编辑
/etc/exim4/passwd.client,添加一行你的中继服务器认证信息,格式是:中继服务器地址:用户名:密码,比如:smtp.your-relay-service.com:my-relay-user:my-relay-pass123 - 再编辑
/etc/exim4/exim4.conf.localmacros,定义中继主机的地址和端口:
这里的RELAY_HOST=smtp.your-relay-service.com::587::587是指定SMTP端口587,要是你的中继用465端口,改成::465就行。
2. 添加专门的中继路由器
Debian默认的Exim4是split配置(把配置拆成多个小文件),咱们在路由目录里新建一个自定义路由文件:
在/etc/exim4/conf.d/router下创建999_local_smart_host_router,内容如下:
smart_host_relay: driver = manualroute domains = ! +local_domains # 只处理发给外部域名的邮件,本地邮件还是直接投递 transport = remote_smtp_smart_host route_list = * ${RELAY_HOST} # *核心条件*:只有上次投递返回553错误,且错误文本里有DNSBL:RBL或521...is blocked才触发 condition = ${if eq{$smtp_last_error_code}{553}{${if match{$smtp_last_error_text}{DNSBL:RBL|521.*is blocked}{yes}{no}}}{no}} no_more # 匹配到这个路由后,就不再尝试其他路由了
如果你的Exim4是单文件配置(用的/etc/exim4/exim4.conf.template),找到路由器配置段,把这段内容加到默认的remote_smtp路由器后面就行。
3. 配置对应的中继传输规则
接下来要给中继路由配一个专门的传输器,split配置下在/etc/exim4/conf.d/transport新建30_exim4-config_smart_host_transport,内容:
remote_smtp_smart_host: driver = smtp port = 587 # 和之前定义的中继端口保持一致 hosts_require_auth = ${RELAY_HOST} # 要求对中继服务器进行身份认证 hosts_require_tls = ${RELAY_HOST} # 强制用TLS加密传输,更安全,要是中继不支持可以删掉这行
单文件配置的话,把这段加到传输器配置区域。
4. 调整默认投递路由的优先级
找到默认的remote_smtp路由器配置(split配置在/etc/exim4/conf.d/router/30_exim4-config_remote),看看里面有没有no_more参数——如果有的话一定要删掉!这样当直接投递失败且符合咱们设置的错误条件时,Exim才会继续尝试后面的中继路由。
5. 让配置生效并重启Exim4
执行下面两条命令,更新配置并重启服务:
update-exim4.conf systemctl restart exim4
6. 测试一下配置
你可以用exim -bt someone@att.net命令查看邮件的路由逻辑,或者直接发一封测试邮件到AT&T的邮箱(如果之前碰到过拒信的话),看看当收到553那个错误时,Exim会不会自动切换到中继投递。
备注:内容来源于stack exchange,提问作者chris

