ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/FreeBSDAdmin/Mail/SpamUpdate.pl
Revision: 924
Committed: 2007-05-30T22:32:06-07:00 (18 years, 1 month ago) by douglas
Content type: text/x-perl
File size: 3344 byte(s)
Log Message:
All perl, no c-client.

File Contents

# User Rev Content
1 douglas 924 #!/usr/bin/perl
2     # Spam Update
3     #
4     # Douglas Thrift
5     #
6     # $Id$
7 douglas 815
8 douglas 924 use strict;
9     use warnings;
10 douglas 815
11 douglas 924 use IMAP::Client;
12     use IPC::Open2;
13     use Mail::SpamAssassin;
14 douglas 815
15 douglas 924 my $debug = 0;
16 douglas 815
17 douglas 924 for my $arg (@ARGV)
18 douglas 815 {
19 douglas 924 if ($arg eq "-debug")
20 douglas 836 {
21 douglas 924 $debug = 1;
22     }
23     else
24     {
25     print "Usage: $0 [-debug]\n";
26 douglas 836
27 douglas 924 exit 1;
28 douglas 836 }
29     }
30    
31 douglas 924 my $negative = 'Spam.False Negative';
32     my $positive = 'Spam.False Positive';
33     my $spamc = '/usr/local/bin/spamc';
34 douglas 887
35 douglas 924 print "Information:
36     If you receive spam in your Inbox mailbox, copy it to the $negative mailbox.
37 douglas 815
38 douglas 924 If you receive mail that is not spam in your Spam mailbox, copy it to the $positive mailbox.
39     ";
40 douglas 815
41 douglas 924 my $imap = new IMAP::Client;
42 douglas 887
43 douglas 924 $imap->onfail('ABORT');
44     $imap->debuglevel(1) if ($debug);
45     $imap->capability_checking(1);
46     $imap->connect(PeerAddr => 'mail.douglasthrift.net', ConnectMethod => 'STARTTLS');
47 douglas 815
48 douglas 924 {
49     my $user = getpwuid $<;
50 douglas 815
51 douglas 924 open PASS, "$ENV{HOME}/.CreditCardReminder.pass" or die "$0: $!\n";
52 douglas 815
53 douglas 924 my $pass = <PASS>;
54 douglas 815
55 douglas 924 chomp $pass;
56     close PASS;
57 douglas 815
58 douglas 924 $imap->authenticate($user, $pass);
59     }
60 douglas 836
61 douglas 924 for my $job (new Job($negative), new Job($positive))
62     {
63     $imap->select($job->mailbox);
64 douglas 815
65 douglas 924 printf '
66     %s and %s from the %s mailbox:
67     ', ucfirst $job->learning, $job->collabing, $job->mailbox;
68 douglas 836
69 douglas 924 my $messages = $imap->uidsearch('UNDELETED');
70     my $total = 0;
71     my $learned = 0;
72     my $collabed = 0;
73 douglas 815
74 douglas 924 if (defined $messages)
75     {
76     my %fetch = $imap->uidfetch($messages, {});
77 douglas 836
78 douglas 924 for my $message (values %fetch)
79     {
80     ++$total;
81 douglas 815
82 douglas 924 my $learn = open2(\*LEARN_OUT, \*LEARN_IN, $spamc, '-L', $job->learn);
83     my $collab = open2(\*COLLAB_OUT, \*COLLAB_IN, $spamc, '-C', $job->collab);
84 douglas 815
85 douglas 924 print LEARN_IN $message->{BODY}->{BODY};
86     print COLLAB_IN $message->{BODY}->{BODY};
87     close LEARN_IN;
88     close COLLAB_IN;
89 douglas 836
90 douglas 924 my $learn_out = <LEARN_OUT>;
91     my $collab_out = <COLLAB_OUT>;
92 douglas 836
93 douglas 924 close LEARN_OUT;
94     close COLLAB_OUT;
95     chomp($learn_out, $collab_out);
96 douglas 836
97 douglas 924 print "learn_out = $learn_out\ncollab_out = $collab_out\n" if ($debug);
98 douglas 836
99 douglas 924 ++$learned if ($learn_out eq "Message successfully un/learned");
100     ++$collabed if ($collab_out eq "Message successfully reported/revoked");
101 douglas 836
102 douglas 924 $imap->uidstore($message->{UID}, '+FLAGS.SILENT', '\Deleted');
103 douglas 836
104 douglas 924 waitpid $learn, 0;
105     waitpid $collab, 0;
106 douglas 815 }
107     }
108    
109 douglas 924 sub plural
110 douglas 817 {
111 douglas 924 my $number = shift;
112 douglas 817
113 douglas 924 return $number != 1 ? 's' : '';
114     }
115 douglas 817
116 douglas 924 printf " $learned message%s %s and $collabed message%s %s ($total message%s total).
117     ", plural($learned), $job->learned, plural($collabed), $job->collabed, plural($total);
118     }
119 douglas 817
120 douglas 924 $imap->logout;
121 douglas 817
122 douglas 924 {
123     package Job;
124 douglas 817
125 douglas 924 sub new
126     {
127     my $class = shift;
128     my $self = {};
129 douglas 912
130 douglas 924 $self->{mailbox} = shift;
131     $self->{negative} = $self->{mailbox} eq $negative;
132 douglas 912
133 douglas 924 bless $self, $class;
134 douglas 817 }
135    
136 douglas 924 sub learning
137 douglas 815 {
138 douglas 924 my $self = shift;
139 douglas 815
140 douglas 924 return $self->_learn . 'ing';
141     }
142 douglas 815
143 douglas 924 sub collabing
144     {
145     my $self = shift;
146 douglas 815
147 douglas 924 return $self->_collab . 'ing';
148 douglas 815 }
149    
150 douglas 924 sub learned
151     {
152     my $self = shift;
153 douglas 815
154 douglas 924 return $self->_learn . 'ed';
155     }
156 douglas 815
157 douglas 924 sub collabed
158     {
159     my $self = shift;
160 douglas 817
161 douglas 924 return $self->_collab . 'ed';
162     }
163 douglas 815
164 douglas 924 sub learn
165     {
166     my $self = shift;
167 douglas 815
168 douglas 924 return $self->{negative} ? 'spam' : 'ham';
169     }
170 douglas 815
171 douglas 924 sub collab
172     {
173     my $self = shift;
174 douglas 815
175 douglas 924 return $self->{negative} ? 'report' : 'revoke';
176     }
177 douglas 815
178 douglas 924 sub mailbox
179 douglas 833 {
180 douglas 924 my $self = shift;
181 douglas 833
182 douglas 924 return $self->{mailbox};
183     }
184 douglas 833
185 douglas 924 sub _learn
186     {
187     my $self = shift;
188 douglas 833
189 douglas 924 return ($self->{negative} ? '' : 'un') . 'learn';
190     }
191 douglas 833
192 douglas 924 sub _collab
193     {
194     my $self = shift;
195 douglas 833
196 douglas 924 return 're' . ($self->{negative} ? 'port' : 'vok');
197 douglas 833 }
198     }

Properties

Name Value
svn:executable *
svn:keywords Id