AnyEvent::IMAPListen

というモジュールをつくりました。
http://github.com/taiyoh/AnyEvent--IMAPListen
ハイフンが2つになってしまったのはミス><
iPhoneで一番困るのは、メールの通知が(mobile.meを使っていない限り)プッシュ通知ができないということだと思います。
今までは、gmailの転送設定でi.softbank.jp宛に送って凌いでいたのですが、
そうなると2つのアカウントの未読管理をする必要がでてくる。
いい加減そんなローテクなことをしてるのはエンジニアの端くれとしてまずいなと思い、
Perlでなんとかできないか調べることに。
で、gmailで対応してそうなプッシュ通知の方法を色々調べるうちに、どうもIMAPを監視するのがよさそうだと。
IMAPには「IDLE」というコマンドがあって、これをサーバに投げつけておくと、
解除しない限りどんなコマンド送ってもエラーになってしまうものの、その間にメールがくると、
接続したソケットに対して、1行メッセージを返してくれるらしい。
これは正にAnyEventの出番でしょう、ということで、実際に組んでみた。

use AnyEvent::IMAPListen;
# パラメータはMail::IMAPClientと同じで、
# on_notify, on_error, on_connect, handle_notify
# のメソッドを追加で定義できるようになっている
my $listener; $listener = AnyEvent::IMAPListen->new(
    Server    => 'imap.gmail.com',
    Port      => 993,
    User      => 'aaaa',
    Password  => 'xxxxxx',
    Ssl       => 1,
    Uid       => 1,
    Debug     => 1,
    on_notify => sub { # if mail comes
        my ($self, $header, $msg_id) = @_;
    },
    on_error => sub {
        my ($self, $e_error, $l_error) = @_;
    }
)->start;

AE::cv->wait;

tipsとしては、on_connectで$self->imap->select('hoge')とかやると、hogeフォルダを指定して監視することができます。
メールが来た時は、まずhandle_notifyイベントが呼ばれ、未読メールのヘッダを取得したのち、on_notifyイベントを呼ぶようになってます。
なので、この辺の処理が気に入らない場合は、handle_notifyをさっくり書き換えてしまってください。
この一連の定義方法も気に入らない時は、handle_on_connectedメソッドをオーバーロードしてもらえれば、と思ってます。
handle_on_connectedをオーバーロードの際に気をつけてもらいたいのは、必ずdoneメソッドでIDLE状態を解除してから各種操作をしないと、サーバからエラーを返されて操作不能になります。
で、諸々の処理が終わったら改めてidleメソッドを実行してIDLE状態にして、その時のIDを保持するようにしてください。


まあ、当初の目的を満たすのは、im.kayac.com宛にメールを転送すればいいんですけどね。全部作ってim.kayac.comを読み直して気づいた。

(追記)タイトルのモジュール名ミスってました><