How can I completely replace the headers in a milter? The replaced header data 
contains both added and changed headers.
Here is the code im working with:

sub eom_callback {
        $ctx = shift;
        $senderunsafe = $ctx->getsymval('{mail_addr}');
        ($suser, $sdomain) = split("\@", $senderunsafe);
        $suser =~ s/[^A-Z0-9._%+-]*//sgi;
        $sdomain =~ s/[^A-Z0-9.-]*//sgi;
        if ((length($suser) > 0)&&($sdomain eq "sebbe.eu")) { #Ensure we only 
touch mail that are outgoing (relayed) by authorized users.
                $mimedata = $ctx->getpriv;
                # Some MUAs does put line breaks and other nonpermitted 
whitespace in their boundary strings while they appear in the message body.
                # That is incompatible with RFC 2046. But still, we need to fix 
that because MIME::Parser cannot parse messages containing boundaries with 
whitespace.
                for ($mimedata =~ /Content-Type: .*?boundary=\"(.*?)\"/sg) {
                        $cbound = $_;
                        $fixed = $cbound;
                        $fixed =~ s/\t//sgi;
                        $fixed =~ s/\n//sgi;
                        $fixed =~ s/\r//sgi;
                        # $fixed now contains a fixed boundary. Fix the email 
message by removing nonpermitted whitespace from the message boundaries.
                        $mimedata =~ s/\-\-$cbound/\-\-$fixed/sgi;
                }

                $parser = new MIME::Parser;
                $parser->output_under("/tmp");
                $parser->ignore_errors(1); # If MIME parser has trouble parsing 
a badly formatted message, try hard.
                $message = eval{ $parser->parse($mimedata) }; # If parser 
crashes due to bad MIME data, the whole milter wont die.
                eval{ $message->sync_headers(Length=>'COMPUTE') }; #Some MUA's 
cant count bytes correctly. Fix that.
                $fixedmsgheader = eval{ $message->header_as_string };
                $fixedmsgbody = eval{ $message->body_as_string };
                if ((length($fixedmsgheader) > 0)&&(length($fixedmsgbody) > 0)) 
{
                }
                else
                {
                #Parsing failed completely. This MIME message was really broken.
                #Lets build a completely new message from scratch and then put 
the erronous MIME data as a text/plain body.
                #Note that $senderunsafe is safe in this context because we 
dont call system functions with $senderunsafe as parameter.
                #Note that we will only use the last recipient specified during 
the SMTP transaction. Thats for durability,
                #If the MIME data is unparseable, theres a high propability the 
client can't talk proper SMTP either.
                    $scratch = MIME::Entity->build(Type        => "text/plain",
                               Encoding    => "quoted-printable",
                               Data        => $mimedata,
                               From        => $senderunsafe,
                               To          => $ctx->getsymval('{rcpt_addr}'),
                               Subject     => "Unparseable MIME message from 
".$senderunsafe);
                   $fixedmsgheader = $scratch->header_as_string;
                   $fuxedmsgbody = $scratch->body_as_string;
                }

                #Here, I want to replace the complete header with 
$fixedmsgheader. Note that $fixedmsgheader can contain BOTH added and changed 
headers.

                #Change the body with fixed content:
                $ctx->replacebody($fixedmsgbody);
        }
return(SMFIS_CONTINUE);
}

Attachment: smime.p7s
Description: S/MIME cryptographic signature

Reply via email to