付録

1:メッセージヘッダフォーマット

メッセージのヘッダと意味の一覧表です。

「MTA」はMTAによって付加されるヘッダを表します。ただし、MTAが付加すると定められているのはReturn-Path:およびReceived:のみです。他のヘッダについてはMTAの独自実装でそのヘッダが存在しなかった場合に付加する機能を持つものがある(あるいは多い)ということであり、本来は上記二つ以外のヘッダは全てMUAが付加すべきです(存在しなかった場合のみ付加されるものは△で示しています)。
「RFC」は規定されているRFC番号です。
RFC2076により"not for general usage"、"not standardized for use in e-mail"(NetNewsメッセージで使われるヘッダ)、"non-standard"、"discouraged"、のステータスとなっているものは一部を除き記載していません。また、本文においても同様ですが、これらは筆者が独自に調査した結果であり、特にRFCに記載されていないヘッダに関しては、Web上での文献や実際の使われ方を見て記述している部分もあります。詳細および正確な情報はRFC2076から辿ることができるでしょう。

[]は省略可能である事を意味し、{}は'/'で区切られたキーワードのいずれかに置き換わる事を意味します。また、斜体の部分は該当する文字列に置き換わる事を示します。

フィールド サブフィールド ヘッダ パラメタ 意味 MTA RFC 備考
trace-field Return-Path: エラーの戻りパス
(メイルアドレス)
バウンスメッセージの戻り経路
通常はキューから取り出されるときに削除
821
822
Received: from 送信元ホスト
by 受信したホスト
[via 物理パス]
[with プロトコル]
[id メッセージID]
[for 送信先アドレス]
; 受信日時
経由したMTAの情報 822
dates-field Date: 日時 送信日時 822
Resent-Date: 日時 転送日時 822 現在ほとんど使われていない
source-field originator From: メイルアドレス 差し出し人 △sendmailはUnixアカウントからユーザ名を拾ってきて付加する 822
Sender: メイルアドレス 送信者 822
Reply-To: メイルアドレス 返信先 822
1036
resent Resent-From: メイルアドレス 転送メッセージ差し出し人 822 現在ほとんど使われていない
Resent-Sender: メイルアドレス 転送メッセージ送信者 822 現在ほとんど使われていない
Resent-Reply-To: メイルアドレス 転送メッセージ返信先 822 現在ほとんど使われていない
destination-field To: メイルアドレス 送信先 822
cc: メイルアドレス cc送信先 822
bcc: メイルアドレス bcc送信先 822
Resent-To: メイルアドレス 転送メッセージ送信先 822 現在ほとんど使われていない
Resent-cc: メイルアドレス 転送メッセージcc送信先 822 現在ほとんど使われていない
Resent-bcc: メイルアドレス 転送メッセージbcc送信先 822 現在ほとんど使われていない
reference-field Message-ID: メッセージID メッセージを一意に識別するユニークなID 822
Resent-Message-ID: メッセージID 転送メッセージのID 822 現在ほとんど使われていない
In-Reply-To: メッセージID 返信元メッセージ 822
References: メッセージID 参照しているメッセージ 822
Keywords: 文字列, [文字列]* 検索などに使うキーワード 822 現在は全文検索が主流
optional-field Subject: 文字列 題名 822
Comments: 文字列 コメント 822 現在ほとんど使われていない
Encrypted: 符号化スキーム キー 暗号化方法 822 現在ほとんど使われていない
extention-field MIME-Version: 1.0 (今のところ) MIMEメッセージであることの宣言 2045
Content-Type: MIMEタイプ; パラメタ MIMEタイプ
MIME-Version:がない場合は意味が異なっていた。(RFC1049)
△"text"を付けるものもある 2045
Content-Transfer-Encoding: エンコード方法(TES) ボディのエンコード方法。主に7bit。
添付ファイルのパートなどではBase64が使われる。
2045
Content-Description: 文字列 そのパートに対する説明。主にファイル名等。 2045
2183
Content-Disposition: {attachment|inline}
; パラメタ
そのパートが「添付」か「内包」か。ファイルに関する情報も記述する。 2183
Content-ID: メッセージボディID そのパートを識別するユニークなID 2045
Content-Language: 言語識別子(en、ja等) そのパートの言語 1766 Language:は非推奨
Content-MD5: ダイジェストをBase64化したもの メッセージが改変されていないことを証明するためのボディのダイジェスト 1864
Content-Location: URI 自分のパートを特定するURI。Content-ID:と同様に他のパートから参照される 2557
Return-Receipt-To: メイルアドレス 受信確認通知先。
非推奨
無し
(1865)
experimental
Return-Path:を使うべき
Disposition-Notification-To: メイルアドレス 開封通知先 2298
2532
Organization: 組織名 発信者所属組織 1036 NetNews用だがEmailにも使われている
Errors-To: メイルアドレス バウンスメッセージ通知先。
非推奨
無し experimental
Return-Path:を使うべき
Encoding: 行数 符号化スキーム
[, 行数 符号化スキーム]*
ボディを「行数」で区切って異なる符号化であることを指示。 1154
1505
experimental
現在は使用されることはほとんどないと思われる
Precedence: {special-delivery|
first-class|list|bulk|junk}
配送の優先度 無し Non-standard
experimental
sendmail独自
Impotance: {High|Normal|Low} メッセージの重要度 2156
Sensitivity: {Personal|Private|
Company-Confidential}
宛て先に対する親展の度合 2156 解釈は実装依存
Delivered-To: メイルアドレス 無限ループ防止のためにenvelope-toを記録 ○qmail 無し qmail独自
qmailは一通ずつ送信するためbcc:が他人に洩れることはない
Apparently-To: メイルアドレス To:がないメッセージに付加される。全てのenvelope-toが記述されるためbccも見えてしまう問題あり。 ○sendmailのみ 無し experimental
sendmail独自
RFC1211で問題の指摘あり
user-defined-field X-UIDL: 文字列 POP3サーバの付加するID(UIDL) 無し
X-PRIORITY: {1-5} メッセージに優先度を設定 無し
X-Face: 48×48ピクセルの画像 メッセージにいわゆるアイコンを付加 無し
X-URL: URL 送信者のWebページなどのURL 無し
X-Mailer: 文字列 送信MUAの名称 2076

2:SMTPプロトコルのコマンド一覧

SMTPで使用されるコマンドの一覧です。

コマンド パラメタ 意味 RFC
HELO domain セッションの開始。 821
EHLO domain 拡張セッションの開始。サポートする拡張機能名リスト、受信可能なメッセージ最大サイズ等を返す。
SIZE BINARYMIME 8BITMIME DSN PIPELINING CHUNKING等のキーワードを返す。
1869
MAIL FROM:<アドレス> [追加パラメタ] メッセージ送信開始宣言。
RFC1652で8BITMIME拡張が定義。8BITMIME/7BIT追加パラメタにより8bit送信であるか否かを宣言可能。
RFC1830でCHUNKING/BINARYMIME拡張が定義。BODY追加パラメタによりボディの種別を指定可能。
(CHUNKINGの場合は8BITMIMEの場合もBODY追加パラメタの値として記述する)
RFC1870でSIZE拡張が定義。SIZE追加パラメタにより送信データサイズをMTAに宣言可能。
(e.g.)MAIL FROM:<user@domain.org> SIZE=12364
RFC1891でDSN拡張が定義。RET追加パラメタによって送達通知の形式を指定可能。ENVID追加パラメタによってオリジナルメッセージのSenderを識別可能。
821
1652
1869
1870
1891
SEND FROM:<アドレス> ログインしている端末宛てにメッセージ送信開始宣言。 821
SOML FROM:<アドレス> ログインしていればその端末宛て、していなければメイルボックス宛てにメッセージ送信開始宣言。(Send Or MaiLの略) 821
SAML FROM:<アドレス> 端末およびメイルボックス宛てにメッセージ送信開始宣言。(Send And MaiLの略) 821
RCPT TO:<アドレス> [追加パラメタ] 宛て先の指定。複数回繰り返し可能。
RFC1891のDSN拡張にて、追加パラメタとしてNOTIFY(送達通知の有無の指定)/ORCPT(転送時の最初の宛て先)を指定可能。
821
1891
DATA メッセージデータ(メッセージヘッダ含む)の送信開始合図。
<CRLF>.<CRLF>でメッセージデータ終了。
ヘッダの終了は<CRLF><CRLF>(空行)。
821
BDAT サイズ [終端キーワード] BYNARYMIME/CHUNKING拡張でのバイナリのメッセージデータ送信開始合図。 1830
ETRN [{hostname|@domain|#queuename}] 相手サーバにパラメタで指定した対象に対してキューイングされたメッセージを処理させる。 1985
VRFY username 受信ホスト上のユーザ情報取得。 821
EXPN listname 受信ホスト上のメイリングリストのメンバリスト取得。 821
RSET セッションの開始状態に戻る。 821
HELP サポートするコマンドのリスト。 821
NOOP OK応答を返す。 821
TURN ReceiverSMTPとSenderSMTPの役割の反転。
セキュリティ上の問題からETRNに置き換わっている。
821
AUTH 認証スキーム名 指定された認証方式による認証トランザクションの開始。 2554
STARTTLS TLS(Transport Layer Security:RFC2246)セッションの開始。 2487
QUIT セッションの終了 821

3:POP3プロトコルのコマンド一覧

POP3で使用されるコマンドの一覧です。POP3は非認証状態と認証済み状態の二つの状態を持ちます。状態に関らず使用できるコマンドと、各状態において使用可能なコマンドをそれぞれ示します。

使用可能な状態 コマンド パラメタ 意味 RFC
常時 CAPA サポートするコマンドリストを返す。 2449
NOOP OK応答を返す。 1939
RSET ユーザ認証状態に戻る。削除マークは解除される。 1939
QUIT 削除マークのついたメッセージを削除し、セッションの終了する。 1939
非認証状態 USER username ユーザ名の送信。 1939
PASS password パスワードの送信。成功すれば認証済み状態へ。 1939
APOP username digest ユーザ名と、greetingメッセージに含まれるデータ+パスワードのMD5形式ダイジェストをbase64エンコードしたものを送信して認証。成功すれば認証済み状態へ。 1939
認証済み状態 STAT 全メッセージ数と総サイズを返す。 1939
LIST [msgno] (指定)メッセージのサイズを返す。 1939
TOP msgno linecount 指定メッセージを先頭から指定行数取得。行数はボディの行数。 1939
RETR msgno 指定メッセージを取得する。 1939
DELE msgno 指定メッセージに削除マークを付ける。 1939
LAST アクセスされた中で最大のメッセージ番号を返す。(現在は使われていない) 1460
UIDL [msgno] (指定)メッセージのユニークなIDを返す。 1939

4:IMAP4プロトコルのコマンド一覧

IMAP4には状態が3通りあります。POP3と比較して、「フォルダを選択した状態」という物が追加されます。JavaMailにおいてFolder#open()を行っていないと使用できないメソッド群は、このIMAP4における選択状態に合わせられています。状態に関らず使用できるコマンドと、各状態において使用可能なコマンドをそれぞれ示します。

使用可能な状態 コマンド パラメタ 意味 RFC
常時 CAPABILITY サーバがサポートする機能範囲を示す文字列を返す。 1730
LOGOUT セッションを終了する。 1730
NOOP OK応答を返す。 1730
非認証状態 LOGIN username password ユーザ名/パスワードを指定して認証。平文であるため使うべきではない。 1730
AUTHENTICATE 認証スキーム名 指定された方法で認証を開始する。 1730
認証済み状態
(非選択状態)
STATUS フォルダ名 項目名 フォルダの状態を返す。 2060
APPEND フォルダ名 [flags] [date] message 指定フォルダの末尾にメッセージを追加。複数行リクエスト。 1730
SELECT フォルダ名 フォルダを選択状態にする。他のフォルダの選択状態はこのコマンドの成功/失敗に関らず解除される。 1730
EXAMINE フォルダ名 フォルダをREAD_ONLYで選択状態にする。 1730
CREATE フォルダ名 フォルダを生成する。 1730
DELETE フォルダ名 フォルダを削除する。 1730
RENAME フォルダ名 新フォルダ名 フォルダの名称を変更する。 1730
LIST 参照名 フォルダ名 指定参照名中の(ワイルドカード指定も可能な)フォルダ名を元にフォルダ名の一覧を返す。 1730
LSUB 参照名 フォルダ名 購読しているフォルダの一覧を返す。 1730
SUBSCRIBE フォルダ名 フォルダを購読中にする。 1730
UNSUBSCRIBE フォルダ名 フォルダを購読解除する。 1730
選択済み状態 CHECK サーバの実装依存のリフレッシュや何らかのチェックを行う。 1730
CLOSE 削除マーク付きメッセージの削除を行い、フォルダを非選択状態にする。 1730
FETCH msgno 項目名 指定メッセージの指定項目を返す。 1730
STORE msgno 項目名 値 指定メッセージの指定項目を指定値に変更する。 1730
PARTIAL msgno 項目名 開始位置 サイズ 指定したメッセージの一部を返す。IMAP4rev1でobsoleteに。 1730
COPY msgno フォルダ名 メッセージを他のフォルダにコピーする。 1730
EXPUNGE 削除フラグの付けられたメッセージを削除する。 1730
UID {COPY|FETCH|STORE|SEARCH} パラメタ 他のコマンドをメッセージ指定/返却値としてUIDを用いるものとして起動する。 1730
SEARCH [charset] 検索基準 フォルダ内のメッセージの検索を行う。 1730

フォルダの属性

IMAP4における各フォルダの持つ属性の一覧を示します。これらはFETCH応答でIMAP4サーバから返される文字列です。

属性名 意味
\Noinferiors メイルを格納することができるフォルダ。(注1)
\Noselect メイルを格納できないフォルダ。選択もできない。
ツリーにおける枝を表す。(注1)
\Marked フォルダが選択されていない間にメッセージが追加されている。(注2)
\Unmarked 新着メッセージの追加がされていない。(注2)

注1:\Noinferiorsと\Noselectの両方のフラグが返されることはない。
注2:\Marked/\Unmarkedの判別が付かない場合や\Noselectのフォルダの場合は何れのフラグも返されない。

メッセージの状態

IMAP4における各メッセージの持つ状態の一覧を示します。

状態名 意味
\Seen メッセージは既に読まれている。
\Answered メッセージに対して返信済みである。
\Flagged メッセージが緊急または特別な注意であることを表す。
\Deleted 削除予約済みである。
\Draft メッセージは作成中である。
\Recent フォルダを選択していない間に到着したメッセージである。

5:JavaMailの参照するProperties一覧

Sessionオブジェクトに対して与えるPropertiesに関してJavaMailが参照するキーの一覧を以下に記します。
筆者はこれらのプロパティとそれらの相関関係を覚えるのが辛かったので、基本的にメソッドで全てを指定する方が楽だったのですが、メソッドのパラメタでは指定できず、プロパティ値でのみ指定できる情報もあります。特にプロバイダに特化した機能は基本的にプロパティとして与えることになります(代表的なものは"mail.smtp.from")。
ここでは、代替メソッドが存在するか否かを合わせて記載します。

なお、「デフォルト値」はこのプロパティが存在しなかった場合に使用される値を表しています。

共通

プロパティ名 デフォルト値 意味 代替メソッド
mail.store.protocol providerを識別する文字列 JavaMailが最初に見つけたプロバイダのプロトコル名 受信に使用するプロトコル名。
厳密には、使用するStore実装クラスを決定するための、javamail.providersまたはjavamail.default.providersファイルにおけるキー"protocol"の値名。
Session#setProvider()
mail.transport.protocol providerを識別する文字列 JavaMailが最初に見つけたプロバイダのプロトコル名 送信に使用するプロトコル名。
厳密には、使用するTransport実装クラスを決定するための、javamail.providersまたはjavamail.default.providersファイルにおけるキー"protocol"の値名。
Session#setProvider()
mail.プロトコル名.host ホスト名またはIPアドレス mail.hostの値 そのプロトコルにおける接続先ホスト。 Service#connect()
mail.プロトコル名.user ユーザアカウント名 mail.userの値 そのプロトコルにおけるユーザアカウント。 Service#connect()
mail.プロトコル名.class Providerクラス名 無し そのプロトコルにおける使用プロバイダ。同一プロトコル名のプロバイダが複数インストールされている場合に使う。 Session#setProvider()
mail.host ホスト名またはIPアドレス ローカルホスト デフォルトの接続先ホスト。 Service#connect()
注:Message-ID:のドメイン名を指定する代替はない
mail.user ユーザアカウント名 Systemプロパティのuser.nameの値 デフォルトのユーザ名。 Service#connect()
mail.from メイルアドレス mail.userの値@mail.hostの値 InternetAddress#getLocalAddress()で取得されるメイルアドレス。
Message-IDにも使用される。
Message#setFrom()
mail.debug "true"/"false" "false" デバッグモードか否か。 Session#setDebug()
mail.alternates メイルアドレス 無し 全員に返信(Message#reply(true))時の宛て先から取り除きたいアドレス。

SMTPProvider

JavaMailに添付されているSMTP Providerが参照するキーの一覧を以下に記します。

プロパティ名 デフォルト値 意味 代替メソッド
mail.smtp.host ホスト名 mail.hostの値 接続先ホスト。 Transport#connect()
mail.smtp.port ポート番号 25 接続先ポート。 Transport#connect()
mail.smtp.user ユーザ名 mail.userの値 SMTP Authenticationを使用する場合のユーザ名。 Transport#connect()
mail.smtp.connectiontimeout タイムアウト値(ms) 無し 接続時のタイムアウト値。
mail.smtp.timeout タイムアウト値(ms) 無し サーバへの送受信時のタイムアウト値。
mail.smtp.from メイルアドレス From:の内容 MAILコマンドのパラメタ(envelope-from)に使われるアドレス。JavaMail 1.1.2以前は"mail.smtp.user"。
mail.smtp.localhost ホスト名 InetAddress.
getLocalHost().
getHostName()
の値
HELO/EHLOコマンドのパラメタに使われるホスト名。
mail.stmp.ehlo "true"/"false" true SMTP拡張セッションの利用を試みるか否か。
mail.stmp.auth "true"/"false" false AUTHコマンド(SMTP AUTH)を試みるか否か。
mail.smtp.dsn.notify "NEVER"/"SUCCESS"/
"FAILURE"/"DELAY"
なし RCPTコマンドのNOTYFY追加パラメタ値。
mail.smtp.dsn.ret "FULL"/"HDRS" なし MAILコマンドのRET追加パラメタ値。
mail.stmp.allow8bitmime "true"/"false" false 8BITMIME拡張の利用を試みるか否か。
(JavaMailでは常に7bitコードにエンコードが行われるため通常は指定することはありません)
mail.stmp.sendpartial "true"/"false" false 宛て先アドレス群に無効なものが含まれた場合でも、有効なアドレスに対して送信を行うか否か。

IMAPProvider

JavaMailに添付されているIMAP Providerが参照するキーの一覧を以下に記します。

プロパティ名 デフォルト値 意味 代替メソッド
mail.imap.host ホスト名 mail.hostの値 接続先ホスト。 Store#connect()
mail.imap.port ポート番号 143 接続先ポート。 Store#connect()
mail.imap.user ユーザ名 mail.userの値 ログインユーザ名。 Store#connect()
mail.imap.partialfetch "true"/"false" true IMAPのpartial-fetch機能(メッセージの指定バイトを取得する機能)を用いるか否か。
mail.imap.fetchsize バイト数 16*1024 partial-fetch時にサーバに対して指定するfetchサイズ。
mail.imap.connectiontimeout タイムアウト値(ms) 無し 接続時のタイムアウト値。
mail.imap.timeout タイムアウト値(ms) 無し サーバへの送受信時のタイムアウト値。
mail.imap.statuscachetimeout タイムアウト値(ms) 1000 STATUSコマンドで得られるフォルダの状態をキャッシュする時間。
mail.imap.appendbuffersize バイト数 -1 フォルダへのAPPENDにおいて用いるバッファの最大サイズ。
指定サイズを超えるメッセージはバッファリング無しで転送される。従って、0だとバッファリングしない。-1指定(デフォルト)ではバッファサイズは制限なく増加するため、巨大なメッセージを頻繁にappendする場合は適当なバッファサイズを指定した方がよい。
mail.imap.connectionpoolsize プールするコネクション数 1 コネクションプールを用いる場合の最大コネクション数。
mail.imap.connectionpooltimeout タイムアウト値(ms) 45000 保持されているコネクションが開放されるまでの時間。
mail.imap.separatestoreconnection "true"/"false" false コマンド毎に異なるコネクションを用いるか否か(並行リクエストを用いるか否か)。

POP3Provider

JavaMailに添付されているPOP3 Providerが参照するキーの一覧を以下に記します。

プロパティ名 デフォルト値 意味 代替メソッド
mail.pop3.host ホスト名 mail.hostの値 接続先ホスト。 Store#connect()
mail.pop3.port ポート番号 110 接続先ポート。 Store#connect()
mail.pop3.user ユーザ名 mail.userの値 ログインユーザ名。 Store#connect()
mail.pop3.connectiontimeout タイムアウト値(ms) 無し 接続時のタイムアウト値。
mail.pop3.timeout タイムアウト値(ms) 無し サーバへの送受信時のタイムアウト値。
mail.pop3.rsetbeforequit "true"/"false" false QUITコマンドの前にRSETを発行するか否か。暗黙のうちに削除マークが付けられるサーバの場合に用いる。
mail.pop3.message.class クラス名 com.sun.mail.pop3.POP3Message 受信時に用いられるクラス。com.sun.mail.pop3.POP3Messageのサブクラスを指定。

参考文献

  1. 「オブジェクト指向における再利用のためのデザインパターン」(Erich Gamma他著)
  2. 「インターネットメールの注意点」
    http://www02.so-net.ne.jp/~hat/imail/cover.html
  3. 「インターネットメイルに関すること」
    http://www.emaillab.org/essay/
  4. Bug Parade
    http://developer.java.sun.com/developer/bugParade/

参考RFC

本書で紹介した情報に関するもののみです。インターネットメイルや日本語に関するRFCは他にも多く存在します。RFCの原本はhttp://ftp.isi.edu/in-notes/等から取得できます。

[Message Format関連]

[SMTP関連]

[POP3]

[IMAP4]

[日本語処理]

[URI関連]