=head1 SYNOPSIS
-
Usage maps: [-u|ser <username>] [-ve|rbose] [-deb|ug] [-e|xecute]
Where:
-u|ser <username>: Set context to this username
-
+
-v|erbose: Be verbose
-de|bug: Output debug messages
-
+
-[no]e|xecute: Set execute mode.
-# (c) Copyright 2000-2006, Andrew@DeFaria.com, all rights reserved.
+# (c) Copyright 2000-2021, Andrew@DeFaria.com, all rights reserved.
=cut
use warnings;
use Getopt::Long;
+use Email::Valid;
use FindBin;
use File::Temp qw (tempfile);
use Net::Domain qw (hostdomain);
-use lib $FindBin::Bin, '/opt/clearscm/lib';
+use lib "$FindBin::Bin/../lib", "$FindBin::Bin/../../lib";
use MAPS;
use MAPSLog;
use Display;
use Utils;
-my $verbose = 0;
-my $execute = 1;
-my $userid = $ENV{USER};
+my $verbose = 0;
+my $execute = 1;
+my $userid = $ENV{USER};
-my $logpath = "$FindBin::Bin/../log";
-my $logfile = "$logpath/debug.log";
+my $logpath = "$FindBin::Bin/../log";
+my $logfile = "$logpath/debug.log";
my $forwardto = $ENV{MAPS_FORWARDTO} || 'adefaria@gmail.com';
# For some reason I'm not parsing messages correctly but it only seems to
# happen when the message is piped in from the MTA. This routine will
# temporarily save the messages in a file.
-sub SaveStdin () {
+sub SaveStdin() {
# Generate tempfile
my $msgfile = tempfile ();
return $msgfile;
} # SaveStdin
-sub save_msg {
- my ($sender, $sender_long, $reply_to, $subject, $data) = @_;
-
- open SAVED_MSG, '>>', "$logpath/$sender"
- or die "Unable to open $logpath/$sender - $!\n";
-
- print SAVED_MSG "Sender = $sender\n";
- print SAVED_MSG "Sender long = $sender\n";
- print SAVED_MSG "reply_to = $reply_to\n";
- print SAVED_MSG "subject = $subject\n";
- print SAVED_MSG "data:\n\n";
- print SAVED_MSG $data;
- print SAVED_MSG "*** END OF DATA***\n";
-} # save_msg
-
-sub ValidDomainUser ($) {
+sub ValidDomainUser($) {
my ($sender) = @_;
my ($username, $domainname);
sub ProcessMsgs ($$$) {
my ($msgfile, $username, $user_email) = @_;
- return
- unless $execute;
+ return unless $execute;
while (!eof *$msgfile) {
my ($sender, $sender_long, $reply_to, $subject, $data) = ReadMsg (*$msgfile);
#close $mail
#or die "Unable to forward email to $forwardto - $!";
#} # if
-
+
my ($onlist, $rule, $sequence, $hit_count);
-
+
# Algorithm change: We now first check to see if the sender is not found
# in the message and skip it if so. Then we handle if we are the sender
# and that the from address is formatted properly. Spammers often use
#
# Finally, we handle return processing
- # Special sender handling:
- if ($sender !~ /.+\@.+/) {
- verbose "Sender not found in message or invalid";
- next;
- } # if
-
+ # Discard any email with an invalid email address
+ next unless Email::Valid->address($sender);
+
if ($sender eq $user_email and
(lc ($sender_long) !~ lc ("\"$username\" <$user_email>") and
lc ($sender_long) !~ lc ("$username <$user_email>"))) {
Nulllist $sender;
next;
} # if
-
+
# Check whitelist:
($onlist, $rule, $sequence, $hit_count) = OnWhitelist $sender;
verbose "Sender from this domain but user not found";
Nulllist $sender;
} # if
-
+
next;
} # if
-
+
# Check blacklist:
($onlist, $rule, $sequence, $hit_count) = OnBlacklist $sender;
} # ProcessMsgs
# Main
-GetOptions (
+GetOptions(
'user=s' => \$userid,
'verbose' => sub { set_verbose },
'debug' => sub { set_debug },