Mac::Growlでメール通知

Mac::Growlというモジュールがあったので勉強を兼ねて(とっても陳腐すぎる例題なんですが...へへ)新着メールを通知するスクリプトを作ってみました。未読メールのチェックはMail::IMAPClientモジュールを使って簡単にできます。

my $imap = Mail::IMAPClient->new(
  Server   => 'mail.mac.com',
  User     => $account,
  Password => $passwd,
 ) || die 'Can¥'t Connect to mail.mac.com';

$imap->select("INBOX");
if (($imap->unseen_count("INBOX") || 0))
{
  foreach my $msg ($imap->unseen)
    {
      #未読メールの処理
    }
}
$imap->disconnect;

後は、メールにかけられた呪文「MIME〜後編」を参考に、Subjectを抜き出しエンコード、通知処理を行います。

my $temp = $imap->subject($msg);

$subject = '';
while ($temp =~ m/=\?iso-2022-jp\?([QB])\?([^\s\t]+)\?=?/i)
{
  if ($1 eq 'B')
  {
    $subject = $subject . MIME::Base64::decode_base64($2);
  }
  else
  {
    $subject = $subject . MIME::QuotedPrint::decode_qp($2);
  }
  $temp =~ s/=\?iso-2022-jp\?([QB])\?([^\s\t]+)\?=?//i;
}
if ($subject)
{
  Encode::from_to($subject, "ISO-2022-JP", "UTF8");
  Mac::Growl::PostNotification('mailgrowl', 'info', $mailgrowl, $subject, 1);
}

日本語の含まれないSubjectは(9割がスパムなので)あえて無視してます。デバグ中に判明したのですが、Subjectの形態は"=?ISO-2022-JP?B?*************?="の形式が複数回繰り返されていましたので、抜き出しながら連結しています。

Base64エンコードされたSubjectの部分は[A-Za-z0-9¥+¥/]で切り出すべきなのかもしれませんが、送られてきたメールSubjectに誤りがないという前提で、QuotedPrintと共用で[^¥s¥t]としていますが今ひとつ自信がないのですが、今チェックしているSubjectは全部いけてるからOKとしてます。まあ、珍しくもないベタなサンプルだけどスパムフォルダの自動削除とかいろいろやりたい機能を作成するとっかかりにはなりそうです。

それにしてもCPANの充実度はすごいものがありますね。自分でやることは、モジュールのハンドリングだけだったりします。

添付サイズ
mgrowl.pl.txt1.28 KB

この記事のトラックバックURL:

http://hippos-lab.com/blog/trackback/255

返信