#!/usr/bin/perl
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;
sub
filter {
my
$folder
=
"$ENV{HOME}/mail/"
;
my
@data
=
@_
;
my
$item
= Mail::Audit->new(
data
=> \
@data
,
noexit
=> 1);
die
"you have not added your filter here yet"
}