Commit 48500e5b authored by karl%kornel.name's avatar karl%kornel.name

Bug 304885: UTF-8 encoding mangles multipart messages, breaks whine emails -…

Bug 304885: UTF-8 encoding mangles multipart messages, breaks whine emails - Patch by A. Karl Kornel <karl@kornel.name> r=glob a=justdave
parent 858d9cc9
......@@ -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.
......
......@@ -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());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment