git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 3/3] git-send-email.perl - Fix 550 EHLO argument does not match calling host

From
Jari Aalto <jari.aalto@cante.net>
Date
Mar 14, 2010, 15:16 UTC
Message-ID
<87sk83aq76.fsf_-_@jondo.cante.net>
In-Reply-To
<878w9vdx01.fsf@jondo.cante.net>

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>
---
 git-send-email.perl |   71 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 70 insertions(+), 1 deletions(-)
    ================================
    This is REVISION SET 4, reworked
    ================================
diff --git a/git-send-email.perl b/git-send-email.perl
index a8887ea..5fe8246 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -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,65 @@ 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 }) {
+		eval "use Net::Domain";
+		unless ($@) {
+		    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 +999,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 +1033,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" : "";
 		}
 
-- 
1.7.0
Previous: Jari AaltoNext: Jakub Narebski
Message 25 of 28 in “Do not strip empty lines / trailing spaces from a commit message template”
  1. Do not strip empty lines / trailing spaces from a commit message templateSebastian Schuberth, Mar 10, 2010
  2. Jeff KingMar 11, 2010
  3. Jeff KingMar 11, 2010
  4. Junio C HamanoMar 11, 2010
  5. Jeff KingMar 11, 2010
  6. Junio C HamanoMar 12, 2010
  7. Sebastian SchuberthMar 12, 2010
  8. Junio C HamanoMar 12, 2010
  9. git-send-email.perl - Fix 550 EHLO argument does not match calling hostJari Aalto, Mar 13, 2010
  10. Junio C HamanoMar 13, 2010
  11. git-send-email.perl - Fix 550 EHLO argument does not match calling hostJari Aalto, Mar 13, 2010
  12. Junio C HamanoMar 14, 2010
  13. Jari AaltoMar 14, 2010
  14. Junio C HamanoMar 14, 2010
  15. Jari AaltoMar 14, 2010
  16. Jari AaltoMar 14, 2010
  17. git-send-email.perl - Fix 550 EHLO argument does not match calling hostJari Aalto, Mar 14, 2010
  18. Junio C HamanoMar 14, 2010
  19. Jari AaltoMar 14, 2010
  20. Jari AaltoMar 14, 2010
  21. Jakub NarebskiMar 14, 2010
  22. Jari AaltoMar 14, 2010
  23. 1/3 git-send-email.perl: improve error message in send_message()Jari Aalto, Mar 14, 2010
  24. 2/3 git-send-email.perl: add option --smtp-debugJari Aalto, Mar 14, 2010
  25. 3/3 git-send-email.perl - Fix 550 EHLO argument does not match calling hostJari Aalto, Mar 14, 2010
  26. Jakub NarebskiMar 14, 2010
  27. Jari AaltoMar 14, 2010
  28. git-send-email.perl - Fix 550 EHLO argument does not match calling hostJari Aalto, Mar 14, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.