3. Syntax (構文)
3.1. Introduction (はじめに)
本セクションで示される構文は、インターネットメッセージの合法的な構文を定義します。本仕様に準拠するメッセージは、本セクションの構文に準拠しなければなりません (MUST)。本セクションで、あるオプションが生成されるべき (SHOULD) である場合、それは本文または構文の横のコメントで示されます。
定義された表現については、構文と使用方法の簡単な説明が最初に示され、次に ABNF 構文、その後にセマンティクス分析が続きます。使用されているが本文書で別途指定されていない原始トークンは、RFC 5234 の付録 B.1 の「コアルール」から取得されます: CR、LF、CRLF、HTAB、SP、WSP、DQUOTE、DIGIT、ALPHA、および VCHAR。
一部の定義では、名前が「obs-」で始まる非終端記号があります。これらの「obs-」要素は、セクション 4 の廃止された構文で定義されたトークンを指します。すべての場合において、これらのプロダクションは、合法的なインターネットメッセージを生成する目的では無視されるべきであり、そのようなメッセージの一部として使用してはなりません (MUST NOT)。ただし、メッセージを解釈する際には、これらのトークンを合法的な構文の一部として尊重しなければなりません (MUST)。この意味で、セクション 3 はメッセージ生成のための文法を定義し、「obs-」要素は無視されますが、セクション 4 はその文法にメッセージ解釈のための文法を追加します。
コアコンセプト:
| 概念 | 説明 |
|---|---|
| メッセージ生成 | セクション 3 の構文、obs- 要素を無視 |
| メッセージ解析 | セクション 3 + セクション 4、obs- 要素を含む |
| obs- 要素 | 廃止された構文、生成してはならないが解析しなければならない |
3.2. Lexical Tokens (字句トークン)
以下の規則は、より高レベルのパーサーにトークンを供給する基礎となる字句解析器を定義するために使用されます。本セクションでは、構造化ヘッダーフィールド本体で使用されるトークンを定義します。
注意: 本仕様の読者は、これらの字句トークンが文書の後半の低レベルおよび高レベルの構文でどのように使用されるかに特に注意を払う必要があります。特に、セクション 3.2.2 で定義された空白トークンとコメントトークンは、ここで定義された低レベルトークンの定義で使用され、それらの低レベルトークンは、後で定義される高レベルトークンの一部として使用されます。したがって、空白とコメントが特定の定義に明示的に表示されていない場合でも、高レベルの構成要素のトークン間では許可される可能性があります。
3.2.1. Quoted characters (引用文字)
一部の文字は、字句トークンを区切るなど、特別な解釈のために予約されています。これらの文字を解釈されないデータとして使用できるようにするために、引用メカニズムが提供されています。
quoted-pair = ("\" (VCHAR / WSP)) / obs-qp
quoted-pair が出現する場合、それはバックスラッシュを削除して得られる単一の文字として解釈されるべきです。つまり、quoted-pair の一部として出現する「\」文字は、意味的に「不可視」です。
注意: 「\」文字は、quoted-pair の一部ではないメッセージに出現する可能性があります。quoted-pair に出現しない「\」文字は、意味的に不可視ではありません。本仕様で quoted-pair が現在出現する唯一の場所は、ccontent、qcontent、およびセクション 4 の obs-dtext です。
例:
引用されたバックスラッシュ: "\\" → 解釈: \
引用された引用符: "\"" → 解釈: "
引用されたスペース: "\ " → 解釈: (スペース)
3.2.2. Folding White Space and Comments (折り返し空白とコメント)
セクション 2.2.3 で説明されている折り返しで使用される空白文字を含む空白文字は、ヘッダーフィールド本体の多くの要素間に出現する可能性があります。また、コメントとして扱われる文字列は、括弧で囲まれた文字として構造化フィールド本体に含めることができます。以下は、折り返し空白 (FWS、Folding White Space) とコメント構造を定義します。
括弧で囲まれた文字列は、セクション 3.2.4 で定義される「quoted-string」内に出現しない限り、コメントと見なされます。コメントはネストできます。
本仕様には、コメントと FWS を自由に挿入できる場所がいくつかあります。その構文に対応するために、コメントおよび/または FWS が出現できる場所に追加の「CFWS」トークンが定義されています。ただし、本仕様で CFWS が出現する場合、折り返されたヘッダーフィールドのいずれかの行が WSP 文字だけで構成され、他に何もないような方法で挿入してはなりません (MUST NOT)。
FWS = ([*WSP CRLF] 1*WSP) / obs-FWS
; 折り返し空白
ctext = %d33-39 / ; 印字可能な US-ASCII
%d42-91 / ; 文字 (ただし、
%d93-126 / ; "(", ")", "\" を除く)
obs-ctext
ccontent = ctext / quoted-pair / comment
comment = "(" *([FWS] ccontent) [FWS] ")"
CFWS = (1*([FWS] comment) [FWS]) / FWS
本仕様全体で、FWS (折り返し空白トークン) が出現する場合、それはセクション 2.2.3 で説明されている折り返しが行われる可能性のある場所を示します。メッセージ内で折り返しが出現する場所 (つまり、CRLF の後に任意の WSP が続くヘッダーフィールド本体) では、そのヘッダーフィールドに対してさらなるセマンティクス分析が実行される前に、展開 (CRLF の削除) が実行されます。つまり、FWS に出現する CRLF は、意味的に「不可視」です。
コメントの例:
From: Pete (A nice \) chap) <[email protected]>
↑ ↑
└── コメント開始 └── エスケープされた括弧
解析後の表示名: Pete
実際のメールボックス: [email protected]
3.2.3. Atom (アトム)
構造化ヘッダーフィールド本体のいくつかのプロダクションは、単に特定の基本文字の文字列です。このようなプロダクションはアトム (Atoms) と呼ばれます。
一部の構造化ヘッダーフィールド本体では、atext の実行内でピリオド文字 (".", ASCII 値 46) も許可されます。この目的のために、追加の「dot-atom」トークンが定義されています。
atext = ALPHA / DIGIT / ; 印字可能な US-ASCII
"!" / "#" / ; 文字 (ただし、
"$" / "%" / ; specials を除く)。アトムに使用。
"&" / "'" /
"*" / "+" /
"-" / "/" /
"=" / "?" /
"^" / "_" /
"`" / "{" /
"|" / "}" /
"~"
atom = [CFWS] 1*atext [CFWS]
dot-atom-text = 1*atext *("." 1*atext)
dot-atom = [CFWS] dot-atom-text [CFWS]
specials = "(" / ")" / ; atext に出現しない
"<" / ">" / ; 特殊文字
"[" / "]" /
":" / ";" /
"@" / "\" /
"," / "." /
DQUOTE
atom と dot-atom の両方は、それを構成する文字列で構成される単一のユニットとして解釈されます。意味的には、残りの文字を囲むオプションのコメントと FWS は atom の一部ではありません。atom は、atom 内の atext 文字の実行、または dot-atom 内の atext と "." 文字のみです。
例:
アトムの例:
- john
- example
- user_name
- info+tag
dot-atom の例:
- john.doe
- first.middle.last
- [email protected] (メールボックスローカル部分用)
3.2.4. Quoted Strings (引用文字列)
アトムで許可されていない文字を含む文字列は、引用文字列形式で表すことができます。この形式では、文字が引用符 (DQUOTE、ASCII 値 34) 文字で囲まれます。
qtext = %d33 / ; 印字可能な US-ASCII
%d35-91 / ; 文字 (ただし、
%d93-126 / ; "\" または引用符を除く)
obs-qtext
qcontent = qtext / quoted-pair
quoted-string = [CFWS]
DQUOTE *([FWS] qcontent) [FWS] DQUOTE
[CFWS]
quoted-string はユニットとして扱われます。つまり、quoted-string は意味的に atom と同一です。quoted-string には FWS を含めることができるため、折り返しが許可されます。また、quoted-string では quoted-pair が許可されるため、引用符とバックスラッシュ文字は、quoted-pair として出現する限り、quoted-string に出現する可能性があることに注意してください。
例:
"Joe Q. Public" → Joe Q. Public
"First Last" → First Last
"Giant; \"Big\" Box" → Giant; "Big" Box
3.2.5. Miscellaneous Tokens (その他のトークン)
3 つの追加トークンが定義されています: atom および/または quoted-string の組み合わせのための word と phrase、および非構造化ヘッダーフィールドと構造化ヘッダーフィールド内の一部の場所のための unstructured。
word = atom / quoted-string
phrase = 1*word / obs-phrase
unstructured = (*([FWS] VCHAR) *WSP) / obs-unstruct
3.3. Date and Time Specification (日付と時刻の仕様)
日付と時刻の値は、いくつかのヘッダーフィールドに出現します。本セクションでは、完全な日付と時刻の仕様の構文を指定します。date-time 仕様全体で折り返し空白が許可されていますが、FWS が出現する各場所 (必須またはオプション) で単一のスペースを使用することが推奨されます (RECOMMENDED)。一部の古い実装では、より長い折り返し空白のシーケンスを正しく解釈しません。
date-time = [ day-of-week "," ] date time [CFWS]
day-of-week = ([FWS] day-name) / obs-day-of-week
day-name = "Mon" / "Tue" / "Wed" / "Thu" /
"Fri" / "Sat" / "Sun"
date = day month year
day = ([FWS] 1*2DIGIT FWS) / obs-day
month = "Jan" / "Feb" / "Mar" / "Apr" /
"May" / "Jun" / "Jul" / "Aug" /
"Sep" / "Oct" / "Nov" / "Dec"
year = (FWS 4*DIGIT FWS) / obs-year
time = time-of-day zone
time-of-day = hour ":" minute [ ":" second ]
hour = 2DIGIT / obs-hour
minute = 2DIGIT / obs-minute
second = 2DIGIT / obs-second
zone = (FWS ( "+" / "-" ) 4DIGIT) / obs-zone
日付時刻の例:
完全な形式:
Date: Fri, 21 Nov 1997 09:55:06 -0600
Date: Mon, 20 Dec 2025 10:00:00 +0800
曜日なし:
Date: 21 Nov 1997 09:55:06 -0600
UTC 時間:
Date: 21 Nov 1997 15:55:06 +0000
3.4. Address Specification (アドレス仕様)
アドレスは、メッセージの送信者と受信者を示すために、いくつかのメッセージヘッダーフィールドに出現します。アドレスは、個別のメールボックスまたはメールボックスのグループのいずれかです。
address = mailbox / group
mailbox = name-addr / addr-spec
name-addr = [display-name] angle-addr
angle-addr = [CFWS] "<" addr-spec ">" [CFWS] /
obs-angle-addr
group = display-name ":" [group-list] ";" [CFWS]
display-name = phrase
mailbox-list = (mailbox *("," mailbox)) / obs-mbox-list
address-list = (address *("," address)) / obs-addr-list
group-list = mailbox-list / CFWS / obs-group-list
アドレスの例:
シンプルな形式 (アドレスのみ):
[email protected]
完全な形式 (表示名付き):
Alice Smith <[email protected]>
"Joe Q. Public" <[email protected]>
複数の受信者:
To: [email protected], [email protected]
グループアドレス:
To: Development Team: [email protected], [email protected];
3.4.1. Addr-Spec Specification (アドレス仕様の詳細)
addr-spec は、ローカルに解釈される文字列の後に at-sign 文字 ("@", ASCII 値 64) が続き、その後にインターネットドメインが続く特定のインターネット識別子です。
addr-spec = local-part "@" domain
local-part = dot-atom / quoted-string / obs-local-part
domain = dot-atom / domain-literal / obs-domain
domain-literal = [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS]
dtext = %d33-90 / ; 印字可能な US-ASCII
%d94-126 / ; 文字 (ただし、
obs-dtext ; "[", "]", "\" を除く)
アドレスの例:
標準形式:
[email protected]
[email protected]
引用されたローカル部分:
"joe smith"@example.com
ドメインリテラル (IP アドレス):
user@[192.0.2.1]
第 3 章のまとめ
主要な構文要素
メッセージ構造階層:
メッセージ (Message)
├── 字句トークン (Lexical Tokens)
│ ├── atom、quoted-string
│ ├── word、phrase
│ └── comment、FWS
├── 日付時刻 (Date-Time)
│ └── Day, DD Mon YYYY HH:MM:SS +ZZZZ
└── アドレス (Address)
├── mailbox: name <user@domain>
└── group: name: addr1, addr2;
実装チェックリスト
- 折り返し空白 (FWS) を正しく処理する
- コメント (ネストされた括弧) をサポートする
- 引用文字列と quoted-pair を解析する
- 日付時刻の形式と有効性を検証する
- メールボックスとグループアドレスを解析する
- ローカル部分とドメイン部分を処理する
- 廃止された構文をサポートする (解析のみ、生成しない)