さて、私はAUの携帯を使っているのだがgmailなどの着信ってスマートフォンではどうやってわかるのかなーとIS03も出たし、まじめに考えてみた。
(実際にスマートフォンは使ったことがないのだが、そろそろと考えてはいる。)

どうやらIMAP4にはIDLEというコマンドがあり、gmailなどはこのコマンドを使って、拡張サポートされるらしくこれを実装してみようと思った。
仕様は非常に簡単で、http://tools.ietf.org/html/rfc2177を読むと書いてある。

まあ、実際の動きもdovecotを使って確認してもそれほど難しいわけではない。
ようは、接続を切らずにいると、向こうから、メールが来たよ!と通知するというだけである。

個人的には、スマートフォンでなくて自分のPCでもこれができればうれしいことはあるかもしれない。
そのためには、要はIMAPのIDLEをサポートするサーバに転送してしまえばいいこととなる。

だがこの機能を実装するに当たり一つ疑問が生じた。

0001 IDLE
とリクエストを投げると・・・

+ idling
* 3 EXISTS
* 3 EXISTS

のようなレスポンスの各1行がある程度の時間毎に帰ってくる。
最初の+ idlingは、IDLEコマンドを投げてすぐに帰ってくるのだが、それ以外のレスポンスはメールが着信すると、もしくは一定の間隔(たぶん)で帰ってくる。

仕様をみてもわかるのだが、
S: * 2 EXPUNGE
S: * 3 EXISTS
と、2行が一回の通知あたりのレスポンスかもしれない。

人間が見ながらリクエストを投げていれば、それはどれが一回の通知かはわかる(あー今回は2行が結果かとか)が、
機械的にみるとしたら、どこまでが一回の通知なのかがよくわからない。
だから、どこで、次のメッセージを取得する処理になればいいのだろうか・・・・・
時間的な区切りがなければ、結果だけを見てもどこが一区切りなのかわからない。

んーわからない。

で、仕方がないので、IDLEコマンドで結果が”*”を含む帰ってきてから、1.5秒後にDONEの結果を投げて、IDLEをやめることにした。
(そのあたりは、google codeにコミット済み)
そもそも、なぜ1.5秒かと言えば、根拠はない。
初めての”*”を含むレスポンスを受けてから、1.5秒以内には後のレスポンスも当然くるよね。という前提。
1秒でもなく、2秒でもないのは、気分。
(まあ、数秒の単位で急いで正しく知るようなシビアな要求もないでしょうから・・・)

仕様としては、IDLEコマンドは何らかの結果が帰ってくると、それでIDLE状態から抜けるような動きになる。
なので、そこでメッセージを取得して再度、IDLE状態にする場合には、再度、IDLEコマンドを実行する必要がある。

という感じにした。
果たして、これでよいのだろうか?今ひとつわからないが、とりあえずこの方向で進めることにした。

お仕事のご依頼・相談を承ります
この記事に関連するお仕事のご依頼やご相談をお待ちしております。 詳しくは、こちら

Leave a Reply

お仕事のご依頼・相談
この記事に関連するお仕事のご依頼やご相談をお待ちしております。 詳しくは、こちら
ソフトウェア&ライブラリ




ライブラリ
airxmail(en)
AIR版メール送受信ライブラリ
airxzip
AIR版ZIP圧縮・解凍ライブラリ
執筆書籍
本、雑誌等

WEB記事:CodeZine
執筆記事はこちら
カレンダー
2010年12月
« 11月   1月 »
 12345
6789101112
13141516171819
20212223242526
2728293031  

カスタム検索
RSS
Add to Google < !–adsense–>
アーカイブ
カテゴリ
にほんブログ村 IT技術ブログへ