use strict;
use Mail::POP3Client;
my %midcache;
my @accounts = (
{
USER => "username",
AUTH_MODE => "PASS",
PASSWORD => "sekrit!",
HOST => "pop3.myisp.com"
},
);
%midcache = map {chomp; $_ => 1} `tail -50 $ENV{HOME}/.msgidcache`;
$|=1;
for (@accounts) {
print "\nConnecting to $$_{HOST}...";
my $pop = new Mail::POP3Client (%$_);
unless ($pop) { warn "Couldn't connect\n"; next; }
my $count = $pop->Count;
if ($count <0) { warn "Authorization failed"; next; }
print "\n";
print "New messages: $count\n";
my %down = map {$_ => 1} (1..$count);
my @mails;
for my $num (1..$count) {
print "\n";
my @head = $pop->Head($num);
for (@head) {
/^(From|Subject):\s+(.*)/i and do {
print "$1\t$2\n";
$mails[$num]->{$1} = $2;
};
/^Message-Id:\s+(\S+)/i and do {
if (exists $midcache{$1}) {
print "(Duplicate)\n";
delete $down{$num};
$mails[$num]->{mid} = $1;
$pop->Delete($num);
}
$midcache{$1}++;
}
}
}
next unless keys %down;
my @tocome = sort {$a <=> $b} keys %down;
print "Downloading: @tocome\n";
for my $num (@tocome) {
my @mail;
print "Downloading message $num (", $mails[$num]->{From}, ":",
$mails[$num]->{Subject}, ")...";
@mail = $pop->Retrieve($num);
$_ .= "\n" for @mail;
my $now = scalar localtime;
$mail[0] =~ s/Return-Path:\s+<([^>]+)>/From $1 $now/;
print "\n";
if (!@mail) {
print "Ugh, something went wrong!\n";
delete $midcache{$mails[$num]->{mid}};
next;
}
filter(@mail);
$pop->Delete($num);
}
$pop->Close;
}
open OUT, ">$ENV{HOME}/.msgidcache" or die $!;
print OUT "$_\n" for keys %midcache;
close OUT;
use Mail::Audit;
use Mail::Send;
sub filter {
my $folder ="$ENV{HOME}/mail/";
my @data = @_;
my $item = Mail::Audit->new(data => \@data, noexit => 1);
xxx xxx you_have_not_added_your_filter_here_yet
}