summaryrefslogtreecommitdiffstats
path: root/bin
diff options
context:
space:
mode:
authorJesse Luehrs <jesse.luehrs@stripe.com>2015-08-10 22:30:02 -0700
committerJesse Luehrs <doy@tozt.net>2015-08-10 22:39:14 -0700
commitd2a6fb521d3970a59d863f87a297634987de717b (patch)
tree094328c63c002b8f8f71b61e352f00b2d6103d93 /bin
parente9edcb010eb653f01751215ac68580eb229623c6 (diff)
downloadconf-d2a6fb521d3970a59d863f87a297634987de717b.tar.gz
conf-d2a6fb521d3970a59d863f87a297634987de717b.zip
script to fill out abook based on my Maildir
Diffstat (limited to 'bin')
-rwxr-xr-xbin/update_addressbook87
1 files changed, 87 insertions, 0 deletions
diff --git a/bin/update_addressbook b/bin/update_addressbook
new file mode 100755
index 0000000..5fc0db4
--- /dev/null
+++ b/bin/update_addressbook
@@ -0,0 +1,87 @@
+#!/usr/bin/env perl
+use strict;
+use warnings;
+use 5.014;
+
+use Email::Address;
+use List::MoreUtils 'any';
+use Path::Class;
+use Text::CSV;
+
+sub existing_addresses {
+ my ($addressbook) = @_;
+
+ open my $fh, '-|', (
+ 'abook',
+ '--convert',
+ '--infile', $addressbook,
+ '--outformat', 'csv'
+ ) or die "Couldn't run abook: $!";
+
+ my $csv = Text::CSV->new;
+ my @out;
+ while (my $row = $csv->getline($fh)) {
+ push @out, Email::Address->new($row->[0], $row->[1]);
+ }
+
+ $fh->close;
+
+ return @out;
+}
+
+my @exclude_patterns = (
+ qr/^"?=\?/, # quoted-printable encoded addresses - punt for now
+ qr/<notifications\@github\.com>/,
+ qr/\@(?:.*\.)?stripe\.io\b/,
+ qr/(?:no|do-?not)-?reply/i,
+ qr/via (.*)"? <\1\@/,
+ qr/support\@stripe\.com/,
+);
+
+sub maildir_senders {
+ my ($maildir) = @_;
+
+ my $all_mail = dir($maildir)->subdir('[Gmail].All Mail')->subdir('cur');
+ my %senders;
+ for my $file ($all_mail->children) {
+ my $fh = $file->openr;
+ while (<$fh>) {
+ last if /^$/;
+ next unless /^(?:From|Sender): /;
+ my @addresses = Email::Address->parse($_);
+ $senders{$_->format} = $_ for @addresses;
+ }
+ $fh->close;
+ }
+
+ return grep {
+ my $address = $_->format;
+ !any { $address =~ $_ } @exclude_patterns
+ } values %senders;
+}
+
+{
+ my $addressbook = "$ENV{HOME}/.abook/addressbook";
+ my $maildir = "$ENV{HOME}/Maildir";
+
+ my @addresses = (
+ existing_addresses($addressbook),
+ maildir_senders($maildir),
+ # ... (hardcoded things?)
+ );
+ my %addresses = map { $_->address => $_ } @addresses;
+ @addresses = sort values %addresses;
+
+ file($addressbook)->move_to("$addressbook.bak");
+
+ open my $fh, '|-', (
+ 'abook',
+ '--convert',
+ '--informat', 'csv',
+ '--outformat', 'abook',
+ '--outfile', $addressbook,
+ ) or die "Couldn't run abook: $!";
+ for my $address (@addresses) {
+ $fh->print(qq{"@{[$address->phrase || $address->address]}","@{[$address->address]}","","",""\n});
+ }
+}