#!/usr/bin/env perl use strict; use warnings; use Fcntl; use Env qw(HOME); use constant MC_FILE_PATH => '/tmp/mc_'; sub test_gpg { my $ret; $ret = system("echo test | gpg2 --sign --batch --no-tty --pinentry-mode error -o /dev/null >/dev/null 2>&1"); if ($ret != 0) { notify(" gpg locked | can't fetch mails"); } return $ret; } sub notify { my ($str) = @_; my $pid; $pid = fork(); if (not $pid) { exec('herbe', $str); } return; } sub get_new_mail { my ($acc) = @_; my $ret; system('killall mbsync >/dev/null 2>&1'); $ret = system('mbsync', $acc); if ($ret != 0) { notify(" $acc: failed to sync mails"); } return; } sub get_all_accounts { my @accs; opendir(my $dh, $ENV{'MAIL'}) or die $!; @accs = grep { !/^\./ } readdir($dh); closedir($dh); return @accs; } sub count_new_mails { my ($acc) = @_; my $count; my $dir; my $path = $ENV{'MAIL'} . '/' . $acc . '/INBOX/new'; $count = 0; opendir(my $dh, $path) or die $!; $count = grep { -f "$path/$_"} readdir($dh); closedir($dh); return $count; } sub fetch_thread { my ($acc) = @_; my $pre_count = -1; my $mc_file = MC_FILE_PATH . $acc; my $fh; if (-f $mc_file) { open($fh, '+<', $mc_file) or die $!; $pre_count = <$fh>; } else { open($fh, '+>', $mc_file) or die $!; $pre_count = -1; } # if ($pre_count == -1) { # $pre_count = count_new_mails($_, $maildir); # } get_new_mail($acc); my $post_count = count_new_mails($acc); if ($post_count > $pre_count && $post_count > 0) { my $notify_str = ' ' . $acc . ': ' . $post_count . ' new mail'; $notify_str .= ($post_count > 1 ? "s\n" : "\n"); notify($notify_str) } seek($fh, 0, 0); print $fh "$post_count"; close($fh); return; } sub fetch_mail { $ENV{'MAIL'} = $HOME . '/.local/share/mail'; $ENV{'GNUPGHOME'} = $HOME . '/.local/share/gnupg'; $ENV{'PASSWORD_STORE_DIR'} = $HOME . '/.local/share/pass'; my @pids; my $ret; $ret = test_gpg(); if ($ret != 0) { return; } my @accs = get_all_accounts(); for (@accs) { my $pid = fork(); if (not $pid) { fetch_thread($_); return; } push(@pids, $pid); } while (wait() != -1) {} return; } fetch_mail(); __END__