X-Git-Url: http://git.jankratochvil.net/?p=PerlMail.git;a=blobdiff_plain;f=perlmail-accept;h=43b4d623e5a2a2fc0f054306d97e3e14bf63b222;hp=cf545e940a31c6ef590e864002913b455e4f3736;hb=c1f6503aacb14d9d409eff6de2493a98337b9286;hpb=9f5eb0e159a8e41d303be37d0812a7caa1868887 diff --git a/perlmail-accept b/perlmail-accept index cf545e9..43b4d62 100755 --- a/perlmail-accept +++ b/perlmail-accept @@ -75,6 +75,7 @@ our $procmailFROM_MAILER=qr'^(((Resent-)?(From|Sender)|X-Envelope-From):|>?From my $opt_mode; my $opt_smstest; # 1 or $smscount my $opt_idle; +my $opt_dry; sub process; @@ -525,15 +526,16 @@ my($folder,$profile,%args)=@_; $profile=$store_profile if !$profile; my %do=map({ (!/=/ ? ($_=>1) : ($`=>$')); } profile_eval($profile)); - Sys::Syslog::syslog("info","%s%s: %s: %s", + Sys::Syslog::syslog("info","%s%s%s: %s: %s", + (!$opt_dry ? "" : "--dry: "), (!$store_ignore ? "" : "IGNORED[$store_ignore]: "), map({ cut($_); } $folder,address_show(unmime($Audit->from())),unmime($Audit->subject())), ) - if $do{"syslog"}; + if $do{"syslog"} || $opt_dry; $folder=~s/;.*$//s; $folder="$Mail/".$' if $folder=~/^=/; push @AuditStored,$folder if $do{"did"}; - return if $store_ignore; + return if $store_ignore || $opt_dry; $DoBell++ if $do{"bell"}; write_message($folder); smssend_tryall $store_ignorenewmail,$do{"sms"},%args if $do{"sms"}; @@ -558,6 +560,7 @@ sub write_message { my($folder)=@_; + return if $opt_dry; local *F; open F,">>$folder" or do { warn "Append \"$folder\": $!"; return 0; }; { @@ -635,12 +638,17 @@ sub Received_for my($for)=($hdr=~/\bfor\s+\?\b/); return $for if !wantarray(); push @r,$for if $for; - my($from,$fromaddr)=($hdr=~/\bfrom\s+(\S+)\b.*?\[((?:\d{1,3}\.){3}\d{1,3})\]/); + my($from,$fromaddr)=($hdr=~/\bfrom\s+(?:(\S+)\b.*?)??\[((?:\d{1,3}\.){3}\d{1,3})\]/); + $from=$fromaddr if !defined $from; push @r,"$from:$fromaddr" if $from; } return @r; } +my %dnsbl_whitelist=map(($_=>1),( + "195.250.128.83" # smtp3.vol.cz; 83.128.250.195.blackholes.five-ten-sg.com + )); + # Extended Mail::Audit::MAPS # $domain,$full,[$timeout] sub dnsbl @@ -650,7 +658,8 @@ my($domain,$full,$timeout)=@_; $timeout||=30; # sec $Mail::Audit::MAPS::host=$domain; my @hosts=map({ s/^.*://; "[$_]"; } # strip DNS part - grep({ /^([^:@]*):/ && !$alternates_host{$1}; } (Received_for())) # leave only foreign hosts + grep({ /^([^:@]*):/ && !$alternates_host{$1} # leave only foreign hosts + && !$dnsbl_whitelist{$1}; } (Received_for())) ); splice @hosts,1 if !$full && @hosts; # "&& @hosts" to prevent: WARN: splice() offset past end of array { @@ -865,6 +874,7 @@ $Getopt::Long::ignorecase=0; die "GetOptions error" if !Getopt::Long::GetOptions( "inetd" ,sub { $opt_mode=\&inetd; }, "stdin" ,sub { $opt_mode=\&stdin; }, + "dry" ,\$opt_dry, "smstest:s",sub { $opt_mode=\&stdin; $opt_smstest=($_[1] || 1); }, "idle!" ,\$opt_idle, "idletest" ,sub { syslogging_restore(); print((defined($_=useridle()) ? $_ : "")."\n"); exit 0; },