Skip to main content

7. 宏 (Macros)

当评估SPF策略记录时,某些字符序列旨在被消息或连接的参数替换。这些字符序列称为"宏"。

7.1. 正式规范 (Formal Specification)

宏的ABNF描述如下:

domain-spec = macro-string domain-end
domain-end = ( "." toplabel [ "." ] ) / macro-expand

toplabel = ( *alphanum ALPHA *alphanum ) /
( 1*alphanum "-" *( alphanum / "-" ) alphanum )
alphanum = ALPHA / DIGIT

explain-string = *( macro-string / SP )

macro-string = *( macro-expand / macro-literal )
macro-expand = ( "%{" macro-letter transformers *delimiter "}" )
/ "%%" / "%_" / "%-"
macro-literal = %x21-24 / %x26-7E
; visible characters except "%"
macro-letter = "s" / "l" / "o" / "d" / "i" / "p" / "h" /
"c" / "r" / "t" / "v"
transformers = *DIGIT [ "r" ]
delimiter = "." / "-" / "+" / "," / "/" / "_" / "="

"toplabel"构造受字母-数字-连字符(LDH)规则以及附加顶级域(TLD)限制的约束。有关背景,请参见[RFC3696]的第2节。

一些特殊情况:

  • 字面"%"表示为"%%"。
  • "%_"扩展为单个" "空格。
  • "%-"扩展为URL编码的空格,即"%20"。

7.2. 宏定义 (Macro Definitions)

以下宏字母在术语参数中扩展:

s = <sender>
l = <sender>的local-part
o = <sender>的domain
d = <domain>
i = <ip>
p = <ip>的已验证域名(不推荐使用)
v = 如果<ip>是ipv4则为字符串"in-addr",如果<ip>是ipv6则为"ip6"
h = HELO/EHLO域

在第4.1节中定义。

以下宏字母仅允许在"exp"文本中使用:

c = SMTP客户端IP(易读格式)
r = 执行检查的主机的域名
t = 当前时间戳

7.3. 宏处理细节 (Macro Processing Details)

'%'字符后面没有跟随'{'、'%'、'-'或'_'字符是语法错误。因此:

-exists:%(ir).sbl.example.org

是不正确的,将导致check_host()产生"permerror"。相反,以下是合法的:

-exists:%{ir}.sbl.example.org

可选的transformers如下:

  • *DIGIT = 零个或多个数字
  • 'r' = 反转值,默认在点上分割

如果提供了transformers或delimiters,则宏字母的替换值被分割成由一个或多个指定分隔符字符分隔的部分。在执行任何反转操作后,必要时再次连接部分。

如果指定了DIGIT,则它指示要使用的部分数量,从右边开始。如果指定的部分数量大于可用的部分数量,则使用所有可用的部分。如果未指定数字,则使用所有部分。

宏字母'p'、'c'、'r'和't'不推荐使用,因为它们可能会导致额外的DNS查询、不可靠的结果或其他问题,如第11.6节和第5.5节所述。

处理示例:

假设是"[email protected]",宏字母"l"扩展为"strong-bad"。

如果使用transformers "{l}",结果不变:"strong-bad"。

如果使用"{l-}"并指定分隔符为"-",结果被分割为"strong"和"bad"两部分,然后用点连接:"strong.bad"。

如果使用"{lr-}",先分割为["strong", "bad"],然后反转为["bad", "strong"],再连接:"bad.strong"。

如果使用"{l1r-}",先分割,反转后只取最右边1个部分,结果为:"strong"。

7.4. 扩展示例 (Expansion Examples)

在以下示例中,假设是"192.0.2.3",是"[email protected]",是"email.example.com"。

%{s}   = [email protected]
%{o} = email.example.com
%{d} = email.example.com
%{d4} = email.example.com
%{d3} = email.example.com
%{d2} = example.com
%{d1} = com
%{dr} = com.example.email
%{d2r} = example.email
%{l} = strong-bad
%{l-} = strong.bad
%{lr} = strong-bad
%{lr-} = bad.strong
%{l1r-} = strong

对于IPv4地址192.0.2.3:

%{i}  = 192.0.2.3
%{ir} = 3.2.0.192
%{v} = in-addr
%{c} = 192.0.2.3

对于IPv6地址2001:db8::cb01:

%{i}  = 2001:db8::cb01
%{ir} = 1.0.b.c.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2
%{v} = ip6
%{c} = 2001:db8::cb01