small-hacks/urgent-mail-check.plx
2015-09-08 10:10:44 -07:00

176 lines
5.6 KiB
Perl
Executable file

#!/usr/bin/perl
# urgent-mail-check.plx
#
# Copyright (C) 2013, Bradley M. Kuhn
#
# This program gives you software freedom; you can copy, modify, convey,
# and/or redistribute it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program in a file called 'GPLv3'. If not, write to the:
# Free Software Foundation, Inc., 51 Franklin St, Fifth Floor
# Boston, MA 02110-1301, USA.
#
# I needed a quick script to parse the output of emacs script.
use strict;
use warnings;
use Date::Manip;
use Net::IMAP::Client;
use File::Spec;
use File::Temp;
if (@ARGV != 2) {
print STDERR "usage: <username> <password_file>\n";
exit 1;
}
my $DIR = File::Spec->catdir("$ENV{HOME}", 'tmp', '.urgent-email-displayed');
chdir($DIR) or die "unable to go to $DIR";
######################################################################
sub ReadRecentUrgentEmailAnnouncements ($) {
my($dir) = @_;
my %info;
my $file = File::Spec->catfile($dir, 'urgent-email-announce-recent');
open(RECENT_ALERTS, "<", $file) or die "unable to open $file for reading: $!";
my $key;
my $data = "";
foreach my $line (<RECENT_ALERTS>) {
chomp $line;
next if $line =~ /^\s*$/;
if ($line =~ /^\s*([\d\:\-]+)\s*$/) {
my $newKey = $1;
$info{$key} = $data if defined $key;
$key = $newKey;
$data = "";
} else {
$data .= $line;
}
}
close RECENT_ALERTS; die "error($?) reading $file: $!" unless $? == 0;
$info{$key} = $data if (defined $key); # Grab last one.
return \%info;
}
######################################################################
sub WriteRecentUrgentEmailAnnouncements ($$) {
my($dir, $info) = @_;
my $file = File::Spec->catfile($dir, 'urgent-email-announce-recent');
open(RECENT_ALERTS, ">", $file) or die "unable to open $file for reading: $!";
foreach my $key (sort keys %$info) {
print RECENT_ALERTS "$key\n$info->{$key}\n";
}
close RECENT_ALERTS; die "error($?) writing $file: $!" unless $? == 0;
}
######################################################################
# Test if network is up
system('/bin/ping -q -w 20 -c 5 pine.sfconservancy.org > /dev/null 2>&1');
if ($? != 0) {
print "\${color5}Network not up!\n";
exit 0;
}
if (not -f $ARGV[1]) {
print "\${color5}File $ARGV[1] not readable!\n";
exit 0;
}
my $output = "";
my $record = "";
my $info = ReadRecentUrgentEmailAnnouncements($DIR);
# open a connection to the IMAP server
use Net::IMAP::Client;
open(PW, "<", $ARGV[1]) or die "unable to open $ARGV[0] to find password!";
my %passwords;
while (my $line = <PW>) {
die "invalid line in password file: $ARGV[1]"
unless $line =~ /^\s*(\S+)\s+(\S+)\s*$/;
$passwords{$1} = $2;
}
close PW;
my $imap = Net::IMAP::Client->new(
server => 'pine.sfconservancy.org',
user => $ARGV[0],
pass => $passwords{$ARGV[0]},
ssl => 1, # (use SSL? default no)
ssl_verify_peer => 1, # (use ca to verify server, default yes)
# ssl_ca_file => '/etc/ssl/certs/certa.pm', # (CA file used for verify server) or
ssl_ca_path => '/etc/ssl/certs/', # (CA path used for SSL)
port => 993 # (but defaults are sane)
);
$imap->login or
die('Login failed: ' . $imap->last_error);
$imap->select('URGENT');
my $messages = $imap->search('ALL', [ 'DATE' ]);
my $summaries = $imap->get_summaries($messages);
use Data::Dumper;
foreach my $summary (@{$summaries}) {
my $now = ParseDate("now");
my($who, $subject) = ($summary->{from}->[0]->name, $summary->subject);
my $datetime = ParseDate($summary->date);
my $ago = Delta_Format(DateCalc($datetime, $now), 0, "%dt days");
$ago = Delta_Format(DateCalc($datetime, $now), 0, "%ht hours")
if (defined $ago and $ago =~ /0 days/);
$ago = Delta_Format(DateCalc($datetime, $now), 0, "%mt minutes")
if (defined $ago and $ago =~ /0 hours/);
$ago = Delta_Format(DateCalc($datetime, $now), 0, "%st seconds")
if (defined $ago and $ago =~ /0 minutes/);
$ago = "" if not defined $ago;
$subject =~ s/^\s*Re\s*:\s*//i;
my $record = "$who about $subject";
$output .= "\${font Inconsolata:size=13}$ago ago from $record\n";
my $alreadyDone = 0;
foreach my $key (keys %$info) {
$alreadyDone = (($info->{$key} eq $record) and
(Delta_Format(DateCalc($key, $now), 0, "%mt") < 14400));
last if $alreadyDone;
}
unless ($alreadyDone) {
$info->{$now} = $record;
my $fh = File::Temp->new();
$fh->unlink_on_destroy( 1 );
my $fname = $fh->filename;
print $fh "Urgent email: ";
print $fh $record;
$fh->close();
system("$ENV{HOME}/bin/myosd", $fname);
system('/usr/bin/notify-send', '-u', 'critical', '-t', '300000',
'Urgent Email', $record);
system("$ENV{HOME}/bin/myspeakbyfile", $fname)
unless -f "$ENV{HOME}/.silent-running";
}
}
WriteRecentUrgentEmailAnnouncements($DIR, $info);
print "\$hr\n\${font :size=17}Urgent Emails:\n$output\$hr" if ($output ne "");
###############################################################################
#
# Local variables:
# compile-command: "perl -c urgent-mail-check.plx"
# End: