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

如何让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签名时用的就是重写后的正确域名了。

  1. 编辑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
    
  2. 编辑/etc/postfix/generic文件,格式和你之前用的smtp_generic_maps完全一样,比如:

    # 把本地用户的发件地址重写成domain2.com的地址
    localuser@domain1.com user@domain2.com
    # 如果要批量重写所有domain1.com的地址,还可以用通配符
    @domain1.com @domain2.com
    
  3. 生成哈希映射文件并重启Postfix:

    postmap /etc/postfix/generic
    systemctl reload postfix
    

方案二:用sender_canonical_maps重写发件人

如果方案一不符合你的需求,还可以用sender_canonical_maps,它同样在cleanup阶段执行,专门负责重写发件人地址(包括From和Sender头)。

  1. 在/etc/postfix/main.cf中添加:

    sender_canonical_maps = hash:/etc/postfix/sender_canonical
    
  2. 编辑/etc/postfix/sender_canonical,格式和之前的映射文件一致:

    localuser@domain1.com user@domain2.com
    
  3. 生成哈希文件并重启服务:

    postmap /etc/postfix/sender_canonical
    systemctl reload postfix
    

注意事项

  • 不管用哪种方案,都要确保OpenDKIM的配置里已经为目标域名(比如domain2.com)生成了对应的DKIM密钥,并且DNS上已经配置好正确的TXT记录。
  • 测试的时候可以发一封邮件给自己,查看邮件头里的From地址和DKIM-Signature字段里的d=参数是否一致,一致就说明成功了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 10:04:37