Exim4针对不同发件人或路由配置不同passwd.client的实现方案咨询
我刚好处理过类似的需求,给你分享个可行的配置思路,完美解决多个不同域名发件人共用同一SMTP中继但需要各自独立凭证的问题。
先明确你的场景:用Exim4搭了多智能中继,默认走一个,同时让Google、Outlook这类域名的发件人走官方SMTP(目的是贴合SPF规则,提升邮件投递成功率),现在遇到的问题是多个不同域名的账号都要走Outlook的SMTP,但每个账号有自己的用户名密码,没法直接靠passwd.client的域名匹配来区分。
这里的核心是打破passwd.client仅按目标主机匹配凭证的限制,让Exim根据发件人地址来动态选择对应的认证信息,具体配置步骤如下:
1. 优化路由器配置(以Outlook为例)
保留你现有的路由器逻辑,但把transport指向一个专门的、支持动态认证的SMTP传输模块:
dnslookup_outlook: debug_print = "R: dnslookup_outlook for $local_part@$domain" driver = manualroute transport = remote_smtp_outlook # 换成自定义的transport senders = per-eric.rosen@domain1.com:per-eric.rosen@domain2.com # 列出所有需要走这个路由的发件人 route_list = * smtp.office365.com::587 bydns ipv4_only host_find_failed = defer same_domain_copy_routing = yes no_more condition = ${if match {$sender_host_address} {\N^(|127\.0\.0\.1)$\N}}
2. 定义支持动态认证的传输模块
在Exim的配置文件(比如/etc/exim4/exim4.conf.template)里添加专属的SMTP transport,通过lookup功能从外部文件读取对应发件人的凭证:
remote_smtp_outlook: driver = smtp port = 587 hosts_require_auth = * # 要求所有目标主机必须认证 hosts_require_tls = * # 强制使用TLS加密 # 根据发件人地址匹配对应的用户名 auth_username = ${lookup{$sender_address}lsearch{/etc/exim4/sender_auth_map}{$value}{}} # 根据发件人地址匹配对应的密码 auth_password = ${lookup{$sender_address}lsearch{/etc/exim4/sender_pass_map}{$value}{}}
3. 创建发件人-凭证映射文件
新建两个文件存储发件人和对应凭证的映射,方便后续维护:
/etc/exim4/sender_auth_map(存储用户名):
per-eric.rosen@domain1.com:user1@domain1.com per-eric.rosen@domain2.com:user2@domain2.com
/etc/exim4/sender_pass_map(存储密码):
per-eric.rosen@domain1.com:your-domain1-password per-eric.rosen@domain2.com:your-domain2-password
创建完后记得设置安全权限,避免密码泄露:
chmod 600 /etc/exim4/sender_auth_map /etc/exim4/sender_pass_map chown Debian-exim:Debian-exim /etc/exim4/sender_auth_map /etc/exim4/sender_pass_map
4. 重启Exim生效
配置完成后,重启Exim服务让修改生效:
systemctl restart exim4
替代简化方案(适合账号少的场景)
如果你的发件人数量不多,也可以直接在transport里用if判断硬编码凭证,不用单独的映射文件:
remote_smtp_outlook: driver = smtp port = 587 hosts_require_auth = * hosts_require_tls = * auth_username = ${if eq{$sender_address}{per-eric.rosen@domain1.com}{user1@domain1.com}{${if eq{$sender_address}{per-eric.rosen@domain2.com}{user2@domain2.com}{}}}} auth_password = ${if eq{$sender_address}{per-eric.rosen@domain1.com}{pass1}{${if eq{$sender_address}{per-eric.rosen@domain2.com}{pass2}{}}}}
不过这种方式账号多了会变得臃肿,还是推荐用映射文件的方案,维护性更强。
这个方案的核心是让认证信息和发件人绑定,而不是和目标SMTP服务器绑定,完美解决了你多个不同域名账号共用同一SMTP中继但需要独立凭证的问题,确保每个发件人用自己的官方账号认证,贴合SPF规则,大幅提升邮件的投递成功率。
备注:内容来源于stack exchange,提问作者pereric

