IMAP IDLEって?
メールサーバ上のメールにアクセスするためのプロトコルであるIMAPを用いて、メールが届いたことを即座に把握するための拡張です。いわゆるプッシュ通知。
ここではIMAP IDLEの動作を手打ちで見るために必要な操作に絞って記載します。
参考
- IMAP 101: Manual IMAP Sessions – IMAP commands – atmail email
- telnet(openssl)でIMAPプロトコルを喋ってGmailに命令を出す。 – それマグで!
- RFC1730(INTERNET MESSAGE ACCESS PROTOCOL – VERSION 4)
- rfc2177 (IMAP IDLEの技術仕様)
確認環境
- サーバ : Dovecot 2.3.14
準備
クライアントにTelnetかOpenSSLが必要になります。どちらもWindows/Linux/Mac OSにインストールして用意できると思いますが方法は割愛します。
IMAPサーバへの接続
接続を暗号化していない場合
Telnetで接続します。
telnet [メールサーバのドメインまたはIPアドレス] 143
接続を暗号化している場合(SSL/TLS)
接続を暗号化していて、接続ポートがTCP 993の場合。
OpenSSLで接続します。
openssl s_client -connect [メールサーバのドメインまたはIPアドレス]:993 -crlf -quiet
接続を暗号化している場合(STARTTLS)
接続を暗号化していて、接続ポートがTCP 143の場合。
OpenSSLで接続します。
openssl s_client -connect [メールサーバのドメインまたはIPアドレス]:143 -crlf -quiet -starttls imap
IMAPのコマンド操作
タグについて
基本的にIMAPのコマンドの先頭にはクライアントが任意のタグを付ける必要があります。
以下の例で言えば、「a001」がタグです。
a001 select "inbox"
IMAPのコマンドは非同期で実行が可能であり、応答が何についてのものなのかクライアント側で把握するためにタグを付けます。
とりあえず手動で打つ場合は適当な英数字にしておけば問題ないと思われます。
ログイン
ここではパスワードが平文の場合を記載します。
パスワード自体を暗号化して認証する方式などまで含めると多様すぎるため、参考元などの詳しい情報をご確認ください。
a001 login [メールユーザ] [パスワード]
メールボックスのリスト
a002 list "" "*"
以下の例のようにアカウント内のメールボックスの一覧が表示されます。
a002 list "" "*"
* LIST (\HasNoChildren \UnMarked \Archive) "/" Archive
* LIST (\HasNoChildren \UnMarked \Sent) "/" Sent
* LIST (\HasNoChildren \UnMarked \Drafts) "/" Drafts
* LIST (\HasNoChildren \Trash) "/" Trash
* LIST (\HasNoChildren \Junk) "/" Junk
* LIST (\HasNoChildren) "/" INBOX
a002 OK List completed (0.003 + 0.000 + 0.002 secs).
メールボックスの選択
IMAP IDLEでメールボックスの件数の変化を確認するためには、対象のメールボックスを選択しておく必要があります。(これを書き残すきっかけです)
ほとんどの場合はデフォルトのメールボックスであるinboxになると思いますが、違う場合は前述の方法でリストから対象の名称を確認して書き換えてください。
a003 select inbox
IDLE
IDLEの待受
a004 idle
待受状態になると、以下のようにサーバの状態が送られてきます。
a004 idle
+ idling
* OK Still here
* 12 EXISTS
* 1 RECENT
* OK Still here
一定間隔で接続の生存確認としてOK Still here
が送られます。これはサーバ側の設定で感覚が異なります。
メールボックスに変化があるとEXISTS
(メールの総数)とRECENT
(RECENT[最近?]フラグがついたメール数)が送られます。
IDLEの終了
IDLE状態を明示的に終了する場合は以下のコマンドを送ります。
これは先頭にタグが必要ありません。
done
ログアウト
a005 logout
コメント