- 全ての基本はテキストメール(RFC822)
改行はCRLF(0x0D,0x0A)
NULL(0×00)は禁止
- HTMLメールなどを含む形態としてMIMEメールが標準化(ex. RFC2046)
FF(0x0C/Ctrl+L)は改ページ
HT(0×09/Tab)はタブ文字
HTTPプロトコルと大体同じ書式を持ち、Content-HeaderとContent-Bodyに分けられる
- メールにはASCII文字(0-127)しか含めないため、日本語を扱うには文字コードをiso-2022-jpにエンコードする必要がある(iso-2022-jp:is regulated at RFC2047)。
- 半角カナはiso-2022-jpの規格外のため、利用できない。メーラーで全角カナに変換すべき。携帯では携帯同士の場合独自仕様で半角カナを使っているがPCを送信対象とする場合(おそらくはサーバーで)全角カナに自動変換される。
- Content-Body では CRLFを除き1行は998バイト以下が必須、78バイト以下が推奨されている。ただしメーラーでこれをチェックして自動改行を行う場合は Quoted-Printable 等を使うべき。
<Content-Header>
- ヘッダの各行の書式 = Field-name:Value
- ヘッダ終端は空行
- Field-nameは文字の大きさを問わない
- 1つのヘッダについて複数行記述可能。その際は行頭にタブか半角空白を入れる
- 1行は末尾のCRLFを除いて76バイトまでという制約がある。
- ()で囲むとその部分は制御上はコメントとして無視される
- エンコードは
=?文字コード?符号化方式?データ?=
のようにする。符号化方式はアルファベット1文字でB(Base64),Q(Quoted-printable)を指定
- ヘッダにおける符号化の規約として’”‘の間の文字列はエンコード/デコードしてはならない。
“”の意味はそれ以上でもそれ以下でもないため、如何なる場合でも省略が可能。
(Outlook Expressは余裕で規約違反をして、逐一”"を使い、かつその中で符号化していますが。
なお、ヘッダの符号化は MIME-VERSION:1.0 でなくても利用可能。
- To: {Mail-address | 名前 <Mail-address>}
あて先。複数可。その場合’,'で区切る(改行する場合’,'の後が推奨される)
名前に’,'など特殊文字を使いたい場合は’”‘で囲まなければならない
あとどうでもいい仕様。
To: グループ名:Mail-address,Mail-address,…;
とするとメーラーによっては送信時にグループ単位送信を行う。
送信時に’:'から’;'の間の文字列を削除するため、同グループ内の他人同士は匿名になる
その際の受信側ヘッダは次のようになる
To:グループ名:;
- Cc:
コピー送信先。Toに同じ
- Bcc:
隠れコピー送信先。(Bcc自身も含む)全送信者について送信前にBcc:項目を削除する。Toに同じ
- From:
送信者。Toに同じ
- Sender: mail-address
Fromと似ているが1つしか指定できない。Fromで複数指定した場合の実際の送信者を指定する場合に利用
- Reply-To: mail-address
Fromとは違うあて先に返信して欲しい場合に指定。ただし受信側メーラーに動作を任せるのでこれだけに対してのみ必ず返信になるという信頼性はない。
- Date: GMT-Date-and-Time
送信時刻。
書式 = 曜日, 日 月 年 時:分:秒 ゾーン
曜日は省略可。曜日と月は英語3文字
ゾーンは標準時刻からの時差と地域をあらわす
ゾーン = 時差
ex)Date: Sat, 1 Aug 1998 14:23:33 +0900 (JST)
- Subject: title
題名
- X-*
X-ではじまるヘッダはユーザー定義フィールド以下にそのうち標準的なものを挙げる
- X-Mailer: Mailer-Software-Name
メーラーの識別子、OS情報など
- X-Face:????
小さな顔写真を格納、表示できる
- Message-ID: <メール固有のID>
メール固有のID(通例、送信元メールアドレスの前に時間情報と’.'を付加したもの/メールアドレスが
省略されることもある)を<>で囲む。(RFC2111)
ex) Message-ID: <237820.foo@sample.com>
他のメッセージから
“mid:” message-id ["/" content-id]
という書式で参照できる
IDのフォーマットはRFC822では次のように定められている
msg-id = “<" addr-spec ">”
addr-spec = local-part “@” domain ; global address
local-part = word *(“.” word) ; uninterpreted
; case-preserved
word = atom / quoted-string
atom = 1*<any CHAR except specials, SPACE and CTLs>
specials = “(” / “)” / “<" / ">” / “@” ; Must be in quoted-
/ “,” / “;” / “:” / “\” / <"> ; string, to use
/ “.” / “[" / "]” ; within a word.
CTL = <any ASCII control ; ( 00- 037, 0.- 31.)
character and DEL> ; ( 0177, 127.)
quoted-string = <"> *(qtext/quoted-pair) <">; Regular qtext or
; quoted chars.
qtext = <any CHAR excepting <">, ; => may be folded
“\” & CR, and including
linear-white-space>
linear-white-space = 1*([CRLF] LWSP-char) ; semantics = SPACE
; CRLF => folding
LWSP-char = SPACE / HTAB ; semantics = SPACE
HTAB = <ASCII HT, horizontal-tab> ; (011,9.)
quoted-pair = “\” CHAR ; may quote any char
CHAR = <any ASCII character> ; (00-0177, 0.-127.)
domain = sub-domain *(“.” sub-domain)
sub-domain = domain-ref / domain-literal
domain-ref = atom ; symbolic reference
domain-literal = “[" *(dtext / quoted-pair) "]“
dtext = <any CHAR excluding “[", ; => may be folded
"]“, “\” & CR, & including
linear-white-space>
- In-Reply-To: <メール固有のID>
メールを返信する際、元のメールのMessage-IDを指定する。
References:<メール固有のID> <メール固有のID> <メール固有のID> …
関連ある電子メールを複数記述できるフィールド
- Received: from mailgate-server-address (????-address [IPv6]) by received-address; GMT-Date-and-Time
メール送信における中継配送システム情報。Receivedは1つ以上存在し、通例として新しいものは古いものの前に付加される。付加を行使するのは受信側サーバ。直近のものほど信頼性はある。
from 送信サーバホスト名 (IP逆引きホスト名 [xxx.xxx.xxx.xxx])
by 受信サーバホスト名
; 中継時刻
- MIME-Version: version-number
省略した場合テキストメール。指定した場合MIMEメールとして扱われる。RFC2045で規定。
ex)MIME-Version: 1.0
- Content-*
MIMEで使うフィールドとして予約されており、Content-から始まるヘッダについては各パートは完全に独立している
- Content-Type: MIME-TYPE; parameter
MIME-version:1.0で対応。これによりメールのデータ形式が定義される
parameterはセミコロンで区切りparam=valueの形で記述。
MIME-TYPEはスラッシュで主型、副型に分けられ、不明な副型の場合主型で標準のものを採用。
パラメータの種別は主型による。
ex) Content-Type: text/plain; charset=iso-2022-jp
MIME-TYPE一覧: http://www.geocities.co.jp/Hollywood/9752/mime.html
その他: RFC2046
MIME-TYPE = (一例)
text/ : テキスト系
parameter =
charset: 文字コード.
iso-2022-jp=日本語,US-ASCII=英語(デフォルト),ISO-8859-1=欧系言語
format:????
flowed=????
name: ファイル名。Content-Disposition: attachmentがあるのでいらないような。
x-unix-mode: UNIXにおけるパーミッションを8進数で(0644
plain: 通常のテキストベースメール(デフォルト)
html: HTMLメール
img/ : 画像系
Multipart/ : マルチパート系。これにより複数のパートを再帰的に格納できるようになる(フォルダに譬えられる)
Content-Type:Multipart/*; のContent-Bodyの内容は完全に無視される。
parameter =
boundary:パートの区切り子の名前。”〜”のようにダブルクォートで囲む。
各パートは独立したContentとなり、通常のテキストメールと同じ
header/body 構成になる。区切り子には先頭に’–’を付加したものが、
終端子にはさらに後ろにも’–’を付加したものを使う。区切り子の前は
ヘッダと同様空行にする。(ただしヘッダを省略した場合は末尾の空行は不要/終端子の後のデータは無視される)
[boundaryに使える文字列定義](RFC2046-P21)
boundary := 0*69<bchars> bcharsnospace
bchars := bcharsnospace / ” “
bcharsnospace := DIGIT / ALPHA / “‘” / “(” / “)” /
”+” / “_” / “,” / “-” / “.” /
“/” / “:” / “=” / “?”
ex)
Content-Type: Multipart/Mixed;boundary=foo
Content-Transfer-Encoding: 7bit
–foo
Content-Type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
Hello,world!
–foo
Content-Type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
あいうえお
–foo–
Mixed: 多種のパートを混在させるという宣言(デフォルト)。添付ファイル等に使う。
alternative: 同一の内容を複数のMIME-TYPEで記述するという宣言。受信メーラーによってタイプを選択させるためのもの。(text/plainとtext/html 等)
related: 各パートがリンクしている事を宣言。(HTMLからのContent-ID(CID:〜)による呼び出しができるようにする
parallel: Mixedとほぼ同じだが、複数パートを順序を問わず同時実行。事実上多くのメーラーは連続的に実行。
digest: それぞれのパートのデフォルトMIME-TYPEがmessage/rfc822とされる
Message/
Rfc822 : メールの転送・カプセル化(RFC2046-5.2)
トップレベルでの利用の場合、Recent-From,Recent-To,Recent-Date等を送信時にFrom,To,
Dateの代わりに使うが、その際、受信側の返信先はFromになる。
もうひとつの方法として Multipart/Mixedのパートの一部に含めてカプセル化することも
可能。
Partial: ちょっとパス.(RFC2046-P29)
content-transfer-encodingは7bitでなければならない。
external-body: 外部(ファイル)参照(RFC2046-5.2.3)
parameter =(RFC2046-5.2.3.1)
[共通]
access-type: アクセス形式(文字の大小を問わない)
local-file=nameはメール受信側のローカルファイルパスになる
その他 mail-server,ftp,anon-ftp,tftp, x-*
expiration: 有効期限. GMT-Date-Timeを記述(略可
その他,parmission,size
[ftp/tftp]
name: ファイルパス
site: アクセス先ドメイン
以下略
[local-file]
name: ファイルパス
以下略
Content-Bodyの直前にさらに参照先ファイルのためのContent-Headerを書く。
第二のContent-HeaderにはContent-IDを含むべき。
それ以下のContent-Bodyの意味はaccess-typeにより異なる。local-fileの場合意味なし。
content-transfer-encodingは7bitでなければならない。
- Content-Transfer-Encoding: type
MIME-version:1.0で対応。これによりContent-Bodyの符号方式が定義される
type =
7bit : 無変換。Content-Bodyを7bit(文字コード 0-127)の行の集合とする(デフォルト)
8bit : 無変換。7bitの定義のうち1バイトつでも8bitが含まれるもの。
binary : 無変換。その他。
base64 : 64進数エンコード。[A-Za-z0-9+/]の64文字で表される
quoted-printable : 特殊文字を”=16進数”で表現する。=は”=3D”のようにエンコードする。長い行は行末に=をつけ改行される。
Multipart,Messageは無変換でなくてはならない。
- Content-Description: message
パートに対する説明。like the header “subject”
- Content-Disposition: attachment; filename=”filename”
そのパートをファイルとして保存する場合のファイル名を”〜”の中に指定できる
attachment は添付ファイルとして扱うことを宣言。
- Content-ID: <パート固有のID>
同一RelatedパートのHTMLからURIとして”cid:part-ID”として参照できる。定義と利用の順番は問わない。
ex)
Content-ID: <foo1234>
という画像パートがある場合
<img src=”cid:foo1234″>
で表示できる。(RFC2111) 書式は Message-ID とまったく同じ。