Merge branch 'master' of /opt/git/clearscm
[clearscm.git] / maps / bin / weed
1 #!/usr/bin/perl
2 ################################################################################
3 #
4 # File:         $RCSfile: weed,v $
5 # Revision:     $Revision: 1.1 $
6 # Description:  Weed out obvious spams from the mail store
7 # Author:       Andrew@DeFaria.com
8 # Created:      Mon Feb 19 22:37:30 CST 2007
9 # Modified:     $Date: 2013/06/12 14:05:47 $
10 # Language:     perl
11 #
12 # (c) Copyright 2007, Andrew@DeFaria.com, all rights reserved.
13 #
14 ################################################################################
15 use strict;
16 use warnings;
17
18 use lib $FindBin::Bin, '/opt/clearscm/lib';
19
20 use Getopt::Long;
21
22 use MAPS;
23
24 use Display;
25 use Utils;
26
27 my $mailstore = "/var/spool/exim/input";
28
29 sub Usage {
30   display "Usage: weed: [ -v|erbose ] [ -d|ebug ]\n";
31   display "Where:";
32   display "  -v|erbose\tTurn on verbose mode (default off)";
33   display "  -d|ebug\tTurn on debug mode (default off)";
34   display "  -u|sage\tDisplay this usage message";
35   exit 1;
36 } # usage
37
38 # Just me
39 my $userid = "andrew";
40
41 my ($username, $user_email) = SetContext $userid;
42
43 sub GetEmailsInSpool () {
44   my %emails;
45
46   # Open mailstore directory. Note must have read access to this
47   # directory and the files in this directory. IOW we probably need to
48   # be running as root. Also, the MTA should not be running because we
49   # may be removing files...
50   opendir MAILSTORE, $mailstore
51     or error "Unable to open mailstore $mailstore - $!", 1;
52
53   # Weed out . and ..
54   my @msgs = grep {!/^\./} readdir MAILSTORE;
55
56   # Don't need the directory opened anymore...
57   closedir MAILSTORE;
58
59   # Select only the "-H" header files...
60   @msgs = grep {/-H$/} @msgs;
61
62   # Now search for "From:" in the header files, extract email address
63   # and put into return hash.
64   my $msg_nbr;
65
66   foreach (@msgs) {
67     $msg_nbr = $_;
68
69     my @lines = ReadFile "$mailstore/$msg_nbr";
70
71     foreach (@lines) {
72       if (/From:\s*(.*)/) {
73         my $sender = $1;
74
75         if ($sender =~ /<(\S*)@(\S*)>/) {
76           $sender = lc ("$1\@$2");
77         } elsif ($sender =~ /(\S*)@(\S*)\ /) {
78           $sender = lc ("$1\@$2");
79         } elsif ($sender =~ /(\S*)@(\S*)/) {
80           $sender = lc ("$1\@$2");
81         } # if
82
83         $emails {$msg_nbr} = $sender;
84       } # if
85     } # foreach
86   } # foreach
87
88   verbose scalar (keys (%emails)) . " emails to process";
89
90   return %emails;
91 } # GetEmailsInSpool
92
93 sub RemoveEmailInSpool ($) {
94   my ($msg_nbr) = @_;
95
96   my $datafile          = "$mailstore/${msg_nbr}-D";
97   my $header_file       = "$mailstore/${msg_nbr}-H";
98   my $j_file            = "$mailstore/${msg_nbr}-J";
99
100   if (-f $datafile) {
101     unlink $datafile
102       or error "Unable to unlink $datafile - $!";
103   } # if
104
105   if (-f $header_file) {
106     unlink $header_file
107       or error "Unable to unlink $header_file - $!";
108   } # if
109
110   if (-f $j_file) {
111     unlink $j_file
112       or error "Unable to unlink $j_file - $!";
113   } # if
114 } # RemoveEmailInSpool
115
116 sub FilterEmails (%) {
117   my %emails= @_;
118
119   my $removed = 0;
120
121   foreach (sort (keys (%emails))) {
122     my $msg_nbr;
123
124     if (/(\S+)-H$/) {
125       $msg_nbr = $1;
126     } # if
127
128     my $sender = $emails {"${msg_nbr}-H"};
129
130     if ($sender eq "maps\@defaria.com" ||
131         $sender eq "mailer-daemon\@defaria.com" ||
132         $sender =~ /^defaria.*\@defaria.com$/) {
133       verbose "Removing email $msg_nbr with sender of $sender";
134       RemoveEmailInSpool $msg_nbr;
135       $removed++;
136
137 #     Need to get $sender_long. Should call ReadMsg from maps. Have to
138 #     reorganize how this program flows...
139 #
140 #     } elsif ($sender eq $user_email and
141 #            (lc ($sender_long) !~ lc ("\"$username\" <$user_email>") and
142 #             lc ($sender_long) !~ lc ("$username <$user_email>"))) {
143 #       RemoveEmailInSpool $msg_nbr;
144 #       $removed++;
145     } elsif (OnNulllist $sender) {
146       verbose "Nulllist $msg_nbr ($sender)";
147
148       Nulllist $sender;
149       RemoveEmailInSpool $msg_nbr;
150       $removed++;
151     } # if
152   } # foreach
153
154   return $removed;
155 } # FilterEmails
156 # Main
157
158 my %opts;
159 my $result = GetOptions (\%opts,
160                          "usage"        => sub { Usage },
161                          "verbose"      => sub { set_verbose },
162                          "debug"        => sub { set_debug },
163                         );
164
165 my $removed = FilterEmails (GetEmailsInSpool ());
166
167 verbose "$removed emails removed from the mail store";
168
169 exit;