X-Git-Url: http://git.jankratochvil.net/?p=PerlMail.git;a=blobdiff_plain;f=perlmail-accept;h=c4fa61ebc8cd022e29ad9187b5aaf48b44ad63f3;hp=0213a486beab89b2d27d953840baae1b0ec3e8e1;hb=8dbc021592be6992b33afbee6b9d91d1990766bf;hpb=0ed964cc851735c16ddf50743087e3f401afb07d diff --git a/perlmail-accept b/perlmail-accept index 0213a48..c4fa61e 100755 --- a/perlmail-accept +++ b/perlmail-accept @@ -71,8 +71,7 @@ use URI::Escape 'uri_escape'; require WWW::SMS; -our($Message,$Audit,@AuditStored,$store_ignore,$store_ignorenewmail,$store_profile,$DoBell); -our(%audit_profile,@sms_squeezes,@alternates_host,@dnsbl_whitelist); # imported +our($Message,@AuditStored,$DoBell); my %alternates_host; # from @alternates_host my %dnsbl_whitelist; # from @dnsbl_whitelist @@ -81,7 +80,7 @@ my %dnsbl_whitelist; # from @dnsbl_whitelist our $procmailTO_ =qr'^((Original-)?(Resent-)?(To|Cc|Bcc)|(X-Envelope|Apparently(-Resent)?)-To):(.*[^-a-zA-Z0-9_.])?'mio; our $procmailTO =qr'^((Original-)?(Resent-)?(To|Cc|Bcc)|(X-Envelope|Apparently(-Resent)?)-To):(.*[^a-zA-Z])?'mio; our $procmailFROM_DAEMON=qr'^(Mailing-List:|Precedence:.*(junk|bulk|list)|To: Multiple recipients of |(((Resent-)?(From|Sender)|X-Envelope-From):|>?From )([^>]*[^(.%@a-z0-9])?(Post(ma?(st(e?r)?|n)|office)|(send)?Mail(er)?|daemon|m(mdf|ajordomo)|n?uucp|LIST(SERV|proc)|NETSERV|o(wner|ps)|r(e(quest|sponse)|oot)|b(ounce|bs\.smtp)|echo|mirror|s(erv(ices?|er)|mtp(error)?|ystem)|A(dmin(istrator)?|MMGR|utoanswer))(([^).!:a-z0-9][-_a-z0-9]*)?[%@> ][^<)]*(\(.*\).*)?)?$([^>]|$))'mio; -our $procmailFROM_MAILER=qr'^(((Resent-)?(From|Sender)|X-Envelope-From):|>?From )[^>]*\b(Post(ma(st(er)?|n)|office)|(send)?Mail(er)?|daemon|mmdf|n?uucp|ops|r(esponse|oot)|(bbs\.)?smtp(error)?|s(erv(ices?|er)|ystem)|A(dmin(istrator)?|MMGR))(([^).!:a-z0-9][-_a-z0-9]*)?[%@> ][^<)]*(\(.*\).*)?)?$([^>]|$)'mio; +$procmailFROM_MAILER=qr'^(((Resent-)?(From|Sender)|X-Envelope-From):|>?From )[^>]*\b(Post(ma(st(er)?|n)|office)|(send)?Mail(er)?|daemon|mmdf|n?uucp|ops|r(esponse|oot)|(bbs\.)?smtp(error)?|s(erv(ices?|er)|ystem)|A(dmin(istrator)?|MMGR))(([^).!:a-z0-9][-_a-z0-9]*)?[%@> ][^<)]*(\(.*\).*)?)?$([^>]|$)'mio; # perl-5.8.0 does not cope w/original FROM_MAILER on the third '?' character # Thus we did '([^>]*[^(.%@a-z0-9])?' -> '[^>]*\b', I hope it is somehow similiar # original FROM_MAILER =qr'^(((Resent-)?(From|Sender)|X-Envelope-From):|>?From )([^>]*[^(.%@a-z0-9])?(Post(ma(st(er)?|n)|office)|(send)?Mail(er)?|daemon|mmdf|n?uucp|ops|r(esponse|oot)|(bbs\.)?smtp(error)?|s(erv(ices?|er)|ystem)|A(dmin(istrator)?|MMGR))(([^).!:a-z0-9][-_a-z0-9]*)?[%@> ][^<)]*(\(.*\).*)?)?$([^>]|$)'mio; @@ -314,7 +313,7 @@ sub smssend { my($ignorenewmail,$smscount,%args)=@_; - my $text=audit_sms( + my $text=PerlMail::Config::audit_sms( "subject"=>unmime($Audit->subject()), "from"=>[ Mail::Address->parse(unmime($Audit->from())) ], "body"=>substr(body_simple(),0,$MaxBodySMS*(1+0.25*$smscount)), @@ -442,7 +441,7 @@ sub write_message { my($folder)=@_; - return if $opt_dry; + return 1 if $opt_dry; # simulate OK local *F; open F,">>$folder" or do { warn "Append \"$folder\": $!"; return 0; }; { @@ -466,8 +465,11 @@ my($message)=@_; local $_=$_; my $save_=$_; + $message=~s/(\n)(From )/$1>$2/sg; local $Message=$message; - local $Audit=Mail::Audit->new( + # Cannot call 'local' for our-imported variable: + my $Audit_save=$Audit; + $Audit=Mail::Audit->new( "emergency"=>"$Mail/emergency", "data"=>[map("$_\n",split("\n",$message))], "log"=>"$HOME/.perlmail.log", @@ -476,39 +478,31 @@ my($message)=@_; local @AuditStored=(); do { smssend 0,$opt_smstest; return; } if $opt_smstest; write_message("$Mail/input") or die; - audit(); + PerlMail::Config::audit(); warn 'Corrupted $_, repaired' if defined($save_)!=defined($_) || (defined($_) && $save_ ne $_); + # restore: + $Audit=$Audit_save; } # utility functions: # return: true (error-message or "1") if is spam -sub razor2 +sub spamassassin { - # razor-check has exit code 1 if NOT spam, code 0 if IS spam + # spamassassin has exit code 1 if IS spam, code 0 if NOT spam local *CHILD; - local $SIG{"PIPE"}=sub { warn "razor2 gave me SIGPIPE: broken pipe"; }; + local $SIG{"PIPE"}=sub { warn "spamassassin gave me SIGPIPE: broken pipe"; }; # prevent Razor2's: Can't call method "log" on unblessed reference at Razor2/Client/Agent.pm line 212. local $ENV{"HOME"}=$HOME; - open CHILD,'|' - .'('.'(razor-check 2>&1;echo >&3 $?)' - .'|sed "s/^/razor-check: /"' - .'|logger -t "perlmail['.$$.']" -p mail.crit' - .') 3>&1' - .'|exit `cat`' + open CHILD,'|spamassassin --exit-code --mbox >/dev/null' or return 0; print CHILD $Message; - my $return; - { - local $/=undef(); - $return= || 1; - } - close CHILD; + my $return=close CHILD; return undef() if !WIFEXITED($?); return undef() if WIFSIGNALED($?); return undef() if WIFSTOPPED($?); - return undef() if WEXITSTATUS($?); - return $return; # is-spam + return 1 if WEXITSTATUS($?); # is-spam + return 0; # not-spam } # NOTE: returns undef() if !wantarray and the first header is unrecognized @@ -581,15 +575,10 @@ my($prefix,$profile)=@_; if $From!~/$alternates/si; for my $for (reverse Received_for()) { $for=~s/:.*$//; # strip IP address here - if ($Fromobj->user() ne "prog-mutt") { - next if lc($for) eq lc($From); - } - else { - my $forobj=parseone $for; - if ($forobj && $forobj->host()) { - # it is 'for' our primary address - next if lc($forobj->host()) eq lc($Fromobj->host()); # or 'return'? shouldn't matter - } + my $forobj=parseone $for; + if ($forobj && $forobj->host()) { + # it is 'for' our primary address + next if lc($forobj->host()) eq lc($Fromobj->host()); # or 'return'? shouldn't matter } next if !$alternates_host{lc $for} && $for!~/$alternatesre/si; store "$prefix\L$for",($profile || []);