diff options
Diffstat (limited to '.local/bin/fetch_mail')
| -rwxr-xr-x | .local/bin/fetch_mail | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/.local/bin/fetch_mail b/.local/bin/fetch_mail new file mode 100755 index 0000000..04df4b3 --- /dev/null +++ b/.local/bin/fetch_mail @@ -0,0 +1,125 @@ +#!/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; + + $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; + } + get_new_mail($acc); + my $post_count = count_new_mails($acc); + if ($post_count > $pre_count && $post_count > 0) { + my $notify_str = '[mail] ' . $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; + } + system('killall mbsync >/dev/null 2>&1'); + 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__ |
