send-email: teach sanitize_address to do rfc2047 quoting

Without this patch I'm not able to properly send emails as I have a
non-ascii character in my name.

I removed the _rfc822 suffix from the function name as it now does more
than rfc822 quoting.

I dug through rfc822 to do the double quoting right.  Only if that is not
possible rfc2047 quoting is applied.

Signed-off-by: Uwe Kleine-K,Av(Bnig <ukleinek@informatik.uni-freiburg.de>
Cc: Jakub Narebski <jnareb@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Uwe Kleine-K,Av(Bnig 2007-08-06 22:34:50 +02:00 committed by Junio C Hamano
parent 87027ae449
commit 5b56aaa29e
1 changed files with 29 additions and 10 deletions

View File

@ -289,7 +289,7 @@ sub expand_aliases {
} }


@to = expand_aliases(@to); @to = expand_aliases(@to);
@to = (map { sanitize_address_rfc822($_) } @to); @to = (map { sanitize_address($_) } @to);
@initial_cc = expand_aliases(@initial_cc); @initial_cc = expand_aliases(@initial_cc);
@bcclist = expand_aliases(@bcclist); @bcclist = expand_aliases(@bcclist);


@ -459,22 +459,41 @@ sub unquote_rfc2047 {
return "$_"; return "$_";
} }


# If an address contains a . in the name portion, the name must be quoted. # use the simplest quoting being able to handle the recipient
sub sanitize_address_rfc822 sub sanitize_address
{ {
my ($recipient) = @_; my ($recipient) = @_;
my ($recipient_name) = ($recipient =~ /^(.*?)\s+</); my ($recipient_name, $recipient_addr) = ($recipient =~ /^(.*?)\s*(<.*)/);
if ($recipient_name && $recipient_name =~ /\./ && $recipient_name !~ /^".*"$/) {
my ($name, $addr) = ($recipient =~ /^(.*?)(\s+<.*)/); if (not $recipient_name) {
$recipient = "\"$name\"$addr"; return "$recipient";
} }
return $recipient;
# if recipient_name is already quoted, do nothing
if ($recipient_name =~ /^(".*"|=\?utf-8\?q\?.*\?=)$/) {
return $recipient;
}

# rfc2047 is needed if a non-ascii char is included
if ($recipient_name =~ /[^[:ascii:]]/) {
$recipient_name =~ s/([^-a-zA-Z0-9!*+\/])/sprintf("=%02X", ord($1))/eg;
$recipient_name =~ s/(.*)/=\?utf-8\?q\?$1\?=/;
}

# double quotes are needed if specials or CTLs are included
elsif ($recipient_name =~ /[][()<>@,;:\\".\000-\037\177]/) {
$recipient_name =~ s/(["\\\r])/\\$1/;
$recipient_name = "\"$recipient_name\"";
}

return "$recipient_name $recipient_addr";

} }


sub send_message sub send_message
{ {
my @recipients = unique_email_list(@to); my @recipients = unique_email_list(@to);
@cc = (map { sanitize_address_rfc822($_) } @cc); @cc = (map { sanitize_address($_) } @cc);
my $to = join (",\n\t", @recipients); my $to = join (",\n\t", @recipients);
@recipients = unique_email_list(@recipients,@cc,@bcclist); @recipients = unique_email_list(@recipients,@cc,@bcclist);
@recipients = (map { extract_valid_address($_) } @recipients); @recipients = (map { extract_valid_address($_) } @recipients);
@ -489,7 +508,7 @@ sub send_message
if ($cc ne '') { if ($cc ne '') {
$ccline = "\nCc: $cc"; $ccline = "\nCc: $cc";
} }
$from = sanitize_address_rfc822($from); $from = sanitize_address($from);
make_message_id(); make_message_id();


my $header = "From: $from my $header = "From: $from