diff options
author | Jesse Luehrs <jesse.luehrs@stripe.com> | 2015-08-10 22:30:02 -0700 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2015-08-10 22:39:14 -0700 |
commit | d2a6fb521d3970a59d863f87a297634987de717b (patch) | |
tree | 094328c63c002b8f8f71b61e352f00b2d6103d93 /bin | |
parent | e9edcb010eb653f01751215ac68580eb229623c6 (diff) | |
download | conf-d2a6fb521d3970a59d863f87a297634987de717b.tar.gz conf-d2a6fb521d3970a59d863f87a297634987de717b.zip |
script to fill out abook based on my Maildir
Diffstat (limited to 'bin')
-rwxr-xr-x | bin/update_addressbook | 87 |
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}); + } +} |