元気玉メールを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++ (自画自賛