Skip to main content

7. Macros (宏)

7. Macros (宏)

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

7.1 Formal Specification (正式规范)

宏的 ABNF 描述如下:

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

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

macro-string = *( macro-expand / macro-literal )
macro-literal = %x21-24 / %x26-7E
; visible characters except "%"

macro-expand = ( "%{" macro-letter transformers *delimiter "}" )
/ "%%" / "%_" / "%-"

macro-letter = "s" / "l" / "o" / "d" / "i" / "p" / "h" /
"c" / "r" / "t" / "v"

transformers = *DIGIT [ "r" ]
delimiter = "." / "-" / "+" / "," / "/" / "_" / "="

toplabel = ( *alphanum ALPHA *alphanum ) /
( 1*alphanum "-" *( alphanum / "-" ) alphanum )
; LDH rule plus additional TLD restrictions
; (see [RFC5890], Section 2.3.1)

alphanum = ALPHA / DIGIT

ALPHA = %x41-5A / %x61-7A ; A-Z / a-z
DIGIT = %x30-39 ; 0-9

7.2 Macro Definitions (宏定义)

可用的宏字母及其含义如下:

  • s = <sender>
  • l = <sender> 的 local-part
  • o = <sender> 的 domain
  • d = <domain>
  • i = <ip>
  • p = <ip> 的验证域名
  • v = 用于 PTR 查询的 in-addr.arpa 字符串, 以 "in-addr" 表示 ip4, 以 "ip6" 表示 ip6
  • h = HELO/EHLO 域

7.3 Macro Processing Details (宏处理详情)

本节详细说明了宏扩展的过程。

正在扩展的宏字符串被分解为以 "%" 字符开头或由所有其他字符组成的片段。以 "%" 开头的片段称为 "宏扩展"。所有其他片段称为 "宏文字"。

每个宏扩展被替换(扩展)以生成结果字符串。此结果字符串中的 DNS 名称标签由 "." 字符分隔, 每个标签必须由 LDH(字母数字连字符)规则组成: 它必须完全由小写 ASCII 字母, ASCII 数字和/或连字符组成。宏文字在结果中未更改。在宏扩展和宏文字之间不插入字符。

除了扩展之外, 不对结果字符串执行转义或其他后处理; 它按原样使用。注意, 这意味着不需要 ASCII NUL 字符, 也没有提供在结果字符串中生成此类字符的机制。

宏字母被扩展为它们定义的值, 如第 7.2 节中所述, 并进行以下转换。转换语法由 transformers 组件定义。

r transformer:

字母 "r" 指示值应该在扩展之前反转。对于 IPv6 地址和域名, 反转是在点分隔符处完成的。对于 IPv4 地址, 反转是在点边界处完成的。

DIGIT transformer:

一个或多个数字指示应该从值的末尾提取多少个由点分隔的部分。如果存在数字, 它表示要使用的标签数量, 从右边开始(最高有效值)。

如果未指定数字, 则使用所有标签。数字零表示使用空字符串。字符串在转换器应用之后被截断。

分隔符:

一个或多个分隔符指示在应用其他转换器之后将哪些字符替换为分隔符 "."。注意, 分隔符不是值的自然部分; 它们在宏扩展期间应用。以下是分隔符及其扩展:

  • %{s} = <sender>
  • %{o} = <sender> 的域部分
  • %{d} = <domain>
  • %{d4} = <domain> 的最后四个标签
  • %{d4r} = <domain> 的最后四个标签, 反转
  • %{l} = <sender> 的 local-part
  • %{l-} = local-part, "." 被 "-" 替换
  • %{lr} = local-part, 反转
  • %{lr-} = local-part, 反转, "." 被 "-" 替换
  • %{l1r-} = local-part 的第一部分, 反转, "." 被 "-" 替换

7.4 Expansion Examples (扩展示例)

以下是宏扩展的一些示例。假设:

<sender> = [email protected]
<domain> = email.example.com
<ip> = 192.0.2.3

宏扩展示例:

扩展结果
%{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-}strong-bad
%{l1r-}strong-bad
%{ir}.%{v}._spf.%{d2}3.2.0.192.in-addr._spf.example.com
%{lr-}.lp._spf.%{d2}strong-bad.lp._spf.example.com
%{lr-}.lp.%{ir}.%{v}._spf.%{d2}strong-bad.lp.3.2.0.192.in-addr._spf.example.com
%{ir}.%{v}.%{l1r-}.lp._spf.%{d2}3.2.0.192.in-addr.strong-bad.lp._spf.example.com
%{d2}.trusted-domains.example.netexample.com.trusted-domains.example.net