First, a few code comments:
0) (Update:) Doh--i missed one of the first and foremost things-- add use strict; and use warnings; !!!
1) For this, check perldoc -f localtime:
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(t
+ime);
$date = "$mday/$mon/$year $hour:$min:$sec"; # THIS IS WRONG!!!!
# do something like this instead:
my @time = localtime;
my $date = sprintf("%2d/%2d/%4d %02d:%02d:%02d", $time[4] + 1, $time[3
+], $time[5] + 1900, @time[2,1,0]);
2) This (look at perldoc -f exists):
while(my ($key, $value) = each(%forward)) {
if ($to =~ $key) {
$local_address = $key;
$forward_address = $value;
}
}
should be replaced with:
if( exists $forward{$to} ){
$local_address = $key;
$forward_address = $value;
}
3) Use (see DBI docs) heredocs and placeholders. (Also, i believe this 'LEFT JOIN' should be just 'JOIN')
$sql = <<EOF;
SELECT "tblForwardMail"."ForwardMailID", "tblFilterMail"."FilterMailEm
+ail"
FROM "tblForwardMail"
LEFT JOIN "tblFilterMail" ON "tblForwardMail"."ForwardMail
+ID"="tblFilterMail"."ForwardMailID"
WHERE "tblForwardMail"."ForwardMailTo"=?
EOF
# $sth = $dbh->prepare($sql);
# $sth->execute( $local_address );
# while (@row = $sth->fetchrow) {
# push(@filter, $row[1]);
# }
#
# But it seems like what you want next is just:
(undef,$filter_address) = $dbh->selectrow_array($dbh,{},$local_address
+);
# make sure to pre-declare $filter_address
4) This:
foreach my $email_address(@filter) {
if (($from =~ $email_address)){
$store = "YES";
}
}
could be:
$store = "YES" if grep( $_ eq $from, @filter );
but if you use my comment #3, then it's just:
$store = "YES" if $from eq $filter_address;
BUT, you should treat $store as a boolean and give it true (1) and false (0, undef) values, so you don't have to string match 'YES' later..
$store = 1; # true
$store = 0; # false
if( $store ){
...
}
if( ! $store ){
...
}
5) This:
#Declare variables to be used including command line variables if need
+ed
my ($stored_email, $log, $to, $from, $forward_address, $store, $body,
+$sql, $sth, $date, $local_address);
is "c-ish" .. here it's usally better to declare stuff just when it's being used (especially if it only exists in a limited block/scope)
gotta cut back to work for a moment ;) but then i'll go back and see if can find the bug..
|