summaryrefslogtreecommitdiffstats
path: root/.local/bin/fetch_mail
diff options
context:
space:
mode:
Diffstat (limited to '.local/bin/fetch_mail')
-rwxr-xr-x.local/bin/fetch_mail125
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__