unique recipient list
[PerlMail.git] / perlmail-accept
index 09bdc03..e0b6dca 100755 (executable)
@@ -533,10 +533,7 @@ my($folder,$profile,%args)=@_;
        $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"};
 }
@@ -555,6 +552,28 @@ my($funcref,@funcargs)=@_;
        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)=@_;
@@ -568,6 +587,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 $_);
 }