178 lines
5.0 KiB
Perl
Executable File
178 lines
5.0 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
# Debug level 0: Send email
|
|
# Debug level 1: Send email to myself
|
|
# Debug level 2: Print names and email addresses
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
use Text::CSV;
|
|
use Email::MIME::CreateHTML;
|
|
use Email::Sender::Simple qw(sendmail);
|
|
use Email::Sender::Transport::SMTP;
|
|
use Email::Sender::Transport::SMTPS;
|
|
use Email::Sender::Transport::SMTP::TLS;
|
|
use Term::ReadKey;
|
|
use File::Basename;
|
|
use Try::Tiny;
|
|
use Data::Dumper;
|
|
|
|
my $map_dir = '/home/tim/Documents/Projects/2019/Gun Run/Maps/';
|
|
my $email_csv = "$map_dir/GIS Base Map/marshals_by_position.csv";
|
|
my $debug = 2;
|
|
my @emails;
|
|
|
|
if ($debug == 2) {
|
|
print "WARNING: Printing names. Not sending emails!\n";
|
|
} elsif ($debug == 1) {
|
|
print "WARNING: Sending emails to a TEST address.\n";
|
|
} elsif ($debug == 0) {
|
|
print "Sending emails to...\n";
|
|
} else {
|
|
print "ERROR: Invalid debug value\n";
|
|
}
|
|
|
|
my $password;
|
|
if (-f "$map_dir/password_store") {
|
|
open(my $fh, '<:encoding(UTF-8)', "$map_dir/password_store") or die "Could not open password store: $!";
|
|
while (my $row = <$fh>) {
|
|
chomp($password = $row);
|
|
}
|
|
close($fh)
|
|
} else {
|
|
print "Please type your email password: ";
|
|
#chomp($password = <STDIN>);
|
|
ReadMode('noecho');
|
|
chomp($password = ReadLine(0));
|
|
print "\n";
|
|
ReadMode('normal');
|
|
}
|
|
|
|
my $csv = Text::CSV->new ( { binary => 1 } ) or die "Cannot use CSV: ".Text::CSV->error_diag ();
|
|
open my $ifh, "<", $email_csv or die "Could not read $email_csv: $!";
|
|
$csv->column_names($csv->getline( $ifh ));
|
|
while ( my $row = $csv->getline( $ifh ) ) {
|
|
my $person = {
|
|
"position" => $row->[0],
|
|
"club" => $row->[1],
|
|
"first_name" => $row->[2],
|
|
"name" => $row->[4],
|
|
"email" => $row->[6],
|
|
};
|
|
$person->{"name"} =~ s/ +$//g if $person->{"name"};
|
|
$person->{"name"} =~ s/ +/ /g if $person->{"name"};
|
|
$person->{"first_name"} =~ s/ +$//g if $person->{"first_name"};
|
|
$person->{"first_name"} =~ s/ +/ /g if $person->{"first_name"};
|
|
$person->{"email"} =~ s/,//g if $person->{"email"};
|
|
push @emails, $person;
|
|
}
|
|
$csv->eof or $csv->error_diag();
|
|
close $ifh;
|
|
|
|
#@emails = sort { $a->{"position"} cmp $b->{"position"} } @emails;
|
|
if ($ARGV[0]) {
|
|
my $pos = $ARGV[0];
|
|
@emails = grep { $_->{"position"} =~ /^$pos$/ } @emails;
|
|
}
|
|
#print Dumper(@emails);
|
|
|
|
foreach my $person (@emails) {
|
|
next unless $$person{"name"} and $$person{"email"};
|
|
next unless $$person{"club"} =~ /^(AAC)$/;
|
|
next if $$person{"position"} =~ /\D/;
|
|
my $salutation = $$person{"first_name"};
|
|
my $name = $$person{"name"};
|
|
my $email = $$person{"email"};
|
|
my $club = $$person{"club"};
|
|
next unless $email =~ /@/;
|
|
my $position = $$person{"position"};
|
|
|
|
foreach my $m (split(/[, ]+/, $email)) {
|
|
$m = "$name <$m>";
|
|
printf "%-4s %-15s %15s\n", $$person{"position"}, $salutation, $m if ($debug >= 0);
|
|
$m = 'Timothy Allen <tim@allen.org.za>' if ($debug == 1);
|
|
|
|
my $html = qq(
|
|
<html><head>
|
|
</head>
|
|
<body>
|
|
<p>
|
|
Dear $salutation
|
|
</p>
|
|
|
|
<p>
|
|
A big thank you from me and from the Gun Run committee for your help marshalling today.
|
|
</p>
|
|
|
|
<p>
|
|
It was a very successful Gun Run, and we can all be pleased by how well the event ran. I heard a lot of compliments about the marshalling, and the race went beautifully, I thought, with very few major hiccups.
|
|
</p>
|
|
|
|
<p>
|
|
If you have any suggestions as to how we can improve next year, please drop me or Roger an email.
|
|
</p>
|
|
|
|
<p>
|
|
I hope you enjoyed the experience and will hopefully support us again next year. Until then, enjoy your running and take care out there.
|
|
</p>
|
|
|
|
<p>
|
|
Warm regards,
|
|
</p>
|
|
|
|
<p>
|
|
Tim
|
|
</p>
|
|
</body>
|
|
</html>
|
|
);
|
|
|
|
my $plain_text = qq(Dear $salutation
|
|
|
|
A big thank you from me and from the Gun Run committee for your help marshalling today.
|
|
|
|
It was a very successful Gun Run, and we can all be pleased by how well the event ran. I heard a lot of compliments about the marshalling, and the race went beautifully, I thought, with very few major hiccups.
|
|
|
|
If you have any suggestions as to how we can improve next year, please drop me or Roger an email.
|
|
|
|
I hope you enjoyed the experience and will hopefully support us again next year. Until then, enjoy your running and take care out there.
|
|
|
|
Warm regards,
|
|
|
|
Tim
|
|
);
|
|
|
|
my $mail = Email::MIME->create_html(
|
|
header => [
|
|
"From" => 'Timothy Allen <tim@allen.org.za>',
|
|
"Subject" => 'Thank you for marshalling',
|
|
"To" => $m,
|
|
"Reply-To" => 'Timothy Allen <tim@allen.org.za>, Roger Steward <stewardrh@gmail.com>',
|
|
],
|
|
body => $html,
|
|
text_body => $plain_text,
|
|
);
|
|
my $g_transport = Email::Sender::Transport::SMTP::TLS->new(
|
|
host => 'smtp.gmail.com',
|
|
username => 'trallen@gmail.com',
|
|
password => $password,
|
|
);
|
|
my $t_transport = Email::Sender::Transport::SMTP::TLS->new(
|
|
host => 'mail.treehouse.org.za',
|
|
username => 'tim',
|
|
password => $password,
|
|
);
|
|
try {
|
|
# sendmail($mail, { transport => $g_transport }) if ($debug <= 1);
|
|
sendmail($mail, { transport => $t_transport }) if ($debug <= 1);
|
|
} catch {
|
|
warn "\n\nError sending email for position $position\n\n";
|
|
warn $_;
|
|
};
|
|
}
|
|
sleep 2 if ($debug < 1);
|
|
last if ($debug == 1);
|
|
}
|
|
|
|
# vim: set expandtab shiftwidth=4 softtabstop=4 :
|