連載
» 2001年07月03日 00時00分 公開

インターネット・プロトコル詳説(9):IMAP4(Internet Mail Access Protocol version 4)〜後編

[梁瀬介次,@IT]

 前回までで、IMAP4機能の概要を説明した。今回は、基本的なコマンド別の機能の動作などについて解説しよう。また、別表1にコマンド一覧もまとめたので、参考にしてほしい(こちらをクリックすると、別ウィンドウでコマンド一覧を開きます)。

状態操作

CAPABILITY

 サーバの機能一覧を表示する。拡張コマンドやAUTHENTICATEの認証方法への対応を確認するのに使用される。

図1 CAPABILITYコマンドの使用例 図1 CAPABILITYコマンドの使用例

認証

LOGIN ユーザー名 パスワード

 最も一般的なログインのためのコマンド。引数にユーザー名とパスワードを指定する。

図2 LOGINコマンドの使用例 図2 LOGINコマンドの使用例

AUTHENTICATE 認証方法

 LOGINコマンドに代わり、よりセキュアな方法で認証するためのコマンドである。SMTPの回で説明したSASLに沿った認証方法を用いる。CAPABILITYコマンドやログイン直後のレスポンスにおいて、「AUTH=認証方法」という表示で、対応している認証方法をサーバが提示するので、その中からクライアントは自身が使用できる認証方法を選択し、ログインを行う。認証方法には、CRAM-MD5、Kerberosなどがある。詳しくはSMTPの回を参照してほしい。

図3 AUTHENTICATEコマンドの使用例 図3 AUTHENTICATEコマンドの使用例

LOGOUT

 IMAP4サーバからログアウトする。

メールボックスの決定と管理

LIST 参照位置 ワイルドカード

 存在するメールボックスの一覧を表示する。「参照位置」とは階層の位置のことであり、""(値なし)が最上位を示している。「ワイルドカード」には2種類あり、% はその階層のみを、* は再帰的にすべての階層の表示を行う。あるいは直接、マッチするための文字列を指定してもよい。

図4 LISTコマンドの使用例 図4 LISTコマンドの使用例

 LISTコマンドによって、以下のようなタグなし行による結果が返答される。

* LIST 属性 階層区切り文字 メールボックス名

 このうち「属性」は、以下のような種類によってメールボックスの属性を示す。

種類 意味
\Noinferiors このメールボックス/フォルダ以下には、子階層や子メールボックスを作ることができない
\Noselect このメールボックスは選択する(後述のSELECTコマンド)ことができない
\Marked 新規の到着メールがある
\Unmarked 到着メールはない
表1 IMAP4のLIST属性

 なお、属性をくくっている ( ) は、IMAP4の仕様でたびたび現れる「リスト」と呼ばれる表示形式だ。かっこ内の要素をスペースで区切って、複数の要素を表現している。

 「階層区切り文字」は、階層メールボックスを表現する場合に、階層区切りを示す文字の指定だ。つまり、このメールボックスやフォルダ以下では、ここで指定された文字が階層の区切りに使われる。ほとんどの場合は / (スラッシュ)なのだが、OSの違いや、前編でも述べたネットニュースの場合には、例えば「comp.mail.imap4」などのように、別の区切り文字を使いたい場合もある。このように、OSやシステムから独立した利用を想定しているのである。

SELECT メールボックス名

 メールボックスが複数ある以上、まずどのメールボックスを操作するか指定しなくてはならない。引数に示されたメールボックスを、以下に続くメール操作コマンドにおいて使用することを宣言する。

図5 SELECTコマンドの使用例 図5 SELECTコマンドの使用例

 レスポンスでは、次のような対象メールボックスのステータスも返答される。

  • メールボックス中のメール数
  • \Recentフラグが設定されているメール数。Inboxメールボックスであれば、新着メール数を意味する
  • メールボックスで使用されるフラグの種類

 またレスポンスコードによって、そのほかの付随する情報も返答されているのが分かるだろう。最終行のレスポンスコードでは、このメールボックスが「読み書き可能」か「読み込み専用」かも判別できる。

メールボックスの購読

  • SUBSCRIBE メールボックス名
  • UNSUBSCRIBE メールボックス名
  • LSUB 参照位置 ワイルドカード
    メールボックスの購読の開始/停止を行う。
図6 SUBSCRIBE/UNSUBSCRIVE/LSUBコマンドの使用例 図6 SUBSCRIBE/UNSUBSCRIVE/LSUBコマンドの使用例

 LISTとSELECTコマンドの組み合わせだけでは、サーバ上のすべてのディレクトリが対象になってしまうかもしれない。SUBSCRIBEコマンドで購読、つまり日常使用するメールボックスのチェックを行い、LSUBコマンドで購読しているメールボックスの一覧だけを得ることで、効率的な操作が可能になる。購読情報はサーバで管理されるので、ほかのコマンドによるアクセス時にも同様の購読が示されるというメリットもある。また、UNSUBSCRIBEコマンドは購読の中止を行う。なお、inboxは必ず購読していることになる。

メール取得

FETCH メッセージ番号 取得データ種類

 IMAP4の非常にユニークな特色を表しているのが、このFETCHコマンドだ。前半で、IMAP4はメールのMIME構造を理解すると述べた。以下の例を見てほしい。

図7 マルチパートの場合のBODYSTRUCTUREオプションの使用例。NILはヌル値を示しており、パラメータのような「Name=Value」の形式データは、「( 図7 マルチパートの場合のBODYSTRUCTUREオプションの使用例。NILはヌル値を示しており、パラメータのような「Name=Value」の形式データは、「("Name""Value")」とリストに変換される

 これは、「取得データ種類」としてBODYSTRUCTUREオプションを指定した例だ。MIMEの回を読んだ読者であれば、大体の意味は分かってもらえるのではないか。BODYSTRUCTUREオプションは、MIMEの構造を ( ) でかこい、構造化して示す。こうした機能は、クライアントでMIME解析をしなくてもよいようにとの配慮である。

 また、BODY[パート番号] オプションで、マルチパートの場合に必要なパートのボディのみを取得することができる。構造を調べたのち、必要な部分のみを取り出せるわけだ。

図8 BODYオプションでマルチパートの特定のボディのみを取り出したところ 図8 BODYオプションでマルチパートの特定のボディのみを取り出したところ

 BODYSTRUCTUREオプションはMIMEの全体構造を示すが、一方のENVELOPEオプションではヘッダの構造を取得可能だ。

図9 ENVELOPEオプションの使用例。NILはヌル値を示しており、アドレスなど複数値の場合は、( )を用いたリストで表される 図9 ENVELOPEオプションの使用例。NILはヌル値を示しており、アドレスなど複数値の場合は、( )を用いたリストで表される

 これらの例では、分かりやすいように適当に整形している。実際にはひとつなぎに表示されるので、注意してほしい。なお、「メッセージ番号」の指定は、1つの番号だけでもよいし、「1:3」として1から3までのメールすべて、あるいは「2,5」として2と5の2通のみ取得、といった複数指定もできる。

 複雑な例から述べたが、もちろんPOP3のようにメール全体やヘッダだけを取り出すこともできる。またフラグの状態も、FLAGオプションによって確認可能だ。別表2のオプション一覧も参考にしてほしい(こちらをクリックすると、別ウィンドウでFETCHオプションの一覧を開きます)。

メール検索

 サーバサイドでのメールの検索機能も、IMAP4の大きな特徴だ。POP3であれば、最初にすべてのメールをダウンロードしたあとで検索が可能になるところだが、IMAP4であればサーバ上で行えるので、検索後、対象メールのみダウンロードということも可能である。

SEARCH [charset キャラクタセット]検索条件

 SELECTコマンドでメールボックスを選択したあとに、そのメールボックス内のメールを対象に検索が行われる。結果は、メッセージ番号で示される。

図10 SEARCHコマンドでの検索例 図10 SEARCHコマンドでの検索例

 検索条件は別表3に示すように、実に多彩な選択ができる(こちらをクリックすると、別ウィンドウで検索条件の一覧を開きます)。フラグなどのメール属性、ヘッダ/ボディ情報各種による検索機能が用意されている。検索条件は単一の要素のみで示す(例:Deleted など)ものもあれば、値を示す(例:From="user@example.com" など)ものもある。通常、( ) でそのままくくることでAND条件を、先頭に「NOT」を付けることでNOT条件を、「OR」を付けることで後続の複数条件をOR条件として指定できる。

 キャラクタセットは、検索条件の文字列のキャラクタセット(言語)を指定する。例えば、多くの日本語メールの本文はISO-2022-JPなので、ボディを検索する場合には「charset ISO-2022-JP」と指定する必要がある。

メールの操作

STORE メッセージ番号 フラグ状態 フラグ名

 前編でも説明した、各メールのメッセージフラグの設定を行うのがSTOREコマンドだ。フラグは、メールが削除予定やドラフトであることをマーキングする目的で使用される。

図11 STOREコマンドでメッセージフラグを設定したとこ 図11 STOREコマンドでメッセージフラグを設定したところ

 例のように、指定したメッセージ番号(複数指定もできる)のメールに、指定したフラグの設定や追加、削除が行える。フラグ名は ( ) でくくり、設定するフラグを複数記述できる。フラグ状態は、以下のいずれかを指定する。

フラグ 意味
FLAGS 指定したフラグ(またはフラグリスト)に置き換える
+FLAGS 指定したフラグを追加する
-FLAGS 指定したフラグのみを削除する
表2 STOREフラグの状態
FLAGSをFLAGS.SILENTとすることで、実行後の確認出力(FETCH出力)を抑止する

APPEND メールボックス名[ フラグ][ Date] メール内容

 APPENDコマンドは、任意のメールボックスに、任意のメールメッセージを格納する。これはPOP3にはない大きな特徴だ。例えば、メーラで作成したメールメッセージをドラフトメールボックスに格納したり、送信したメールを送信済メールボックスに保管する、などの際に使用される。

図12 APPENDコマンドでメールボックスにメッセージを格納しているところ 図12 APPENDコマンドでメールボックスにメッセージを格納しているところ

 例では、後述する「リテラル」が現れているので分かりにくいかもしれないが、メールメッセージをそのまま送っていることは分かるだろう。オプションで、設定するフラグや作成日時(エンベロープの作成日時)を指定することもできる。

EXPUNGE

 IMAP4でのメール削除は、論理削除方式を取る。論理削除に使用されるのは、\Deletedフラグだ。この\Deletedフラグの設定されたメールは、クライアント側で「削除予定メール」として取り扱われなければならない。またこの削除予定を、\Deletedフラグを除去して解除することもできる。

 完全に物理的に削除するには、EXPUNGEコマンドを使用する。このコマンドはメールボックス中の、\Deletedフラグの設定されたメールをすべて物理的に削除する。このあとは元に戻せない。なお、メッセージ番号はEXPUNGE後、ただちに振り直されるので、注意が必要だ。

IMAP4のその他の機能

 おもに拡張仕様によって、IMAP4にはいくつか機能が追加されてきている。

IDLEコマンド

 IDLE機能は、名前通り、セッションのアイドル状態を維持するための機能だ。クライアントからのIDLEコマンドにより、サーバはセッションを保持しつつ、アイドル状態に移行する。そして、新着メールがあるなど変化があったときには、このセッションを通じてメッセージを送る。言うなれば、IMAP4における「プッシュ」技術である。RFC2177で定義されている。

名前空間

 名前空間はIMAP4では一般的な考え方で、ユーザーが使えるサーバのエリアには、個人のメールボックスが保管されている「個人空間」、ほかのユーザーと共有する「共有空間」、またはFTPが提供するFTPの空間などがあり、それぞれ空間の名前で使い分けられるようにしようというものだ。

 個人空間はデフォルトなので特に名前はないが、「#Shared」「#FTP」「#News」などのように、階層メールボックスの最上位に位置できるように想定している。こうした名称を用いることで、共有空間やFTP、ネットニュース機能を名前で使い分けることができる。NAMESPACEコマンドは、使用できる名前空間の一覧を表示する。

図13 NAMESPACEコマンドの使用例 図13 NAMESPACEコマンドの使用例

 そのほか、ユーザー間のセキュリティを提供する「アクセスコントロール」(RFC2086)、使用容量制限を行う「QUOTA」(RFC2087)などの機能が追加されている。

 ただし、これらの機能はあくまでオプションであり、対応していないサーバもある。実際に使用できるかどうかは、CAPABILITYコマンドで確認できる。

多言語への対応

 多言語(国際化 i18n)への対応において、まずメールボックス名ではUTF7を用いて命名できる。ただし、一般的にUTF7に用いられる文字がIMAP4での予約文字と衝突するため、オリジナルのUTF7に若干の修正が加えられている。このUTF7を修正Base64(パディングとして=(イコール)を使わない、/(スラッシュ)の代わりに,(カンマ)を用いるなどの修正をしている)エンコードしたうえで、&(アンパサンド)と-(マイナス)でくくることとしている。

 IMAP4ではHTTPなどと異なり、原則として7ビットコードのみを扱うこととしている。MIMEエンコードされたメールなどは、7ビット以外ありえないので問題ないが、それでもときとしては8ビットコードを扱わないといけない場合もある。そこで「リテラル」という8ビットへの切り替え局面を想定している。以下の例を見てほしい。

図14 日本語メールをFETCHコマンドで切り出しているところ。かっこ内の数字は、日本語のバイト数を示している 図14 日本語メールをFETCHコマンドで切り出しているところ。かっこ内の数字は、日本語のバイト数を示している

 これは、日本語メールのボディだけをFETCHコマンドで切り出している例だ。通常のFETCHならそのまま連続するところが、途中で{40}として行を変え、出力を切り替えている様子が分かるだろう。40は日本語部分(つまり8ビットコード)のサイズだ。このように、 { } で8ビットへの切り替えを相手に指示し、指定サイズ分の受け取り準備をさせるわけだ。

 ここではFETCHでの例だが、APPENDでのクライアントからサーバへの送信時など、どのコマンドにおいてもリテラルは利用できる。


 さて、このように多彩な特色を持つIMAP4だが、実際に会社やISP経由などで使用している読者はどれほどいるだろうか? 周りを見てもあまり話を聞かない、というのがほとんどではないか。

 残念ながら、これまでIMAP4はPOP3ほどは浸透してこなかった。理由はいくつか考えられる。最も大きな理由の1つは、サーバ集中型であるがゆえに、それなりのサーバ性能が必要であること、メールをサーバに残す前提のため大量のHDD容量が必要であることが管理者に嫌われた、という背景があるようだ。特に後者は、HDDのコストも馬鹿にならないし、何より日常的にディスク管理やバックアップなどの手間が増える。また、初期には特に日本語環境での互換性も問題になった。

 しかし、近年のモバイルユーザーの増加により、ISPなどの例を見ても一時期に比べ、IMAP4を採用する業者が増えてきている。また、Webメールでも実は内部ではIMAP4を使用している例も多い。

 メジャーなメーラやメールサーバのほとんどがIMAP4に対応し終わった現在、メールの利用形態の移り変わりとともに、IMAP4はメールのメインストームとしての地位を徐々に確立しつつある。

 次回は、いよいよ連載最後のテーマだ。最も古参のインターネットプロトコルであるFTPを取り上げる。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。