git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] send-email: teach sanitize_address to do rfc2047 quoting

From
Uwe Kleine-König <ukleinek@informatik.uni-freiburg.de>
Date
Aug 6, 2007, 20:34 UTC
Message-ID
<11864324902764-git-send-email-ukleinek@informatik.uni-freiburg.de>
In-Reply-To
<20070806083341.GA6625@informatik.uni-freiburg.de>

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önig <ukleinek@informatik.uni-freiburg.de>
Cc: Jakub Narebski <jnareb@gmail.com>
---
As Jakub critizied now the "easiest" quoting is done.
 git-send-email.perl |   39 +++++++++++++++++++++++++++++----------
 1 files changed, 29 insertions(+), 10 deletions(-)
diff --git a/git-send-email.perl b/git-send-email.perl
index f43f92f..39e433b 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -289,7 +289,7 @@ sub expand_aliases {
 }
 
 @to = expand_aliases(@to);
-@to = (map { sanitize_address_rfc822($_) } @to);
+@to = (map { sanitize_address($_) } @to);
 @initial_cc = expand_aliases(@initial_cc);
 @bcclist = expand_aliases(@bcclist);
 
@@ -459,22 +459,41 @@ sub unquote_rfc2047 {
 	return "$_";
 }
 
-# If an address contains a . in the name portion, the name must be quoted.
-sub sanitize_address_rfc822
+# use the simplest quoting being able to handle the recipient
+sub sanitize_address
 {
 	my ($recipient) = @_;
-	my ($recipient_name) = ($recipient =~ /^(.*?)\s+</);
-	if ($recipient_name && $recipient_name =~ /\./ && $recipient_name !~ /^".*"$/) {
-		my ($name, $addr) = ($recipient =~ /^(.*?)(\s+<.*)/);
-		$recipient = "\"$name\"$addr";
+	my ($recipient_name, $recipient_addr) = ($recipient =~ /^(.*?)\s*(<.*)/);
+
+	if (not $recipient_name) {
+		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\?=/;
 	}
-	return $recipient;
+
+	# 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
 {
 	my @recipients = unique_email_list(@to);
-	@cc = (map { sanitize_address_rfc822($_) } @cc);
+	@cc = (map { sanitize_address($_) } @cc);
 	my $to = join (",\n\t", @recipients);
 	@recipients = unique_email_list(@recipients,@cc,@bcclist);
 	@recipients = (map { extract_valid_address($_) } @recipients);
@@ -489,7 +508,7 @@ sub send_message
 	if ($cc ne '') {
 		$ccline = "\nCc: $cc";
 	}
-	$from = sanitize_address_rfc822($from);
+	$from = sanitize_address($from);
 	make_message_id();
 
 	my $header = "From: $from
-- 
1.5.3.rc3.13.g7ab3
Previous: Uwe Kleine-KönigNext: Uwe Kleine-König
Message 4 of 5 in “send-email: let sanitize_address_rfc822 do rfc2047 quoting”
  1. send-email: let sanitize_address_rfc822 do rfc2047 quotingUwe Kleine-König, Aug 5, 2007
  2. Jakub NarebskiAug 6, 2007
  3. Uwe Kleine-KönigAug 6, 2007
  4. send-email: teach sanitize_address to do rfc2047 quotingUwe Kleine-König, Aug 6, 2007
  5. Uwe Kleine-KönigAug 9, 2007

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.