元気玉メールをIMで通知する

弊社には元気玉という仕組みがあって、詳しくは代表のブログを参照、これに誰よりも速く返信するために元気玉という文字がメールの件名に含まれていた場合即座にIMに通知するような仕組みを作った。

うちで使用しているメール配信ソフトウェアは postfix+maildrop で、IMへの通知には im.kayac.com のAPIを使用。

非常に簡単にできた。まずmaildropのフィルタ ~/.mailfilter:

DECODED_SUBJECT = ""
if ( /^Subject:\s*(.*)$/ )
{
        MATCH1 = escape($MATCH1)
        DECODED_SUBJECT = `echo $MATCH1 |/home/typester/bin/subjectdecoder.pl`
}

if ( $DECODED_SUBJECT =~ /元気玉/ )
{
        cc "|/home/typester/bin/mail2im.pl"
}

二つのスクリプトを読んでます。subjectdecoder は単にMIMEエンコードされてる件名をutf-8にして戻してあげるだけのもので、mail2im.plが実際にIMメッセージを送るスクリプト。以下がその中身。

subjectdecoder.pl:

#!/usr/bin/env perl

use strict;
use warnings;

use Encode;

my $subject = do { local $/; <STDIN> };
$subject =~ s/\\(.)/$1/gs;

print encode('utf-8', decode('MIME-Header', $subject));

mail2im.pl:

#!/usr/bin/env perl

use strict;
use warnings;

my $mail = do { local $/; <STDIN> };

use Encode;
use Email::MIME;
use Mail::Address;

my $msg = Email::MIME->new($mail);

my $subject = encode('utf-8', $msg->header('Subject'));
my ($from)  = Mail::Address->parse( $msg->header('From') );

exit unless $subject && $from;

use LWP::UserAgent;
use HTTP::Request::Common;

my $res = LWP::UserAgent->new->request(
    POST "http://im.kayac.com/api/post/typester",
    [ message => "[E-Mail] $subject (@{[$from->address]})" ]
);

件名デコードしないとmaildropで日本語の件名のマッチングができないのが面倒だけど(これってなんとかならんのかな)、それでも簡単にできた! im.kayac.com++ (自画自賛

by typester / at 2007-10-18T17:22:00 / life · mail · im / Comment

こうだったらいいのに auto-save-buffers

開いてるファイルが svn(k) の copath だったらON、それ以外だったらOFFって自動でなるといいのになー。

今は

(run-with-idle-timer 0.5 t 'auto-save-buffers "^/home/typester/dev/" "^$")

とかしてるけれど、その領域でもたまにsvn管理じゃないファイルつかったりするし、それで自動保存されると困るし。

by typester / at 2007-10-18T13:32:00 / emacs / Comment