]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 304885: UTF-8 encoding mangles multipart messages, breaks whine emails - Patch...
authorkarl%kornel.name <>
Sat, 24 Dec 2005 01:21:00 +0000 (01:21 +0000)
committerkarl%kornel.name <>
Sat, 24 Dec 2005 01:21:00 +0000 (01:21 +0000)
Bugzilla/BugMail.pm
whine.pl

index 31d151112fc18056307177d470ed5e84be163663..982bf6c04970d11e9b1ee8f7d738f4d04a40e473 100644 (file)
@@ -633,7 +633,7 @@ sub MessageToMTA {
     my $headers;
 
     if (Param('utf8') and (!is_7bit_clean($header) or !is_7bit_clean($body))) {
-        ($headers, $body) = encode_message($header, $body);
+        ($headers, $body) = encode_message($msg);
     } else {
         my @header_lines = split(/\n/, $header);
         $headers = new Mail::Header \@header_lines, Modify => 0;
@@ -697,21 +697,26 @@ sub encode_qp_words {
 }
 
 sub encode_message {
-    my ($header, $body) = @_;
-
-    # read header into MIME::Entity
+    my ($msg) = @_;
 
     my $parser = MIME::Parser->new;
     $parser->output_to_core(1);
     $parser->tmp_to_core(1);
-    my $entity = $parser->parse_data($header);
-    my $head = $entity->head;
+    my $entity = $parser->parse_data($msg);
+    $entity = encode_message_entity($entity);
+
+    my @header_lines = split(/\n/, $entity->header_as_string);
+    my $head = new Mail::Header \@header_lines, Modify => 0;
+
+    my $body = $entity->body_as_string;
+
+    return ($head, $body);
+}
 
-    # set charset to UTF-8
+sub encode_message_entity {
+    my ($entity) = @_;
 
-    $head->mime_attr('Content-Type' => 'text/plain')
-        unless defined $head->mime_attr('content-type');
-    $head->mime_attr('Content-Type.charset' => 'UTF-8');
+    my $head = $entity->head;
 
     # encode the subject
 
@@ -745,23 +750,38 @@ sub encode_message {
 
     # process the body
 
-    if (!is_7bit_clean($body)) {
-        # count number of 7-bit chars, and use quoted-printable if more
-        # than half the message is 7-bit clean
-        my $count = ($body =~ tr/\x20-\x7E\x0A\x0D//);
-        if ($count > length($body) / 2) {
-            $head->mime_attr('Content-Transfer-Encoding' => 'quoted-printable');
-            $body = encode_qp($body);
-        } else {
-            $head->mime_attr('Content-Transfer-Encoding' => 'base64');
-            $body = encode_base64($body);
+    if (scalar($entity->parts)) {
+        my $newparts = [];
+        foreach my $part ($entity->parts) {
+            my $newpart = encode_message_entity($part);
+            push @$newparts, $newpart;
+        }
+        $entity->parts($newparts);
+    }
+    else {
+        # Extract the body from the entity, for examination
+        # At this point, we can rely on MIME::Tools to do our encoding for us!
+        my $bodyhandle = $entity->bodyhandle;
+        my $body = $bodyhandle->as_string;
+        if (!is_7bit_clean($body)) {
+            # count number of 7-bit chars, and use quoted-printable if more
+            # than half the message is 7-bit clean
+            my $count = ($body =~ tr/\x20-\x7E\x0A\x0D//);
+            if ($count > length($body) / 2) {
+                $head->mime_attr('Content-Transfer-Encoding' => 'quoted-printable');
+            } else {
+                $head->mime_attr('Content-Transfer-Encoding' => 'base64');
+            }
         }
+
+        # Set the content/type and charset of the part, if not set
+        $head->mime_attr('Content-Type' => 'text/plain')
+            unless defined $head->mime_attr('content-type');
+        $head->mime_attr('Content-Type.charset' => 'UTF-8');
     }
 
-    # done
-    
     $head->fold(75);
-    return ($head, $body);
+    return $entity;
 }
 
 # Send the login name and password of the newly created account to the user.
index 0c8815368ebcb0335944fcbbf3cfc1811dc48d4f..b001957dda91937d2329b0e8210fdeeea01957a7 100755 (executable)
--- a/whine.pl
+++ b/whine.pl
@@ -404,7 +404,7 @@ sub mail {
 
     # now produce a ready-to-mail mime-encoded message
 
-    $args->{'boundary'} = "-----=====-----" . $$ . "--" . time() . "-----";
+    $args->{'boundary'} = "----------" . $$ . "--" . time() . "-----";
 
     $template->process("whine/multipart-mime.txt.tmpl", $args, \$msg)
         or die($template->error());