X-Git-Url: http://git.jankratochvil.net/?p=PerlMail.git;a=blobdiff_plain;f=perlmail-accept;h=f241d9c7df652ee4c102bf16cc9e3b06b6efd725;hp=0e68b3dfab87c3efd1b2bc2491bed722b32c0749;hb=ec7d34da4cccb27afe64d488bb0ee67a9d64a957;hpb=b68782d3f8bca18eb93a2abf167541986decedfc diff --git a/perlmail-accept b/perlmail-accept index 0e68b3d..f241d9c 100755 --- a/perlmail-accept +++ b/perlmail-accept @@ -96,6 +96,7 @@ sub stdin exit 0; } +# FIXME: separate 'lacemail'-transfer together with lacemail-submit away sub inetd { die "Excessive arguments" if @ARGV; @@ -242,6 +243,7 @@ my($smsi,$smscount)=@_; return ""; } +# FIXME: rewrite &send_cz_eurotel properly by own code # patch for http://kiwi.ms.mff.cuni.cz/%7Etom/programming/src/sendsms.tar.gz/sendsms.pl my $agent=LWP::UserAgent->new(); $agent->agent("LaceMail $VERSION; contact=$SMScontact; "); @@ -553,6 +555,21 @@ my($funcref,@funcargs)=@_; return @AuditStored!=$did_last; } +sub write_message +{ +my($folder)=@_; + + local $_; + local *F; + open F,">>$folder" or do { warn "Append \"$folder\": $!"; return 0; }; + do { warn "Lock \"$folder\": $!"; return 0; } if $_=Mail::Audit::audit_get_lock(\*F,$folder); + seek F,0,IO::Handle::SEEK_END or warn "Seek-end \"$folder\" (ignoring): $!"; + # No 'need_from' here although it is a bit risky to rely on our network peer + print F $Message,"\n" or warn "Write to \"$folder\": $!"; + close F or warn "Close \"$folder\""; + return 1; # some attempt was made, FIXME: proper error detection +} + sub process { my($message)=@_; @@ -566,6 +583,7 @@ my($message)=@_; ); local @AuditStored=(); do { smssend $opt_smstest; return; } if $opt_smstest; + write_message("$Mail/input"); audit(); warn 'Corrupted $_, repaired' if defined($save_)!=defined($_) || (defined($_) && $save_ ne $_); } @@ -577,6 +595,7 @@ sub razor2 { # razor-check has exit code 1 if NOT spam, code 0 if IS spam local *CHILD; + local $SIG{"PIPE"}=sub { warn "razor2 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,'|' @@ -644,16 +663,34 @@ my($muttrc)=@_; return wantarray() ? @r : join("",map("$_\n",@r)); } +my %mutteval_charmap=( # WARNING: Don't use "" or "0" here, see below for "|| warn"! + '\\'=>"\\", + 'r'=>"\r", + 'n'=>"\n", + 't'=>"\t", + 'f'=>"\f", + 'e'=>"\e", + ); +# mutt/init.c/mutt_extract_token() +sub mutteval +{ + local $_=$_[0]; + return $_ if !s/^"//; + do { warn "Missing trailing quote in: $_"; return $_; } if !s/"$//; + s/\\(.)/$mutteval_charmap{$1} || warn "Undefined '\\$1' sequence in: $_";/ges; + return $_; +} + sub muttrc_get { my(@headers)=@_; - my @r=map({ (ref $_ ? $_ : qr/^\s*set\s+\Q$_\E\s*=\s*"([^"]*)"\s*$/si); } @headers); + my @r=map({ (ref $_ ? $_ : qr/^\s*set\s+\Q$_\E\s*=\s*(.*?)\s*$/si); } @headers); my %r=map(($_=>undef()),@r); for (muttrc()) { for my $ritem (@r) { /$ritem/si or next; - $r{$ritem}=$1; + $r{$ritem}=mutteval $1; } } for my $var (grep { !defined($r{$_}) } @r) { @@ -677,13 +714,15 @@ sub muttrc_aliases return %r; } +# FIXME: host may get multiple recipients and thus not showing "for <...>" +# FIXME: muttrc_get("from") is too strict sub store_muttrc_alternates { my($prefix,$profile)=@_; my $alternates=muttrc_get("alternates") or return; my $alternatesre=qr/$alternates/si; - my $From=muttrc_get(qr/^\s*my_hdr\s+From:.*\<(\S+)\>\s*$/si) or return; + my $From=muttrc_get("from") or return; my $Fromre=qr/^\Q$From\E$/si; warn "'From' \"$From\" not matches by 'alternates': $alternatesre" if $From!~/$alternates/si;