ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/FreeBSDAdmin/Mail/SpamUpdate.pl
Revision: 1135
Committed: 2009-01-09T22:05:37-08:00 (16 years, 5 months ago) by douglas
Content type: text/x-perl
File size: 3583 byte(s)
Log Message:
Switch to a different IMAP client API, grr!

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 1135 use IO::Socket::SSL;
12     use Mail::IMAPClient;
13 douglas 924 use IPC::Open2;
14     use Mail::SpamAssassin;
15 douglas 925 use MIME::Base64;
16 douglas 815
17 douglas 924 my $debug = 0;
18 douglas 815
19 douglas 924 for my $arg (@ARGV)
20 douglas 815 {
21 douglas 924 if ($arg eq "-debug")
22 douglas 836 {
23 douglas 924 $debug = 1;
24     }
25     else
26     {
27     print "Usage: $0 [-debug]\n";
28 douglas 836
29 douglas 924 exit 1;
30 douglas 836 }
31     }
32    
33 douglas 924 my $negative = 'Spam.False Negative';
34     my $positive = 'Spam.False Positive';
35     my $spamc = '/usr/local/bin/spamc';
36 douglas 887
37 douglas 924 print "Information:
38     If you receive spam in your Inbox mailbox, copy it to the $negative mailbox.
39 douglas 815
40 douglas 924 If you receive mail that is not spam in your Spam mailbox, copy it to the $positive mailbox.
41     ";
42 douglas 815
43 douglas 1135 my $socket = new IO::Socket::SSL(Proto => 'tcp', PeerAddr => 'mail.douglasthrift.net', PeerPort => 993) or die "$0: $@\n";
44     my $imap = new Mail::IMAPClient(Debug => $debug, Socket => $socket);
45 douglas 887
46 douglas 924 {
47     my $user = getpwuid $<;
48 douglas 815
49 douglas 925 open PASS, "$ENV{HOME}/.SpamUpdate.pass" or die "$0: $!\n";
50 douglas 815
51 douglas 924 my $pass = <PASS>;
52 douglas 815
53 douglas 924 chomp $pass;
54     close PASS;
55 douglas 815
56 douglas 925 $pass =~ tr/A-Za-z/N-ZA-Mn-za-m/;
57    
58 douglas 1135 $imap->User($user);
59     $imap->Password(decode_base64($pass));
60 douglas 924 }
61 douglas 836
62 douglas 1135 sub error
63     {
64     die "$0: " . $imap->LastError;
65     }
66    
67     $imap->login or error;
68    
69 douglas 924 for my $job (new Job($negative), new Job($positive))
70     {
71 douglas 1135 $imap->select($job->mailbox) or error;
72 douglas 815
73 douglas 924 printf '
74     %s and %s from the %s mailbox:
75     ', ucfirst $job->learning, $job->collabing, $job->mailbox;
76 douglas 836
77 douglas 1135 my @messages = $imap->search('UNDELETED');
78    
79     error if ($@);
80    
81 douglas 924 my $total = 0;
82     my $learned = 0;
83     my $collabed = 0;
84 douglas 815
85 douglas 1135 if ($#messages != -1)
86 douglas 924 {
87 douglas 1135 for my $message (@messages)
88     {
89     my @result = $imap->fetch($message, '(BODY[])') or error;
90 douglas 836
91 douglas 1135 die "$0: no message $message\n" if ($result[0] !~ /UID $message/);
92    
93     my $body = $result[1];
94    
95 douglas 924 ++$total;
96 douglas 815
97 douglas 924 my $learn = open2(\*LEARN_OUT, \*LEARN_IN, $spamc, '-L', $job->learn);
98     my $collab = open2(\*COLLAB_OUT, \*COLLAB_IN, $spamc, '-C', $job->collab);
99 douglas 815
100 douglas 1135 print LEARN_IN $body;
101     print COLLAB_IN $body;
102 douglas 924 close LEARN_IN;
103     close COLLAB_IN;
104 douglas 836
105 douglas 924 my $learn_out = <LEARN_OUT>;
106     my $collab_out = <COLLAB_OUT>;
107 douglas 836
108 douglas 924 close LEARN_OUT;
109     close COLLAB_OUT;
110     chomp($learn_out, $collab_out);
111 douglas 836
112 douglas 924 print "learn_out = $learn_out\ncollab_out = $collab_out\n" if ($debug);
113 douglas 836
114 douglas 924 ++$learned if ($learn_out eq "Message successfully un/learned");
115     ++$collabed if ($collab_out eq "Message successfully reported/revoked");
116 douglas 836
117 douglas 1135 $imap->delete_message($message) or error;
118 douglas 836
119 douglas 924 waitpid $learn, 0;
120     waitpid $collab, 0;
121 douglas 815 }
122     }
123    
124 douglas 924 sub plural
125 douglas 817 {
126 douglas 924 my $number = shift;
127 douglas 817
128 douglas 924 return $number != 1 ? 's' : '';
129     }
130 douglas 817
131 douglas 924 printf " $learned message%s %s and $collabed message%s %s ($total message%s total).
132     ", plural($learned), $job->learned, plural($collabed), $job->collabed, plural($total);
133     }
134 douglas 817
135 douglas 1135 $imap->logout or error;
136 douglas 817
137 douglas 924 {
138     package Job;
139 douglas 817
140 douglas 924 sub new
141     {
142     my $class = shift;
143     my $self = {};
144 douglas 912
145 douglas 924 $self->{mailbox} = shift;
146     $self->{negative} = $self->{mailbox} eq $negative;
147 douglas 912
148 douglas 924 bless $self, $class;
149 douglas 817 }
150    
151 douglas 924 sub learning
152 douglas 815 {
153 douglas 924 my $self = shift;
154 douglas 815
155 douglas 924 return $self->_learn . 'ing';
156     }
157 douglas 815
158 douglas 924 sub collabing
159     {
160     my $self = shift;
161 douglas 815
162 douglas 924 return $self->_collab . 'ing';
163 douglas 815 }
164    
165 douglas 924 sub learned
166     {
167     my $self = shift;
168 douglas 815
169 douglas 924 return $self->_learn . 'ed';
170     }
171 douglas 815
172 douglas 924 sub collabed
173     {
174     my $self = shift;
175 douglas 817
176 douglas 924 return $self->_collab . 'ed';
177     }
178 douglas 815
179 douglas 924 sub learn
180     {
181     my $self = shift;
182 douglas 815
183 douglas 924 return $self->{negative} ? 'spam' : 'ham';
184     }
185 douglas 815
186 douglas 924 sub collab
187     {
188     my $self = shift;
189 douglas 815
190 douglas 924 return $self->{negative} ? 'report' : 'revoke';
191     }
192 douglas 815
193 douglas 924 sub mailbox
194 douglas 833 {
195 douglas 924 my $self = shift;
196 douglas 833
197 douglas 924 return $self->{mailbox};
198     }
199 douglas 833
200 douglas 924 sub _learn
201     {
202     my $self = shift;
203 douglas 833
204 douglas 924 return ($self->{negative} ? '' : 'un') . 'learn';
205     }
206 douglas 833
207 douglas 924 sub _collab
208     {
209     my $self = shift;
210 douglas 833
211 douglas 924 return 're' . ($self->{negative} ? 'port' : 'vok');
212 douglas 833 }
213     }

Properties

Name Value
svn:executable *
svn:keywords Id