如何让Postfix的milter在smtp_generic_maps之前执行以满足DKIM签名需求?
如何让Postfix的milter在smtp_generic_maps之前执行以满足DKIM签名需求?
我之前帮朋友处理过一模一样的问题,核心原因就是你说的:smtp_generic_maps是在Postfix把邮件从队列发往远程服务器的SMTP客户端阶段才生效,而OpenDKIM这类milter默认是在邮件进入队列前的接收阶段(或者队列后的发送前)完成签名,导致签名用的是原域名,之后地址被重写,DKIM自然就失效了。
给你两个最靠谱的解决方案,都是让地址重写发生在DKIM签名之前:
方案一:改用cleanup阶段的地址重写(推荐)
smtp_generic_maps是SMTP客户端专用的重写规则,我们换成在邮件进入队列前的cleanup阶段就完成地址改写,这样DKIM签名时用的就是重写后的正确域名了。
编辑Postfix主配置文件
/etc/postfix/main.cf,替换smtp_generic_maps为generic_maps:# 注释掉原来的smtp_generic_maps,改成下面这行 generic_maps = hash:/etc/postfix/generic同时添加一行,让cleanup服务处理本地提交的邮件时也执行重写:
local_header_rewrite_clients = permit_inet_interfaces, permit_mynetworks编辑
/etc/postfix/generic文件,格式和你之前用的smtp_generic_maps完全一样,比如:# 把本地用户的发件地址重写成domain2.com的地址 localuser@domain1.com user@domain2.com # 如果要批量重写所有domain1.com的地址,还可以用通配符 @domain1.com @domain2.com生成哈希映射文件并重启Postfix:
postmap /etc/postfix/generic systemctl reload postfix
方案二:用sender_canonical_maps重写发件人
如果方案一不符合你的需求,还可以用sender_canonical_maps,它同样在cleanup阶段执行,专门负责重写发件人地址(包括From和Sender头)。
在
/etc/postfix/main.cf中添加:sender_canonical_maps = hash:/etc/postfix/sender_canonical编辑
/etc/postfix/sender_canonical,格式和之前的映射文件一致:localuser@domain1.com user@domain2.com生成哈希文件并重启服务:
postmap /etc/postfix/sender_canonical systemctl reload postfix
注意事项
- 不管用哪种方案,都要确保OpenDKIM的配置里已经为目标域名(比如domain2.com)生成了对应的DKIM密钥,并且DNS上已经配置好正确的TXT记录。
- 测试的时候可以发一封邮件给自己,查看邮件头里的
From地址和DKIM-Signature字段里的d=参数是否一致,一致就说明成功了。
备注:内容来源于stack exchange,提问作者BrownianBridge
相关产品推荐
相关产品推荐

