ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/FreeBSDAdmin/Mail/SpamUpdate.pl
Revision: 925
Committed: 2007-05-31T03:34:26-07:00 (18 years, 1 month ago) by douglas
Content type: text/x-perl
File size: 3405 byte(s)
Log Message:
Rot13 and Base64.

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

Properties

Name Value
svn:executable *
svn:keywords Id