@@ -1045,6 +1045,47 @@ sub maildomain {
1045
1045
return maildomain_net() || maildomain_mta() || ' localhost.localdomain' ;
1046
1046
}
1047
1047
1048
+ sub smtp_host_string {
1049
+ if (defined $smtp_server_port ) {
1050
+ return " $smtp_server :$smtp_server_port " ;
1051
+ } else {
1052
+ return $smtp_server ;
1053
+ }
1054
+ }
1055
+
1056
+ # Returns 1 if authentication succeeded or was not necessary
1057
+ # (smtp_user was not specified), and 0 otherwise.
1058
+
1059
+ sub smtp_auth_maybe {
1060
+ if (!defined $smtp_authuser || $auth ) {
1061
+ return 1;
1062
+ }
1063
+
1064
+ # Workaround AUTH PLAIN/LOGIN interaction defect
1065
+ # with Authen::SASL::Cyrus
1066
+ eval {
1067
+ require Authen::SASL;
1068
+ Authen::SASL-> import (qw( Perl) );
1069
+ };
1070
+
1071
+ # TODO: Authentication may fail not because credentials were
1072
+ # invalid but due to other reasons, in which we should not
1073
+ # reject credentials.
1074
+ $auth = Git::credential({
1075
+ ' protocol' => ' smtp' ,
1076
+ ' host' => smtp_host_string(),
1077
+ ' username' => $smtp_authuser ,
1078
+ # if there's no password, "git credential fill" will
1079
+ # give us one, otherwise it'll just pass this one.
1080
+ ' password' => $smtp_authpass
1081
+ }, sub {
1082
+ my $cred = shift ;
1083
+ return !!$smtp -> auth($cred -> {' username' }, $cred -> {' password' });
1084
+ });
1085
+
1086
+ return $auth ;
1087
+ }
1088
+
1048
1089
# Returns 1 if the message was sent, and 0 otherwise.
1049
1090
# In actuality, the whole program dies when there
1050
1091
# is an error sending a message.
@@ -1155,9 +1196,7 @@ sub send_message {
1155
1196
else {
1156
1197
require Net::SMTP;
1157
1198
$smtp_domain ||= maildomain();
1158
- $smtp ||= Net::SMTP-> new((defined $smtp_server_port )
1159
- ? " $smtp_server :$smtp_server_port "
1160
- : $smtp_server ,
1199
+ $smtp ||= Net::SMTP-> new(smtp_host_string(),
1161
1200
Hello => $smtp_domain ,
1162
1201
Debug => $debug_net_smtp );
1163
1202
if ($smtp_encryption eq ' tls' && $smtp ) {
@@ -1185,31 +1224,7 @@ sub send_message {
1185
1224
defined $smtp_server_port ? " port=$smtp_server_port " : " " ;
1186
1225
}
1187
1226
1188
- if (defined $smtp_authuser ) {
1189
- # Workaround AUTH PLAIN/LOGIN interaction defect
1190
- # with Authen::SASL::Cyrus
1191
- eval {
1192
- require Authen::SASL;
1193
- Authen::SASL-> import (qw( Perl) );
1194
- };
1195
-
1196
- if (!defined $smtp_authpass ) {
1197
-
1198
- system " stty -echo" ;
1199
-
1200
- do {
1201
- print " Password: " ;
1202
- $_ = <STDIN >;
1203
- print " \n " ;
1204
- } while (!defined $_ );
1205
-
1206
- chomp ($smtp_authpass = $_ );
1207
-
1208
- system " stty echo" ;
1209
- }
1210
-
1211
- $auth ||= $smtp -> auth( $smtp_authuser , $smtp_authpass ) or die $smtp -> message;
1212
- }
1227
+ smtp_auth_maybe or die $smtp -> message;
1213
1228
1214
1229
$smtp -> mail( $raw_from ) or die $smtp -> message;
1215
1230
$smtp -> to( @recipients ) or die $smtp -> message;
0 commit comments