IMAPサーバーの新着メールをGrowlで確認

GrowlでbiffするPOP3サーバー用のソフトはいくつか有るようですが、IMAPサーバー用が見つからなかったので作ってみました。

AggregatorやCustomFeedでのプラグインにすればPlaggerでも出来ますが、短いスパンでポーリングしたかったので。

一応複数サーバー・フォルダーに対応しています。Cronに登録して使用してください。

#!/usr/bin/perl

use strict;
use warnings;

use Net::Growl;
use Net::IMAP::Simple;
use Email::MIME;
use YAML;
use File::HomeDir;

our $app = 'IMAP2Growl';

my $config_file = File::HomeDir->my_home . '/.imap2growl.yaml';

my $c = YAML::LoadFile($config_file) || {};
my ($imap_conf, $growl_conf) = map {
    (ref $c->{$_} eq 'ARRAY')? $c->{$_}: [$c->{$_}];
  } qw/imap growl/;

foreach (@$imap_conf) {
  $_->{folder} ||= 'INBOX';

  register(
      application => $app,
      host        => $_->{host},
      password    => $_->{pass},
    ) foreach (@$growl_conf);

  my $imap = Net::IMAP::Simple->new($_->{host})
    or to_growl('Error', "Unable to connect.\n". $Net::IMAP::Simple::errstr);

  $imap->login($_->{user}, $_->{pass})
    or to_growl('Error', "Login failed.\n". $imap->errstr);

  my $new_count  = $imap->recent;
  my $full_count = $imap->select($_->{folder});
  for (my $i=$full_count; $i > $full_count-$new_count; $i--) {
    my $email = Email::MIME->new(join('', @{$imap->get($i)}));
    my $subject = $email->header('Subject') || 'No subject';
    to_growl("New mail\n".$_->{host}, $subject);
  }
}

sub to_growl {
  my ($message, $description) = @_;
  notify(
      title       => $message,
      description => $description,
      application => $app,
      password    => $_->{pass},
    ) foreach (@$growl_conf);
  exit if ($message eq 'Error');
}

__END__

=head1 NAME

IMAP2Growl

=head1 SYNOPSIS

% imap2growl.pl

=head1 DESCRIPTION

From IMAPserver's new mail to Growl.

=head1 CONFIG

in ~/.imap2growl.yaml

  imap:
    host: localhost
    user: userid
    pass: password
    folder: INBOX optional

  growl:
    host: localhost
    pass: password

or

  imap:
    - host: localhost
      user: userid
      pass: password
      folder: INOBX
    - host: localhost
      user: userid
      pass: password
      folder: spam

   growl:
    - host: localhost
      pass: password
    - host: 192.168.0.1
      pass: passwd

=cut

ちなみに最初はMac::Growlで実装したのでアイコン付きでいい感じだったのですが、文字化けをどうしてもFIX出来なかったのでNet::Growlに変更しました。

あと、priorityとstickyが期待した通りに動かないようなので設定していません。