メインコンテンツまでスキップ

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文字列、ip4の場合は"in-addr"、ip6の場合は"ip6"
  • h = HELO/EHLOドメイン

7.3 Macro Processing Details (マクロ処理の詳細)

このセクションでは、マクロ展開のプロセスを詳細に説明します。

展開されるマクロ文字列は、"%"文字で始まるか、他のすべての文字で構成されるフラグメントに分解されます。"%"で始まるフラグメントは"マクロ展開"と呼ばれます。他のすべてのフラグメントは"マクロリテラル"と呼ばれます。

各マクロ展開は置き換えられて(展開されて)、結果文字列を生成します。この結果文字列内のDNS名ラベルは"."文字で区切られ、各ラベルはLDH(Letter-Digit-Hyphen)ルールで構成される必要があります:完全にASCII小文字、ASCII数字、および/またはハイフンで構成される必要があります。マクロリテラルは、結果内で変更されません。マクロ展開とマクロリテラルの間に文字は挿入されません。

展開以外に、結果文字列に対してエスケープやその他の後処理は実行されません。そのまま使用されます。これは、ASCII NUL文字が不要であり、結果文字列でそのような文字を生成するメカニズムが提供されていないことを意味します。

マクロ文字は、セクション7.2で説明されているように、定義された値に展開され、次の変換が適用されます。変換構文はtransformersコンポーネントによって定義されます。

r transformer:

文字"r"は、展開前に値を逆にする必要があることを示します。IPv6アドレスとドメイン名の場合、逆転はドット区切り文字で実行されます。IPv4アドレスの場合、逆転はドット境界で実行されます。

DIGIT transformer:

1つ以上の数字は、値の終わりから抽出するドットで区切られた部分の数を示します。数字が存在する場合、右(最上位値)から使用するラベルの数を示します。

数字が指定されていない場合、すべてのラベルが使用されます。数字ゼロは、空の文字列を使用することを示します。文字列は、トランスフォーマーの適用後に切り捨てられます。

Delimiters:

1つ以上の区切り文字は、他のトランスフォーマーを適用した後に区切り文字"."に置き換える文字を示します。区切り文字は値の自然な部分ではないことに注意してください。マクロ展開中に適用されます。以下は区切り文字とその展開です:

  • %\{s} = <sender>
  • %\{o} = <sender>のドメイン部分
  • %\{d} = <domain>
  • %\{d4} = <domain>の最後の4つのラベル
  • %\{d4r} = <domain>の最後の4つのラベル、逆順
  • %\{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