git-send-email: add support for TLS via Net::SMTP::SSL
We do this by handing over the Net::SMTP instance to Net::SMTP::SSL, which avoids Net::SMTP::TLS and its weird error checking. This trick is due to Brian Evins. Signed-off-by: Thomas Rast <trast@student.ethz.ch> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
85fe23ed2a
commit
f6bebd121a
@ -133,10 +133,13 @@ or on the command line. If a username has been specified (with
|
|||||||
specified (with --smtp-pass or a configuration variable), then the
|
specified (with --smtp-pass or a configuration variable), then the
|
||||||
user is prompted for a password while the input is masked for privacy.
|
user is prompted for a password while the input is masked for privacy.
|
||||||
|
|
||||||
|
--smtp-encryption::
|
||||||
|
Specify the encryption to use, either 'ssl' or 'tls'. Any other
|
||||||
|
value reverts to plain SMTP. Default is the value of
|
||||||
|
'sendemail.smtpencryption'.
|
||||||
|
|
||||||
--smtp-ssl::
|
--smtp-ssl::
|
||||||
If set, connects to the SMTP server using SSL.
|
Legacy alias for '--smtp-encryption=ssl'.
|
||||||
Default is the value of the 'sendemail.smtpssl' configuration value;
|
|
||||||
if that is unspecified, does not use SSL.
|
|
||||||
|
|
||||||
--subject::
|
--subject::
|
||||||
Specify the initial subject of the email thread.
|
Specify the initial subject of the email thread.
|
||||||
@ -229,8 +232,13 @@ sendemail.smtpuser::
|
|||||||
sendemail.smtppass::
|
sendemail.smtppass::
|
||||||
Default SMTP-AUTH password.
|
Default SMTP-AUTH password.
|
||||||
|
|
||||||
|
sendemail.smtpencryption::
|
||||||
|
Default encryption method. Use 'ssl' for SSL (and specify an
|
||||||
|
appropriate port), or 'tls' for TLS. Takes precedence over
|
||||||
|
'smtpssl' if both are specified.
|
||||||
|
|
||||||
sendemail.smtpssl::
|
sendemail.smtpssl::
|
||||||
Boolean value specifying the default to the '--smtp-ssl' parameter.
|
Legacy boolean that sets 'smtpencryption=ssl' if enabled.
|
||||||
|
|
||||||
Author
|
Author
|
||||||
------
|
------
|
||||||
|
@ -84,7 +84,10 @@ Options:
|
|||||||
|
|
||||||
--smtp-pass The password for SMTP-AUTH.
|
--smtp-pass The password for SMTP-AUTH.
|
||||||
|
|
||||||
--smtp-ssl If set, connects to the SMTP server using SSL.
|
--smtp-encryption Specify 'tls' for STARTTLS encryption, or 'ssl' for SSL.
|
||||||
|
Any other value disables the feature.
|
||||||
|
|
||||||
|
--smtp-ssl Synonym for '--smtp-encryption=ssl'. Deprecated.
|
||||||
|
|
||||||
--suppress-cc Suppress the specified category of auto-CC. The category
|
--suppress-cc Suppress the specified category of auto-CC. The category
|
||||||
can be one of 'author' for the patch author, 'self' to
|
can be one of 'author' for the patch author, 'self' to
|
||||||
@ -184,7 +187,7 @@ my ($quiet, $dry_run) = (0, 0);
|
|||||||
|
|
||||||
# Variables with corresponding config settings
|
# Variables with corresponding config settings
|
||||||
my ($thread, $chain_reply_to, $suppress_from, $signed_off_cc, $cc_cmd);
|
my ($thread, $chain_reply_to, $suppress_from, $signed_off_cc, $cc_cmd);
|
||||||
my ($smtp_server, $smtp_server_port, $smtp_authuser, $smtp_ssl);
|
my ($smtp_server, $smtp_server_port, $smtp_authuser, $smtp_encryption);
|
||||||
my ($identity, $aliasfiletype, @alias_files, @smtp_host_parts);
|
my ($identity, $aliasfiletype, @alias_files, @smtp_host_parts);
|
||||||
my ($no_validate);
|
my ($no_validate);
|
||||||
my (@suppress_cc);
|
my (@suppress_cc);
|
||||||
@ -194,7 +197,6 @@ my %config_bool_settings = (
|
|||||||
"chainreplyto" => [\$chain_reply_to, 1],
|
"chainreplyto" => [\$chain_reply_to, 1],
|
||||||
"suppressfrom" => [\$suppress_from, undef],
|
"suppressfrom" => [\$suppress_from, undef],
|
||||||
"signedoffcc" => [\$signed_off_cc, undef],
|
"signedoffcc" => [\$signed_off_cc, undef],
|
||||||
"smtpssl" => [\$smtp_ssl, 0],
|
|
||||||
);
|
);
|
||||||
|
|
||||||
my %config_settings = (
|
my %config_settings = (
|
||||||
@ -249,7 +251,8 @@ my $rc = GetOptions("sender|from=s" => \$sender,
|
|||||||
"smtp-server-port=s" => \$smtp_server_port,
|
"smtp-server-port=s" => \$smtp_server_port,
|
||||||
"smtp-user=s" => \$smtp_authuser,
|
"smtp-user=s" => \$smtp_authuser,
|
||||||
"smtp-pass:s" => \$smtp_authpass,
|
"smtp-pass:s" => \$smtp_authpass,
|
||||||
"smtp-ssl!" => \$smtp_ssl,
|
"smtp-ssl" => sub { $smtp_encryption = 'ssl' },
|
||||||
|
"smtp-encryption=s" => \$smtp_encryption,
|
||||||
"identity=s" => \$identity,
|
"identity=s" => \$identity,
|
||||||
"compose" => \$compose,
|
"compose" => \$compose,
|
||||||
"quiet" => \$quiet,
|
"quiet" => \$quiet,
|
||||||
@ -289,6 +292,15 @@ sub read_config {
|
|||||||
$$target = Git::config(@repo, "$prefix.$setting") unless (defined $$target);
|
$$target = Git::config(@repo, "$prefix.$setting") unless (defined $$target);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!defined $smtp_encryption) {
|
||||||
|
my $enc = Git::config(@repo, "$prefix.smtpencryption");
|
||||||
|
if (defined $enc) {
|
||||||
|
$smtp_encryption = $enc;
|
||||||
|
} elsif (Git::config_bool(@repo, "$prefix.smtpssl")) {
|
||||||
|
$smtp_encryption = 'ssl';
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# read configuration from [sendemail "$identity"], fall back on [sendemail]
|
# read configuration from [sendemail "$identity"], fall back on [sendemail]
|
||||||
@ -738,7 +750,7 @@ X-Mailer: git-send-email $gitversion
|
|||||||
die "The required SMTP server is not properly defined."
|
die "The required SMTP server is not properly defined."
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($smtp_ssl) {
|
if ($smtp_encryption eq 'ssl') {
|
||||||
$smtp_server_port ||= 465; # ssmtp
|
$smtp_server_port ||= 465; # ssmtp
|
||||||
require Net::SMTP::SSL;
|
require Net::SMTP::SSL;
|
||||||
$smtp ||= Net::SMTP::SSL->new($smtp_server, Port => $smtp_server_port);
|
$smtp ||= Net::SMTP::SSL->new($smtp_server, Port => $smtp_server_port);
|
||||||
@ -748,6 +760,17 @@ X-Mailer: git-send-email $gitversion
|
|||||||
$smtp ||= Net::SMTP->new((defined $smtp_server_port)
|
$smtp ||= Net::SMTP->new((defined $smtp_server_port)
|
||||||
? "$smtp_server:$smtp_server_port"
|
? "$smtp_server:$smtp_server_port"
|
||||||
: $smtp_server);
|
: $smtp_server);
|
||||||
|
if ($smtp_encryption eq 'tls') {
|
||||||
|
require Net::SMTP::SSL;
|
||||||
|
$smtp->command('STARTTLS');
|
||||||
|
$smtp->response();
|
||||||
|
if ($smtp->code == 220) {
|
||||||
|
$smtp = Net::SMTP::SSL->start_SSL($smtp)
|
||||||
|
or die "STARTTLS failed! ".$smtp->message;
|
||||||
|
} else {
|
||||||
|
die "Server does not support STARTTLS! ".$smtp->message;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$smtp) {
|
if (!$smtp) {
|
||||||
|
Loading…
Reference in New Issue
Block a user