git-send-email.perl - try to give real name of the calling host to HELO/EHLO
Add new functions maildomain_net(), maildomain_mta() and maildomain(), which return FQDN where possible for use in send_message(). The value is passed to Net::SMTP HELO/EHLO handshake. The domain name can also be set via new --smtp-domain option. The default value in Net::SMTP may not get through: Net::SMTP=GLOB(0x267ec28)>>> EHLO localhost.localdomain Net::SMTP=GLOB(0x267ec28)<<< 550 EHLO argument does not match calling host whereas using the FQDN that matches the IP, the result is: Net::SMTP=GLOB(0x15b8e80)>>> EHLO host.example.com Net::SMTP=GLOB(0x15b8e80)<<< 250-host.example.com Hello host.example.com [192.168.1.7] The maildomain*() code is based on ideas in Perl library Test::Reporter by Graham Barr <gbarr@pobox.com> and Mark Overmeer <mailtools@overmeer.net> released under the same terms as Perl itself. Signed-off-by: Jari Aalto <jari.aalto@cante.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									f60812efa3
								
							
						
					
					
						commit
						134550fe21
					
				|  | @ -64,6 +64,7 @@ git send-email [options] <file | directory | rev-list options > | |||
|     --smtp-pass             <str>  * Password for SMTP-AUTH; not necessary. | ||||
|     --smtp-encryption       <str>  * tls or ssl; anything else disables. | ||||
|     --smtp-ssl                     * Deprecated. Use '--smtp-encryption ssl'. | ||||
|     --smtp-domain           <str>  * The domain name sent to HELO/EHLO handshake | ||||
|     --smtp-debug            <0|1>  * Disable, enable Net::SMTP debug. | ||||
|  | ||||
|   Automating: | ||||
|  | @ -131,6 +132,8 @@ my $have_email_valid = eval { require Email::Valid; 1 }; | |||
| my $have_mail_address = eval { require Mail::Address; 1 }; | ||||
| my $smtp; | ||||
| my $auth; | ||||
| my $mail_domain_default = "localhost.localdomain"; | ||||
| my $mail_domain; | ||||
|  | ||||
| sub unique_email_list(@); | ||||
| sub cleanup_compose_files(); | ||||
|  | @ -274,6 +277,7 @@ my $rc = GetOptions("sender|from=s" => \$sender, | |||
| 		    "smtp-ssl" => sub { $smtp_encryption = 'ssl' }, | ||||
| 		    "smtp-encryption=s" => \$smtp_encryption, | ||||
| 		    "smtp-debug:i" => \$debug_net_smtp, | ||||
| 		    "smtp-domain:s" => \$mail_domain, | ||||
| 		    "identity=s" => \$identity, | ||||
| 		    "annotate" => \$annotate, | ||||
| 		    "compose" => \$compose, | ||||
|  | @ -834,6 +838,62 @@ sub sanitize_address | |||
|  | ||||
| } | ||||
|  | ||||
| # Returns the local Fully Qualified Domain Name (FQDN) if available. | ||||
| # | ||||
| # Tightly configured MTAa require that a caller sends a real DNS | ||||
| # domain name that corresponds the IP address in the HELO/EHLO | ||||
| # handshake. This is used to verify the connection and prevent | ||||
| # spammers from trying to hide their identity. If the DNS and IP don't | ||||
| # match, the receiveing MTA may deny the connection. | ||||
| # | ||||
| # Here is a deny example of Net::SMTP with the default "localhost.localdomain" | ||||
| # | ||||
| # Net::SMTP=GLOB(0x267ec28)>>> EHLO localhost.localdomain | ||||
| # Net::SMTP=GLOB(0x267ec28)<<< 550 EHLO argument does not match calling host | ||||
| # | ||||
| # This maildomain*() code is based on ideas in Perl library Test::Reporter | ||||
| # /usr/share/perl5/Test/Reporter/Mail/Util.pm ==> sub _maildomain () | ||||
|  | ||||
| sub maildomain_net | ||||
| { | ||||
| 	my $maildomain; | ||||
|  | ||||
| 	if (eval { require Net::Domain; 1 }) { | ||||
| 		my $domain = Net::Domain::domainname(); | ||||
| 		$maildomain = $domain | ||||
| 			unless $^O eq 'darwin' && $domain =~ /\.local$/; | ||||
| 	} | ||||
|  | ||||
| 	return $maildomain; | ||||
| } | ||||
|  | ||||
| sub maildomain_mta | ||||
| { | ||||
| 	my $maildomain; | ||||
|  | ||||
| 	if (eval { require Net::SMTP; 1 }) { | ||||
| 		for my $host (qw(mailhost localhost)) { | ||||
| 			my $smtp = Net::SMTP->new($host); | ||||
| 			if (defined $smtp) { | ||||
| 				my $domain = $smtp->domain; | ||||
| 				$smtp->quit; | ||||
|  | ||||
| 				$maildomain = $domain | ||||
| 					unless $^O eq 'darwin' && $domain =~ /\.local$/; | ||||
|  | ||||
| 				last if $maildomain; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return $maildomain; | ||||
| } | ||||
|  | ||||
| sub maildomain | ||||
| { | ||||
| 	return maildomain_net() || maildomain_mta() || $mail_domain_default; | ||||
| } | ||||
|  | ||||
| # Returns 1 if the message was sent, and 0 otherwise. | ||||
| # In actuality, the whole program dies when there | ||||
| # is an error sending a message. | ||||
|  | @ -936,13 +996,18 @@ X-Mailer: git-send-email $gitversion | |||
| 		if ($smtp_encryption eq 'ssl') { | ||||
| 			$smtp_server_port ||= 465; # ssmtp | ||||
| 			require Net::SMTP::SSL; | ||||
| 			$smtp ||= Net::SMTP::SSL->new($smtp_server, Port => $smtp_server_port); | ||||
| 			$mail_domain ||= maildomain(); | ||||
| 			$smtp ||= Net::SMTP::SSL->new($smtp_server, | ||||
| 						      Hello => $mail_domain, | ||||
| 						      Port => $smtp_server_port); | ||||
| 		} | ||||
| 		else { | ||||
| 			require Net::SMTP; | ||||
| 			$mail_domain ||= maildomain(); | ||||
| 			$smtp ||= Net::SMTP->new((defined $smtp_server_port) | ||||
| 						 ? "$smtp_server:$smtp_server_port" | ||||
| 						 : $smtp_server, | ||||
| 						 Hello => $mail_domain, | ||||
| 						 Debug => $debug_net_smtp); | ||||
| 			if ($smtp_encryption eq 'tls' && $smtp) { | ||||
| 				require Net::SMTP::SSL; | ||||
|  | @ -965,6 +1030,7 @@ X-Mailer: git-send-email $gitversion | |||
| 			die "Unable to initialize SMTP properly. Check config and use --smtp-debug. ", | ||||
| 			    "VALUES: server=$smtp_server ", | ||||
| 			    "encryption=$smtp_encryption ", | ||||
| 			    "maildomain=$mail_domain", | ||||
| 			    defined $smtp_server_port ? "port=$smtp_server_port" : ""; | ||||
| 		} | ||||
|  | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Jari Aalto
						Jari Aalto