1 |
#!/usr/bin/perl |
2 |
# False Positive |
3 |
# |
4 |
# Douglas Thrift |
5 |
# |
6 |
# $Id$ |
7 |
|
8 |
use strict; |
9 |
use warnings; |
10 |
|
11 |
use IMAP::Client; |
12 |
use Mail::SpamAssassin; |
13 |
use MIME::Base64; |
14 |
|
15 |
my $debug = 0; |
16 |
|
17 |
for my $arg (@ARGV) |
18 |
{ |
19 |
if ($arg eq "-debug") |
20 |
{ |
21 |
$debug = 1; |
22 |
} |
23 |
else |
24 |
{ |
25 |
print "Usage: $0 [-debug]\n"; |
26 |
|
27 |
exit 1; |
28 |
} |
29 |
} |
30 |
|
31 |
my $imap = new IMAP::Client; |
32 |
|
33 |
$imap->onfail('ABORT'); |
34 |
$imap->debuglevel(1) if ($debug); |
35 |
$imap->capability_checking(1); |
36 |
$imap->connect(PeerAddr => 'mail.douglasthrift.net', ConnectMethod => 'STARTTLS'); |
37 |
|
38 |
{ |
39 |
my $user = getpwuid $<; |
40 |
|
41 |
open PASS, "$ENV{HOME}/.SpamUpdate.pass" or die "$0: $!\n"; |
42 |
|
43 |
my $pass = <PASS>; |
44 |
|
45 |
chomp $pass; |
46 |
close PASS; |
47 |
|
48 |
$pass =~ tr/A-Za-z/N-ZA-Mn-za-m/; |
49 |
|
50 |
$imap->authenticate($user, decode_base64($pass)); |
51 |
} |
52 |
|
53 |
$imap->select('Spam.False Positive'); |
54 |
|
55 |
my $messages = $imap->uidsearch('UNFLAGGED'); |
56 |
|
57 |
if (defined $messages) |
58 |
{ |
59 |
my $assassin = Mail::SpamAssassin->new($debug ? {debug => 'all'} : {}); |
60 |
my %fetch = $imap->uidfetch($messages, {}, 'INTERNALDATE'); |
61 |
|
62 |
for my $message (values %fetch) |
63 |
{ |
64 |
$imap->append('INBOX', $assassin->remove_spamassassin_markup($assassin->parse($message->{BODY}->{BODY})), '"' . $message->{INTERNALDATE} . '"'); |
65 |
$imap->uidstore($message->{UID}, '+FLAGS.SILENT', '\Flagged'); |
66 |
} |
67 |
} |
68 |
|
69 |
$imap->logout; |