threads / patch / 9740

patchsend-email: Add support for SSL and SMTP-AUTH

Subject: [PATCH] send-email: Add support for SSL and SMTP-AUTH

## tl;dr

5 messages between Sep 2, 2007 and Sep 2, 2007. Diffs are folded; open one to read it.

replies: 4people: 5as markdown or json

Douglas Stockwell· Sep 2, 2007, 03:14 UTC · lore

Allows username and password to be given using --smtp-authuser and --smtp-authpass. SSL use is flagged by --smtp-ssl. These are backed by corresponding defaults in the git configuration file.

Signed-off-by: Douglas Stockwell <doug@11011.net>
---
 Documentation/git-send-email.txt |   21 +++++++++++++++-
 git-send-email.perl              |   50 ++++++++++++++++++++++++++++++-------
 2 files changed, 60 insertions(+), 11 deletions(-)
Show changes to 2 files +60 −11

Documentation/git-send-email.txt, git-send-email.perl

diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt
index 8231286..471c268 100644
--- a/Documentation/git-send-email.txt
+++ b/Documentation/git-send-email.txt
@@ -79,6 +79,16 @@ The --cc option must be repeated for each user you want on the cc list.
 	`/usr/lib/sendmail` if such program is available, or
 	`localhost` otherwise.
 
+--smtp-authuser, --smtp-authpass::
+	Username and password for SMTP-AUTH. Defaults are the values of
+	the configuration values 'sendemail.smtpauthuser' and
+	'sendemail.smtpauthpass'. If not set, authentication is not attempted.
+
+--smtp-ssl::
+	If set, connects to the SMTP server using SSL.
+	Default is the value of the 'sendemail.smtpssl' configuration value;
+	if that is unspecified, does not use SSL.
+
 --subject::
 	Specify the initial subject of the email thread.
 	Only necessary if --compose is also set.  If --compose
@@ -132,7 +142,16 @@ sendemail.chainreplyto::
 	parameter.
 
 sendemail.smtpserver::
-	Default smtp server to use.
+	Default SMTP server to use.
+
+sendemail.smtpauthuser::
+	Default SMTP-AUTH username.
+
+sendemail.smtpauthpass::
+	Default SMTP-AUTH password.
+
+sendemail.smtpssl::
+	Boolean value specifying the default to the '--smtp-ssl' parameter.
 
 Author
 ------
diff --git a/git-send-email.perl b/git-send-email.perl
index f1a8855..38e8395 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -73,6 +73,12 @@ Options:
    --smtp-server  If set, specifies the outgoing SMTP server to use.
                   Defaults to localhost.
 
+   --smtp-authuser The username for SMTP-AUTH.
+
+   --smtp-authpass The password for SMTP-AUTH.
+
+   --smtp-ssl     If set, connects to the SMTP server using SSL.
+
    --suppress-from Suppress sending emails to yourself if your address
                   appears in a From: line. Defaults to off.
 
@@ -142,7 +148,6 @@ my $compose_filename = ".msg.$$";
 my (@to,@cc,@initial_cc,@bcclist,@xh,
 	$initial_reply_to,$initial_subject,@files,$author,$sender,$compose,$time);
 
-my $smtp_server;
 my $envelope_sender;
 
 # Example reply to:
@@ -161,17 +166,34 @@ my ($quiet, $dry_run) = (0, 0);
 
 # Variables with corresponding config settings
 my ($thread, $chain_reply_to, $suppress_from, $signed_off_cc);
+my ($smtp_server, $smtp_authuser, $smtp_authpass, $smtp_ssl);
 
-my %config_settings = (
+my %config_bool_settings = (
     "thread" => [\$thread, 1],
     "chainreplyto" => [\$chain_reply_to, 1],
     "suppressfrom" => [\$suppress_from, 0],
     "signedoffcc" => [\$signed_off_cc, 1],
+    "smtpssl" => [\$smtp_ssl, 0]
+);
+
+my %config_string_settings = (
+    "smtpserver" => [\$smtp_server, undef],
+    "smtpauthuser" => [\$smtp_authuser, undef],
+    "smtpauthpass" => [\$smtp_authpass, undef],
 );
 
-foreach my $setting (keys %config_settings) {
+foreach my $setting (keys %config_bool_settings) {
     my $config = $repo->config_bool("sendemail.$setting");
-    ${$config_settings{$setting}->[0]} = (defined $config) ? $config : $config_settings{$setting}->[1];
+    ${$config_bool_settings{$setting}->[0]} = (defined $config)
+        ? $config
+        : $config_bool_settings{$setting}->[1];
+}
+
+foreach my $setting (keys %config_string_settings) {
+    my $config = $repo->config("sendemail.$setting");
+    ${$config_string_settings{$setting}->[0]} = (defined $config)
+        ? $config
+        : $config_string_settings{$setting}->[1];
 }
 
 @bcclist = $repo->config('sendemail.bcc');
@@ -190,6 +212,9 @@ my $rc = GetOptions("sender|from=s" => \$sender,
 		    "bcc=s" => \@bcclist,
 		    "chain-reply-to!" => \$chain_reply_to,
 		    "smtp-server=s" => \$smtp_server,
+		    "smtp-authuser=s" => \$smtp_authuser,
+		    "smtp-authpass=s" => \$smtp_authpass,
+		    "smtp-ssl!" => \$smtp_ssl,
 		    "compose" => \$compose,
 		    "quiet" => \$quiet,
 		    "suppress-from!" => \$suppress_from,
@@ -315,10 +340,7 @@ if ($thread && !defined $initial_reply_to && $prompting) {
 	$initial_reply_to =~ s/(^\s+|\s+$)//g;
 }
 
-if (!$smtp_server) {
-	$smtp_server = $repo->config('sendemail.smtpserver');
-}
-if (!$smtp_server) {
+if (!defined $smtp_server) {
 	foreach (qw( /usr/sbin/sendmail /usr/lib/sendmail )) {
 		if (-x $_) {
 			$smtp_server = $_;
@@ -548,8 +570,16 @@ X-Mailer: git-send-email $gitversion
 		print $sm "$header\n$message";
 		close $sm or die $?;
 	} else {
-		require Net::SMTP;
-		$smtp ||= Net::SMTP->new( $smtp_server );
+		if ($smtp_ssl) {
+			require Net::SMTP::SSL;
+			$smtp ||= Net::SMTP::SSL->new( $smtp_server, Port => 465 );
+		}
+		else {
+			require Net::SMTP;
+			$smtp ||= Net::SMTP->new( $smtp_server );
+		}
+		$smtp->auth( $smtp_authuser, $smtp_authpass )
+			or die $smtp->message if (defined $smtp_authuser);
 		$smtp->mail( $raw_from ) or die $smtp->message;
 		$smtp->to( @recipients ) or die $smtp->message;
 		$smtp->data or die $smtp->message;
-- 
1.5.3.rc7.17.gd77cc
Junio C Hamano· Sep 2, 2007, 07:55 UTC · re: Douglas Stockwell · lore

Re: [PATCH] send-email: Add support for SSL and SMTP-AUTH

Thanks for the patch.  I think SMTP-AUTH is a worthy addition.

I however have a bit of reservation about making the password itself a configuration variable. I understand this is good enough for the simplest case that you have only single e-mail identity and mailserver to talk to.

By defining the two "default" variables, you are encouraging users who want to use different identity per project to define the smtpauthuser and smtpauthpass variables in .git/config of each repository. I see two issues with this.

 (1) Suppose I interact with under one mail identity with
     projects A and B and under another mail identity with
     project C and D.  I need to have duplicate variable
     settings in .git/config of A and B for one and another
     duplicated sets in C and D.
 (2) Although the recommended BCP is not to allow other people
     to interact with your private working repository (iow, you
     keep a separate "bare" repository you use solely for
     publishing, you push from your private working repository
     to that publishing repository, and have others look at only
     the publishing repository), people often do not follow this
     BCP and expose their private working repository to their
     colleages for fetching (or even pushing).  We currently do
     not allow reading remote repository's configuration over
     the git protocol, but there were some cases in the past
     that the ability to do so might lead to their solutions
     discussed on the list.  We might not keep .git/config in
     the repository that is accessed by fetch clients private in
     the future.

So it might be better to split the configuration variables in this way:

 (1) in ~/.gitconfig (that is hopefully readable only by the
     user):
	[sendemail "default"]
        	server = mail.isp.com
                user = junkio
                pass = junkio-password-for-mail-isp-com
	[sendemail "git"]
        	server = mail.git.xz
                user = gitster
                pass = gitster-password-for-mail-git.xz
     This defines two "mail identities" I could use, depending
     on which project's repository I run send-email.
 (2) in project/.git/config:
	[sendemail]
        	identity = git
     This defines which "mail identity" I want to use for this
     particular project.

This way, you can maintain more than one identity by having multiple [sendemail "$identity"] sections in ~/.gitconfig, and avoid having to expose and duplicate user/pass in various project's .git/config.

The look-up rules by send-email program would be:
 * if anything is given explicitly from the command line, use
   that; otherwise
 * if sendemail.identity does not exist, pretend
   "sendemail.identity = default" was given (let's call that
   identity nickname $identity in the following);
   * if sendemail.$identity.server.exists, use that as the smtp
     server to contact; otherwise sendemail.smtpserver is used;
   * for user/pass information, use sendemail.$identity.user and
     sendemail.$identity.pass.
Hmm?
Wincent Colaiuta· Sep 2, 2007, 09:43 UTC · re: Junio C Hamano · lore

Re: [PATCH] send-email: Add support for SSL and SMTP-AUTH

El 2/9/2007, a las 9:55, Junio C Hamano escribió:
Show 31 quoted lines
> So it might be better to split the configuration variables in this
> way:
>
>  (1) in ~/.gitconfig (that is hopefully readable only by the
>      user):
>
> 	[sendemail "default"]
>         	server = mail.isp.com
>                 user = junkio
>                 pass = junkio-password-for-mail-isp-com
>
> 	[sendemail "git"]
>         	server = mail.git.xz
>                 user = gitster
>                 pass = gitster-password-for-mail-git.xz
>
>      This defines two "mail identities" I could use, depending
>      on which project's repository I run send-email.
>
>  (2) in project/.git/config:
>
> 	[sendemail]
>         	identity = git
>
>      This defines which "mail identity" I want to use for this
>      particular project.
>
> This way, you can maintain more than one identity by having
> multiple [sendemail "$identity"] sections in ~/.gitconfig, and
> avoid having to expose and duplicate user/pass in various
> project's .git/config.
Sounds like a good plan.
Wincent
David Symonds· Sep 2, 2007, 11:06 UTC · re: Junio C Hamano · lore

Re: [PATCH] send-email: Add support for SSL and SMTP-AUTH

On 02/09/07, Junio C Hamano <gitster@pobox.com> wrote:
Show 5 quoted lines
> So it might be better to split the configuration variables in this
> way:
>
>  (1) in ~/.gitconfig (that is hopefully readable only by the
>      user):

Perhaps git should then start warning if ~/.gitconfig is world (and probably group) readable/writeable, a la ssh's ~/.ssh/X (for various values of X)?

Dave.
Johannes Schindelin· Sep 2, 2007, 12:32 UTC · re: Junio C Hamano · lore

Re: [PATCH] send-email: Add support for SSL and SMTP-AUTH

Hi,
On Sun, 2 Sep 2007, Junio C Hamano wrote:
> Thanks for the patch.  I think SMTP-AUTH is a worthy addition.
> 
> I however have a bit of reservation about making the password
> itself a configuration variable.

Why not have the password in $HOME/.netrc, and ask interactively if none was found?

Ciao, Dscho

← back to recent threads