前回までで、IMAP4機能の概要を説明した。今回は、基本的なコマンド別の機能の動作などについて解説しよう。また、別表1にコマンド一覧もまとめたので、参考にしてほしい(こちらをクリックすると、別ウィンドウでコマンド一覧を開きます)。
サーバの機能一覧を表示する。拡張コマンドやAUTHENTICATEの認証方法への対応を確認するのに使用される。
最も一般的なログインのためのコマンド。引数にユーザー名とパスワードを指定する。
LOGINコマンドに代わり、よりセキュアな方法で認証するためのコマンドである。SMTPの回で説明したSASLに沿った認証方法を用いる。CAPABILITYコマンドやログイン直後のレスポンスにおいて、「AUTH=認証方法」という表示で、対応している認証方法をサーバが提示するので、その中からクライアントは自身が使用できる認証方法を選択し、ログインを行う。認証方法には、CRAM-MD5、Kerberosなどがある。詳しくはSMTPの回を参照してほしい。
IMAP4サーバからログアウトする。
存在するメールボックスの一覧を表示する。「参照位置」とは階層の位置のことであり、""(値なし)が最上位を示している。「ワイルドカード」には2種類あり、% はその階層のみを、* は再帰的にすべての階層の表示を行う。あるいは直接、マッチするための文字列を指定してもよい。
LISTコマンドによって、以下のようなタグなし行による結果が返答される。
* LIST 属性 階層区切り文字 メールボックス名
このうち「属性」は、以下のような種類によってメールボックスの属性を示す。
種類 | 意味 |
---|---|
\Noinferiors | このメールボックス/フォルダ以下には、子階層や子メールボックスを作ることができない |
\Noselect | このメールボックスは選択する(後述のSELECTコマンド)ことができない |
\Marked | 新規の到着メールがある |
\Unmarked | 到着メールはない |
表1 IMAP4のLIST属性 |
なお、属性をくくっている ( ) は、IMAP4の仕様でたびたび現れる「リスト」と呼ばれる表示形式だ。かっこ内の要素をスペースで区切って、複数の要素を表現している。
「階層区切り文字」は、階層メールボックスを表現する場合に、階層区切りを示す文字の指定だ。つまり、このメールボックスやフォルダ以下では、ここで指定された文字が階層の区切りに使われる。ほとんどの場合は / (スラッシュ)なのだが、OSの違いや、前編でも述べたネットニュースの場合には、例えば「comp.mail.imap4」などのように、別の区切り文字を使いたい場合もある。このように、OSやシステムから独立した利用を想定しているのである。
メールボックスが複数ある以上、まずどのメールボックスを操作するか指定しなくてはならない。引数に示されたメールボックスを、以下に続くメール操作コマンドにおいて使用することを宣言する。
レスポンスでは、次のような対象メールボックスのステータスも返答される。
またレスポンスコードによって、そのほかの付随する情報も返答されているのが分かるだろう。最終行のレスポンスコードでは、このメールボックスが「読み書き可能」か「読み込み専用」かも判別できる。
LISTとSELECTコマンドの組み合わせだけでは、サーバ上のすべてのディレクトリが対象になってしまうかもしれない。SUBSCRIBEコマンドで購読、つまり日常使用するメールボックスのチェックを行い、LSUBコマンドで購読しているメールボックスの一覧だけを得ることで、効率的な操作が可能になる。購読情報はサーバで管理されるので、ほかのコマンドによるアクセス時にも同様の購読が示されるというメリットもある。また、UNSUBSCRIBEコマンドは購読の中止を行う。なお、inboxは必ず購読していることになる。
IMAP4の非常にユニークな特色を表しているのが、このFETCHコマンドだ。前半で、IMAP4はメールのMIME構造を理解すると述べた。以下の例を見てほしい。
これは、「取得データ種類」としてBODYSTRUCTUREオプションを指定した例だ。MIMEの回を読んだ読者であれば、大体の意味は分かってもらえるのではないか。BODYSTRUCTUREオプションは、MIMEの構造を ( ) でかこい、構造化して示す。こうした機能は、クライアントでMIME解析をしなくてもよいようにとの配慮である。
また、BODY[パート番号] オプションで、マルチパートの場合に必要なパートのボディのみを取得することができる。構造を調べたのち、必要な部分のみを取り出せるわけだ。
BODYSTRUCTUREオプションはMIMEの全体構造を示すが、一方のENVELOPEオプションではヘッダの構造を取得可能だ。
これらの例では、分かりやすいように適当に整形している。実際にはひとつなぎに表示されるので、注意してほしい。なお、「メッセージ番号」の指定は、1つの番号だけでもよいし、「1:3」として1から3までのメールすべて、あるいは「2,5」として2と5の2通のみ取得、といった複数指定もできる。
複雑な例から述べたが、もちろんPOP3のようにメール全体やヘッダだけを取り出すこともできる。またフラグの状態も、FLAGオプションによって確認可能だ。別表2のオプション一覧も参考にしてほしい(こちらをクリックすると、別ウィンドウでFETCHオプションの一覧を開きます)。
サーバサイドでのメールの検索機能も、IMAP4の大きな特徴だ。POP3であれば、最初にすべてのメールをダウンロードしたあとで検索が可能になるところだが、IMAP4であればサーバ上で行えるので、検索後、対象メールのみダウンロードということも可能である。
SELECTコマンドでメールボックスを選択したあとに、そのメールボックス内のメールを対象に検索が行われる。結果は、メッセージ番号で示される。
検索条件は別表3に示すように、実に多彩な選択ができる(こちらをクリックすると、別ウィンドウで検索条件の一覧を開きます)。フラグなどのメール属性、ヘッダ/ボディ情報各種による検索機能が用意されている。検索条件は単一の要素のみで示す(例:Deleted など)ものもあれば、値を示す(例:From="user@example.com" など)ものもある。通常、( ) でそのままくくることでAND条件を、先頭に「NOT」を付けることでNOT条件を、「OR」を付けることで後続の複数条件をOR条件として指定できる。
キャラクタセットは、検索条件の文字列のキャラクタセット(言語)を指定する。例えば、多くの日本語メールの本文はISO-2022-JPなので、ボディを検索する場合には「charset ISO-2022-JP」と指定する必要がある。
前編でも説明した、各メールのメッセージフラグの設定を行うのがSTOREコマンドだ。フラグは、メールが削除予定やドラフトであることをマーキングする目的で使用される。
例のように、指定したメッセージ番号(複数指定もできる)のメールに、指定したフラグの設定や追加、削除が行える。フラグ名は ( ) でくくり、設定するフラグを複数記述できる。フラグ状態は、以下のいずれかを指定する。
フラグ | 意味 |
---|---|
FLAGS | 指定したフラグ(またはフラグリスト)に置き換える |
+FLAGS | 指定したフラグを追加する |
-FLAGS | 指定したフラグのみを削除する |
表2 STOREフラグの状態 *FLAGSをFLAGS.SILENTとすることで、実行後の確認出力(FETCH出力)を抑止する |
APPENDコマンドは、任意のメールボックスに、任意のメールメッセージを格納する。これはPOP3にはない大きな特徴だ。例えば、メーラで作成したメールメッセージをドラフトメールボックスに格納したり、送信したメールを送信済メールボックスに保管する、などの際に使用される。
例では、後述する「リテラル」が現れているので分かりにくいかもしれないが、メールメッセージをそのまま送っていることは分かるだろう。オプションで、設定するフラグや作成日時(エンベロープの作成日時)を指定することもできる。
IMAP4でのメール削除は、論理削除方式を取る。論理削除に使用されるのは、\Deletedフラグだ。この\Deletedフラグの設定されたメールは、クライアント側で「削除予定メール」として取り扱われなければならない。またこの削除予定を、\Deletedフラグを除去して解除することもできる。
完全に物理的に削除するには、EXPUNGEコマンドを使用する。このコマンドはメールボックス中の、\Deletedフラグの設定されたメールをすべて物理的に削除する。このあとは元に戻せない。なお、メッセージ番号はEXPUNGE後、ただちに振り直されるので、注意が必要だ。
おもに拡張仕様によって、IMAP4にはいくつか機能が追加されてきている。
IDLE機能は、名前通り、セッションのアイドル状態を維持するための機能だ。クライアントからのIDLEコマンドにより、サーバはセッションを保持しつつ、アイドル状態に移行する。そして、新着メールがあるなど変化があったときには、このセッションを通じてメッセージを送る。言うなれば、IMAP4における「プッシュ」技術である。RFC2177で定義されている。
名前空間はIMAP4では一般的な考え方で、ユーザーが使えるサーバのエリアには、個人のメールボックスが保管されている「個人空間」、ほかのユーザーと共有する「共有空間」、またはFTPが提供するFTPの空間などがあり、それぞれ空間の名前で使い分けられるようにしようというものだ。
個人空間はデフォルトなので特に名前はないが、「#Shared」「#FTP」「#News」などのように、階層メールボックスの最上位に位置できるように想定している。こうした名称を用いることで、共有空間やFTP、ネットニュース機能を名前で使い分けることができる。NAMESPACEコマンドは、使用できる名前空間の一覧を表示する。
そのほか、ユーザー間のセキュリティを提供する「アクセスコントロール」(RFC2086)、使用容量制限を行う「QUOTA」(RFC2087)などの機能が追加されている。
ただし、これらの機能はあくまでオプションであり、対応していないサーバもある。実際に使用できるかどうかは、CAPABILITYコマンドで確認できる。
多言語(国際化 i18n)への対応において、まずメールボックス名ではUTF7を用いて命名できる。ただし、一般的にUTF7に用いられる文字がIMAP4での予約文字と衝突するため、オリジナルのUTF7に若干の修正が加えられている。このUTF7を修正Base64(パディングとして=(イコール)を使わない、/(スラッシュ)の代わりに,(カンマ)を用いるなどの修正をしている)エンコードしたうえで、&(アンパサンド)と-(マイナス)でくくることとしている。
IMAP4ではHTTPなどと異なり、原則として7ビットコードのみを扱うこととしている。MIMEエンコードされたメールなどは、7ビット以外ありえないので問題ないが、それでもときとしては8ビットコードを扱わないといけない場合もある。そこで「リテラル」という8ビットへの切り替え局面を想定している。以下の例を見てほしい。
これは、日本語メールのボディだけを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.