$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 $_);
}