exit 0;
}
+# FIXME: separate 'lacemail'-transfer together with lacemail-submit away
sub inetd
{
die "Excessive arguments" if @ARGV;
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; ");
$DoBell++ if $do{"bell"};
$folder=~s/;.*$//s;
$folder="$Mail/".$' if $folder=~/^=/;
- if (!$store_ignore) {
- $Audit->noexit(1);
- $Audit->accept($folder);
- }
+ write_message($folder) if !$store_ignore;
smssend_tryall $store_ignorenewmail,$do{"sms"},%args if $do{"sms"};
push @AuditStored,$folder if $do{"did"};
}
return @AuditStored!=$did_last;
}
+# Never use Mail::Audit->store() as it will reformat MIME bodies and possibly corrupt OpenPGP!
+sub write_message
+{
+my($folder)=@_;
+
+ local *F;
+ open F,">>$folder" or do { warn "Append \"$folder\": $!"; return 0; };
+ {
+ local $_;
+ ($_=Mail::Audit::audit_get_lock(\*F,$folder)) and do { warn "Lock \"$folder\": $!"; last; };
+ seek F,0,IO::Handle::SEEK_END or do { warn "Seek-end \"$folder\": $!"; last; };
+ # FIXME: Check for '^From ' to not to rely on our network peer
+ print F $Message or do { warn "Write to \"$folder\": $!"; last; };
+ do { print F "\n"; warn "Missing trailing newline, fixed"; } if $Message!~/\n$/s;
+ close F or do { warn "Close \"$folder\""; last; };
+ return 1; # OK
+ }
+ warn "MAIL DROPPED for folder: $folder";
+ close F;
+ return 0; # failed
+}
+
sub process
{
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 $_);
}
{
# 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,'|'
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) {
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;