すごく簡単なメール通知機能を書いた。

Ubuntuでなんかいいのないかなって思ったんだけど、いいのが
見つけられなかったのでとりあえず自作で。通知には notify-sendを
使いました。

#!/usr/bin/env perl
use strict;
use warnings;

use AnyEvent;
use Config::Pit;
use Net::IMAP::Client;
use Getopt::Long;
use Encode;
use utf8;
use File::Which qw(which);

unless(which('notify-send')) {
    die "Please install notify-send\n";
}

GetOptions(
    "no-ssl" => \my $no_ssl,
    "port|p=i" => \my $port,
);

my $ssl = defined $no_ssl ? 0 : 1;
$port   = defined $port ? $port : 993;

my $mail_server = shift or die "Usage $0 [--no-ssl] [--port=port_num] mail_server\n";

my $config = pit_get($mail_server, require => {
    user => "user account name",
    pass => "password at mail server",
});

my $imap = Net::IMAP::Client->new(
    server => $mail_server,
    user   => $config->{user},
    pass   => $config->{pass},
    ssl    => $ssl,
    port   => $port,
) or die "Can't create IMAP object\n";

$imap->login or die "Can't login $mail_server\n";

my $condvar = AnyEvent->condvar;

my $icon = '/usr/share/pixmaps/thunderbird.png';
my $w = AnyEvent->timer(
    after => 0,
    interval => 180,
    cb => sub {
        my $status = $imap->status("INBOX");
        unless($status) {
            $imap->logout;
            $condvar->send;
        }

        my @command = ('notify-send', "--icon=$icon",
                       encode_utf8("$mail_server"),
                       encode_utf8("未読メール数: " . $status->{UNSEEN}));

        system(@command);
    },
);

$condvar->recv;
die "Error is occur\n";

使い方

  % perl mail_notifier.pl mail_server

3分に一回ポップアップで未読メール数を教えてくれます。


使い方は

  % perl mail_notifier.pl imap.googlemail.com

みたいな感じです。GMailでは動作することが確認できました。
イメージはこんな感じ。


やるならもうちょいおしゃれにしたいので、
もう少し凝ってみようかな。