# 11.10 `imaplib` -- IMAP4 プロトコルクライアント

このモジュールでは三つのクラス、`IMAP4`, `IMAP4_SSL` と `IMAP4_stream` を定義します。これらのクラスは IMAP4 サーバへの接続をカプセル化し、 RFC 2060 に定義されている IMAP4rev1 クライアントプロトコルの大規模な サブセットを実装しています。このクラスは IMAP4 (RFC 1730) 準拠の サーバと後方互換性がありますが、"`STATUS`" コマンドは IMAP4 では サポートされていないので注意してください。

`imaplib` モジュール内では三つのクラスを提供しており、 `IMAP4` は基底クラスとなります:

class `IMAP4`( | [host[, port]])

  このクラスは実際の IMAP4 プロトコルを実装しています。 インスタンスが初期化された際に接続が生成され、プロトコルバージョン (IMAP4 または IMAP4rev1) が決定されます。host が指定されて いない場合、 `''` (ローカルホスト) が用いられます。 port が省略された場合、標準の IMAP4 ポート番号 (143) が用いられます。

例外は `IMAP4` クラスの属性として定義されています:

exception `IMAP4.error`
  何らかのエラー発生の際に送出される例外です。例外の理由は 文字列としてコンストラクタに渡されます。

exception `IMAP4.abort`
  IMAP4 サーバのエラーが生じると、この例外が送出されます。 この例外は `IMAP4.error` のサブクラスです。 通常、インスタンスを閉じ、新たなインスタンスを再び生成することで、 この例外から復旧できます。

exception `IMAP4.readonly`
  この例外は書き込み可能なメイルボックスの状態がサーバによって変更された 際に送出されます。 この例外は `IMAP4.error` のサブクラスです。 他の何らかのクライアントが現在書き込み権限を獲得しており、 メイルボックスを開きなおして書き込み権限を再獲得する必要があります。

このモジュールではもう一つ、安全 (secure) な接続を使ったサブクラスが あります:

class `IMAP4_SSL`( | [host[, port[, keyfile[, certfile]]]])

  `IMAP4` から導出されたサブクラスで、SSL 暗号化ソケットを 介して接続を行います (このクラスを利用するためには SSL サポート付きで コンパイルされた socket モジュールが必要です) 。 host が指定されて いない場合、 `''` (ローカルホスト) が用いられます。 port が省略された場合、標準の IMAP4-over-SSL ポート番号 (993) が用いられます。 keyfile および certfile もオプションです - これらは SSL 接続のための PEM 形式の秘密鍵 (private key) と認証チェイン (certificate chain) ファイルです。

さらにもう一つのサブクラスは、子プロセスで確立した接続を使用する 場合に使用します。

class `IMAP4_stream`( | command)

  `IMAP4` から導出されたサブクラスで、commandを `os.popen2()`に渡して作成される `stdin/stdout` ディスクリプタと接続します。 バージョン2.3 以降で新規追加された 仕様です。

以下のユーティリティ関数が定義されています:

`Internaldate2tuple`( | datestr)

  IMAP4 INTERNALDATE 文字列を標準世界時 (Coordinated Universal Time) に変換します。`time` モジュール形式のタプルを返します。

`Int2AP`( | num)

  整数を [`A` .. `P`] からなる文字集合を用いて表現した 文字列に変換します。

`ParseFlags`( | flagstr)

  IMAP4 "`FLAGS`" 応答を個々のフラグからなるタプルに変換します。

`Time2Internaldate`( | date_time)

  `time` モジュールタプルを IMAP4 "`INTERNALDATE`"表現形式に変換します。文字列形式: `"DD-Mmm-YYYY HH:MM:SS +HHMM"` (二重引用符含む) を返します。

IMAP4 メッセージ番号は、メイルボックスに対する変更が行われた 後には変化します; 特に、 "`EXPUNGE`" 命令はメッセージの削除を 行いますが、残ったメッセージには再度番号を振りなおします。従って、 メッセージ番号ではなく、 UID 命令を使い、その UID を利用するよう 強く勧めます。

モジュールの末尾に、より拡張的な使用例が収められたテストセクションが あります。

参考資料:

プロトコルに関する記述、およびプロトコルを実装したサーバの ソースとバイナリは、全て ワシントン大学の IMAP Information Center (http://www.cac.washington.edu/imap/) にあります。