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

如何构建DKIM头部?哈希前DKIM头与体格式化方法咨询

DKIM签名前的头部与正文格式化指南

嘿,刚好在DKIM签名这块踩过不少坑,给你梳理下签名前必须严格遵守的格式化(也就是DKIM里的「规范化Canonicalization」)规则,这直接决定了签名能不能被收件方验证通过!

一、邮件头部的规范化

DKIM支持两种头部规范化模式,你需要根据需求选择,并且要把模式声明在最终的DKIM-Signature字段的c参数里(比如c=relaxed/simple表示头部用relaxed,正文用simple):

Relaxed模式(最常用,容错性高)

  • 把所有头部字段名转换成小写(比如From:变成from:)
  • 字段名和值之间的分隔符必须是「单个冒号+单个空格」,如果原始是多个空格或者没有空格,要统一成这个格式
  • 字段值里的**连续空白(空格、制表符、换行折叠)**合并成单个空格,同时去掉字段值首尾的空白
  • 保留头部字段的原始顺序,绝对不能调整顺序(比如不能把Date放到From前面)

Simple模式(严格保留原始格式)

  • 几乎保留头部的原始内容,只做两个调整:
    1. 把所有换行统一转换成标准的CRLF(\r\n)
    2. 去掉头部最后可能存在的多余空白行
  • 注意:字段名的大小写、值里的空格都要原样保留,适合对原始格式要求极高的场景

⚠️ 重要提醒:DKIM-Signature这个字段本身绝对不能包含在你要签名的头部集合里,它是签名完成后才添加到邮件头部的!

二、邮件正文的规范化

同样支持两种模式,和头部模式可以自由组合:

Relaxed模式

这是大多数邮件服务商推荐的模式,步骤如下:

  1. 把正文里所有的换行符(不管是LF\n、CR\r还是CRLF\r\n)统一转换成标准的CRLF
  2. 去掉每一行末尾的所有空白(包括空格、制表符)
  3. 把正文里的**所有连续空白(包括换行、多个空格)**合并成单个空格
  4. 如果处理后的正文非空且没有以CRLF结尾,要追加一个CRLF;如果处理后正文为空,就不用加

Simple模式

这种模式更严格,尽量保留正文原始内容:

  1. 把所有换行符统一转换成CRLF
  2. 如果正文末尾有一个或多个CRLF,只保留最后一个;如果正文没有以CRLF结尾,要追加一个
  3. 其他内容完全保留,包括空格、制表符等

最后几个关键细节

  • 所有操作都要基于邮件的原始字节流,不要随意转码(比如不要把UTF-8转成ASCII,除非原始邮件就是ASCII编码),否则签名会失效
  • 签名时一定要在DKIM-Signature里明确声明你用的规范化模式,比如c=relaxed/relaxed是最常见的组合
  • 测试时可以用收件方的DKIM验证工具来排查问题,我当初就是因为没注意relaxed模式下的空白合并,踩了好多次坑!

内容的提问来源于stack exchange,提问作者skywa04885

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:47:37