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
parent
87027ae449
commit
5b56aaa29e
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue