Merge branch 'mw/send-email'
* mw/send-email: git-send-email: Better handling of EOF git-send-email: SIG{TERM,INT} handlers git-send-email: ssh/login style password requests
This commit is contained in:
commit
e3560df69d
@ -96,11 +96,40 @@ The --cc option must be repeated for each user you want on the cc list.
|
||||
servers typically listen to smtp port 25 and ssmtp port
|
||||
465).
|
||||
|
||||
--smtp-user, --smtp-pass::
|
||||
Username and password for SMTP-AUTH. Defaults are the values of
|
||||
the configuration values 'sendemail.smtpuser' and
|
||||
'sendemail.smtppass', but see also 'sendemail.identity'.
|
||||
If not set, authentication is not attempted.
|
||||
--smtp-user::
|
||||
Username for SMTP-AUTH. In place of this option, the following
|
||||
configuration variables can be specified:
|
||||
+
|
||||
--
|
||||
* sendemail.smtpuser
|
||||
* sendemail.<identity>.smtpuser (see sendemail.identity).
|
||||
--
|
||||
+
|
||||
However, --smtp-user always overrides these variables.
|
||||
+
|
||||
If a username is not specified (with --smtp-user or a
|
||||
configuration variable), then authentication is not attempted.
|
||||
|
||||
--smtp-pass::
|
||||
Password for SMTP-AUTH. The argument is optional: If no
|
||||
argument is specified, then the empty string is used as
|
||||
the password.
|
||||
+
|
||||
In place of this option, the following configuration variables
|
||||
can be specified:
|
||||
+
|
||||
--
|
||||
* sendemail.smtppass
|
||||
* sendemail.<identity>.smtppass (see sendemail.identity).
|
||||
--
|
||||
+
|
||||
However, --smtp-pass always overrides these variables.
|
||||
+
|
||||
Furthermore, passwords need not be specified in configuration files
|
||||
or on the command line. If a username has been specified (with
|
||||
--smtp-user or a configuration variable), but no password has been
|
||||
specified (with --smtp-pass or a configuration variable), then the
|
||||
user is prompted for a password while the input is masked for privacy.
|
||||
|
||||
--smtp-ssl::
|
||||
If set, connects to the SMTP server using SSL.
|
||||
|
@ -24,8 +24,6 @@ use Data::Dumper;
|
||||
use Term::ANSIColor;
|
||||
use Git;
|
||||
|
||||
$SIG{INT} = sub { print color("reset"), "\n"; exit };
|
||||
|
||||
package FakeTerm;
|
||||
sub new {
|
||||
my ($class, $reason) = @_;
|
||||
@ -163,7 +161,7 @@ my $compose_filename = ".msg.$$";
|
||||
|
||||
# Variables we fill in automatically, or via prompting:
|
||||
my (@to,@cc,@initial_cc,@bcclist,@xh,
|
||||
$initial_reply_to,$initial_subject,@files,$author,$sender,$compose,$time);
|
||||
$initial_reply_to,$initial_subject,@files,$author,$sender,$smtp_authpass,$compose,$time);
|
||||
|
||||
my $envelope_sender;
|
||||
|
||||
@ -183,7 +181,7 @@ my ($quiet, $dry_run) = (0, 0);
|
||||
|
||||
# Variables with corresponding config settings
|
||||
my ($thread, $chain_reply_to, $suppress_from, $signed_off_cc, $cc_cmd);
|
||||
my ($smtp_server, $smtp_server_port, $smtp_authuser, $smtp_authpass, $smtp_ssl);
|
||||
my ($smtp_server, $smtp_server_port, $smtp_authuser, $smtp_ssl);
|
||||
my ($identity, $aliasfiletype, @alias_files, @smtp_host_parts);
|
||||
my ($no_validate);
|
||||
my (@suppress_cc);
|
||||
@ -209,6 +207,29 @@ my %config_settings = (
|
||||
"suppresscc" => \@suppress_cc,
|
||||
);
|
||||
|
||||
# Handle Uncouth Termination
|
||||
sub signal_handler {
|
||||
|
||||
# Make text normal
|
||||
print color("reset"), "\n";
|
||||
|
||||
# SMTP password masked
|
||||
system "stty echo";
|
||||
|
||||
# tmp files from --compose
|
||||
if (-e $compose_filename) {
|
||||
print "'$compose_filename' contains an intermediate version of the email you were composing.\n";
|
||||
}
|
||||
if (-e ($compose_filename . ".final")) {
|
||||
print "'$compose_filename.final' contains the composed email.\n"
|
||||
}
|
||||
|
||||
exit;
|
||||
};
|
||||
|
||||
$SIG{TERM} = \&signal_handler;
|
||||
$SIG{INT} = \&signal_handler;
|
||||
|
||||
# Begin by accumulating all the variables (defined above), that we will end up
|
||||
# needing, first, from the command line:
|
||||
|
||||
@ -222,7 +243,7 @@ my $rc = GetOptions("sender|from=s" => \$sender,
|
||||
"smtp-server=s" => \$smtp_server,
|
||||
"smtp-server-port=s" => \$smtp_server_port,
|
||||
"smtp-user=s" => \$smtp_authuser,
|
||||
"smtp-pass=s" => \$smtp_authpass,
|
||||
"smtp-pass:s" => \$smtp_authpass,
|
||||
"smtp-ssl!" => \$smtp_ssl,
|
||||
"identity=s" => \$identity,
|
||||
"compose" => \$compose,
|
||||
@ -393,9 +414,12 @@ if (@files) {
|
||||
my $prompting = 0;
|
||||
if (!defined $sender) {
|
||||
$sender = $repoauthor || $repocommitter;
|
||||
do {
|
||||
|
||||
while (1) {
|
||||
$_ = $term->readline("Who should the emails appear to be from? [$sender] ");
|
||||
} while (!defined $_);
|
||||
last if defined $_;
|
||||
print "\n";
|
||||
}
|
||||
|
||||
$sender = $_ if ($_);
|
||||
print "Emails will be sent from: ", $sender, "\n";
|
||||
@ -403,10 +427,14 @@ if (!defined $sender) {
|
||||
}
|
||||
|
||||
if (!@to) {
|
||||
do {
|
||||
$_ = $term->readline("Who should the emails be sent to? ",
|
||||
"");
|
||||
} while (!defined $_);
|
||||
|
||||
|
||||
while (1) {
|
||||
$_ = $term->readline("Who should the emails be sent to? ", "");
|
||||
last if defined $_;
|
||||
print "\n";
|
||||
}
|
||||
|
||||
my $to = $_;
|
||||
push @to, split /,/, $to;
|
||||
$prompting++;
|
||||
@ -428,19 +456,22 @@ sub expand_aliases {
|
||||
@bcclist = expand_aliases(@bcclist);
|
||||
|
||||
if (!defined $initial_subject && $compose) {
|
||||
do {
|
||||
$_ = $term->readline("What subject should the initial email start with? ",
|
||||
$initial_subject);
|
||||
} while (!defined $_);
|
||||
while (1) {
|
||||
$_ = $term->readline("What subject should the initial email start with? ", $initial_subject);
|
||||
last if defined $_;
|
||||
print "\n";
|
||||
}
|
||||
|
||||
$initial_subject = $_;
|
||||
$prompting++;
|
||||
}
|
||||
|
||||
if ($thread && !defined $initial_reply_to && $prompting) {
|
||||
do {
|
||||
$_= $term->readline("Message-ID to be used as In-Reply-To for the first email? ",
|
||||
$initial_reply_to);
|
||||
} while (!defined $_);
|
||||
while (1) {
|
||||
$_= $term->readline("Message-ID to be used as In-Reply-To for the first email? ", $initial_reply_to);
|
||||
last if defined $_;
|
||||
print "\n";
|
||||
}
|
||||
|
||||
$initial_reply_to = $_;
|
||||
}
|
||||
@ -491,9 +522,11 @@ EOT
|
||||
close(C);
|
||||
close(C2);
|
||||
|
||||
do {
|
||||
while (1) {
|
||||
$_ = $term->readline("Send this email? (y|n) ");
|
||||
} while (!defined $_);
|
||||
last if defined $_;
|
||||
print "\n";
|
||||
}
|
||||
|
||||
if (uc substr($_,0,1) ne 'Y') {
|
||||
cleanup_compose_files();
|
||||
@ -685,9 +718,26 @@ X-Mailer: git-send-email $gitversion
|
||||
die "Unable to initialize SMTP properly. Is there something wrong with your config?";
|
||||
}
|
||||
|
||||
if ((defined $smtp_authuser) && (defined $smtp_authpass)) {
|
||||
if (defined $smtp_authuser) {
|
||||
|
||||
if (!defined $smtp_authpass) {
|
||||
|
||||
system "stty -echo";
|
||||
|
||||
do {
|
||||
print "Password: ";
|
||||
$_ = <STDIN>;
|
||||
print "\n";
|
||||
} while (!defined $_);
|
||||
|
||||
chomp($smtp_authpass = $_);
|
||||
|
||||
system "stty echo";
|
||||
}
|
||||
|
||||
$auth ||= $smtp->auth( $smtp_authuser, $smtp_authpass ) or die $smtp->message;
|
||||
}
|
||||
|
||||
$smtp->mail( $raw_from ) or die $smtp->message;
|
||||
$smtp->to( @recipients ) or die $smtp->message;
|
||||
$smtp->data or die $smtp->message;
|
||||
|
Loading…
Reference in New Issue
Block a user