From: Robin H. Johnson <hidden> Date: 2016-06-15 22:43:07
The following series of patches perform a number of fixes, cleanups and
improvements to git-send-email.
These were spurred by the dual factors of git-send-email losing some of my
email due to the envelope sender, as well as the malformatting of the headers
(due to the period after my middle initial) that caused strange breakages with
some sendmail binaries.
01/09 Document --dry-run parameter to send-email.
02/09 Prefix Dry- to the message status to denote dry-runs.
03/09 Debugging cleanup improvements
04/09 Change the scope of the $cc variable as it is not needed outside of send_message.
05/09 Perform correct quoting of recipient names.
06/09 Validate @recipients before using it for sendmail and Net::SMTP.
07/09 Ensure clean addresses are always used with Net::SMTP
08/09 Allow users to optionally specify their envelope sender.
09/09 Document --dry-run and envelope-sender for git-send-email.
From: Robin H. Johnson <hidden> Date: 2016-06-15 22:43:07
From: Robin H. Johnson <redacted>
Looks like --dry-run was added to the code, but never to the --help output.
Signed-off-by: Robin H. Johnson <redacted>
---
git-send-email.perl | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)
From: Robin H. Johnson <hidden> Date: 2016-06-15 22:43:07
From: Robin H. Johnson <redacted>
While doing testing, it's useful to see that a dry run was actually done,
instead of a real one.
Signed-off-by: Robin H. Johnson <redacted>
---
git-send-email.perl | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
From: Robin H. Johnson <hidden> Date: 2016-06-15 22:43:07
From: Robin H. Johnson <redacted>
The debug output is much more helpful if it has the parameters that were used.
Pull the sendmail parameters into a seperate array for that, and also include
similar data during the Net::SMTP case.
Signed-off-by: Robin H. Johnson <redacted>
---
git-send-email.perl | 10 ++++++----
1 files changed, 6 insertions(+), 4 deletions(-)
@@ -468,15 +468,15 @@ X-Mailer: git-send-email $gitversion$header.=join("\n",@xh)."\n";}+my@sendmail_parameters=('-i',map{extract_valid_address($_)}@recipients);+if($dry_run){# We don't want to send the email.}elsif($smtp_server=~m#^/#) {my$pid=openmy$sm,'|-';defined$pidordie$!;if(!$pid){-exec($smtp_server,'-i',-map{extract_valid_address($_)}-@recipients)ordie$!;+exec($smtp_server,@sendmail_parameters)ordie$!;}print$sm"$header\n$message";close$smordie$?;
From: Robin H. Johnson <hidden> Date: 2016-06-15 22:43:07
From: Robin H. Johnson <redacted>
Ensure that @recipients is only raw addresses when it is handed to the sendmail
binary OR Net::SMTP, otherwise BCC cases might get an extra <, or wierd stuff
might be passed to the exec.
Signed-off-by: Robin H. Johnson <redacted>
---
git-send-email.perl | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)
@@ -449,6 +449,7 @@ sub send_message@cc=(map{sanitize_address_rfc822($_)}@cc);my$to=join(",\n\t",@recipients);@recipients=unique_email_list(@recipients,@cc,@bcclist);+@recipients=(map{extract_valid_address($_)}@recipients);my$date=format_2822_time($time++);my$gitversion='@@GIT_VERSION@@';if($gitversion=~m/..GIT_VERSION../){
@@ -477,7 +478,7 @@ X-Mailer: git-send-email $gitversion$header.=join("\n",@xh)."\n";}-my@sendmail_parameters=('-i',map{extract_valid_address($_)}@recipients);+my@sendmail_parameters=('-i',@recipients);if($dry_run){# We don't want to send the email.
From: Robin H. Johnson <hidden> Date: 2016-06-15 22:43:07
From: Robin H. Johnson <redacted>
Always perform quoting of the recipient names if they contain periods,
previously only the author's address was treated this way. This stops sendmail
binaries from exploding the name into bad addresses.
Signed-off-by: Robin H. Johnson <redacted>
---
git-send-email.perl | 19 ++++++++++++++-----
1 files changed, 14 insertions(+), 5 deletions(-)
@@ -431,9 +431,22 @@ sub unquote_rfc2047 {return"$_";}+# If an address contains a . in the name portion, the name must be quoted.+subsanitize_address_rfc822+{+my($recipient)=@_;+my($recipient_name)=($recipient=~ /^(.*?)\s+</);+if($recipient_name&&$recipient_name=~ /\./&&$recipient_name!~/^".*"$/){+my($name,$addr)=($recipient=~ /^(.*?)(\s+<.*)/);+$recipient="\"$name\"$addr";+}+return$recipient;+}+subsend_message{my@recipients=unique_email_list(@to);+@cc=(map{sanitize_address_rfc822($_)}@cc);my$to=join(",\n\t",@recipients);@recipients=unique_email_list(@recipients,@cc,@bcclist);my$date=format_2822_time($time++);
@@ -442,11 +455,7 @@ sub send_message$gitversion=Git::version();}-my($author_name)=($from=~ /^(.*?)\s+</);-if($author_name&&$author_name=~ /\./&&$author_name!~/^".*"$/){-my($name,$addr)=($from=~ /^(.*?)(\s+<.*)/);-$from="\"$name\"$addr";-}+$from=sanitize_address_rfc822($from);my$cc=join(", ",unique_email_list(@cc));my$ccline="";if($ccne''){
From: Robin H. Johnson <hidden> Date: 2016-06-15 22:43:07
From: Robin H. Johnson <redacted>
Catch the documentation up with the rest of this patchset.
Signed-off-by: Robin H. Johnson <redacted>
---
Documentation/git-send-email.txt | 9 +++++++++
1 files changed, 9 insertions(+), 0 deletions(-)
@@ -85,6 +85,15 @@ The --cc option must be repeated for each user you want on the cc list. Do not add the From: address to the cc: list, if it shows up in a From: line.+--dry-run::+ Do everything except actually send the emails.++--envelope-sender::+ Specify the envelope sender used to send the emails. + This is useful if your default address is not the address that is+ subscribed to a list. If you use the sendmail binary, you must have+ suitable privileges for the -f parameter.+ --to:: Specify the primary recipient of the emails generated. Generally, this will be the upstream maintainer of the
From: Robin H. Johnson <hidden> Date: 2016-06-15 22:43:07
From: Robin H. Johnson <redacted>
If your normal user is not the same user you are subscribed to a list with,
then the default envelope sender used will cause your messages to bounce or
silently vanish into the ether.
This patch provides an optional parameter to set the envelope sender.
To use it with the sendmail binary, you must have privileges to use the -f
parameter!
Signed-off-by: Robin H. Johnson <redacted>
---
git-send-email.perl | 10 +++++++++-
1 files changed, 9 insertions(+), 1 deletions(-)
@@ -139,6 +141,7 @@ my (@to,@cc,@initial_cc,@bcclist,@xh,my($chain_reply_to,$quiet,$suppress_from,$no_signed_off_cc,$dry_run)=(1,0,0,0,0);my$smtp_server;+my$envelope_sender;# Example reply to:#$initial_reply_to = ''; #<20050203173208.GA23964@foobar.com>';
@@ -177,6 +180,7 @@ my $rc = GetOptions("from=s" => \$from,"suppress-from"=>\$suppress_from,"no-signed-off-cc|no-signed-off-by-cc"=>\$no_signed_off_cc,"dry-run"=>\$dry_run,+"envelope-sender=s"=>\$envelope_sender,);unless($rc){
@@ -479,7 +483,11 @@ X-Mailer: git-send-email $gitversion}my@sendmail_parameters=('-i',@recipients);-my$raw_from=extract_valid_address($from);+my$raw_from=$from;+$raw_from=$envelope_senderif(defined$envelope_sender);+$raw_from=extract_valid_address($raw_from);+unshift(@sendmail_parameters,+'-f',$raw_from)if(defined$envelope_sender);if($dry_run){# We don't want to send the email.
From: Robin H. Johnson <hidden> Date: 2016-06-15 22:43:07
From: Robin H. Johnson <redacted>
$cc is only used inside the send_message scope, so lets clean it out of the global scope.
Signed-off-by: Robin H. Johnson <redacted>
---
git-send-email.perl | 5 ++---
1 files changed, 2 insertions(+), 3 deletions(-)
@@ -379,7 +379,7 @@ if (@files) {}# Variables we set as part of the loop over files-our($message_id,$cc,%mail,$subject,$reply_to,$references,$message);+our($message_id,%mail,$subject,$reply_to,$references,$message);subextract_valid_address{my$address=shift;
@@ -420,7 +420,6 @@ sub make_message_id-$cc="";$time=time-scalar$#files;subunquote_rfc2047{
@@ -448,6 +447,7 @@ sub send_messagemy($name,$addr)=($from=~ /^(.*?)(\s+<.*)/);$from="\"$name\"$addr";}+my$cc=join(", ",unique_email_list(@cc));my$ccline="";if($ccne''){$ccline="\nCc: $cc";
From: Robin H. Johnson <hidden> Date: 2016-06-15 22:43:07
From: Robin H. Johnson <redacted>
Always pass in clean addresses to Net::SMTP for the MAIL FROM, and use them on
the SMTP non-quiet output as well.
Signed-off-by: Robin H. Johnson <redacted>
---
git-send-email.perl | 9 +++++----
1 files changed, 5 insertions(+), 4 deletions(-)
@@ -479,6 +479,7 @@ X-Mailer: git-send-email $gitversion}my@sendmail_parameters=('-i',@recipients);+my$raw_from=extract_valid_address($from);if($dry_run){# We don't want to send the email.