public inbox for git@vger.kernel.org 
 help / color / mirror / Atom feed
From: Jari Aalto <jari.aalto@cante•net>
To: git@vger•kernel.org
Subject: [PATCH] git-send-email.perl - Fix 550 EHLO argument does not match calling host
Date: Sun, 14 Mar 2010 01:56:41 +0200	[thread overview]
Message-ID: <87eijng4hy.fsf@jondo.cante.net> (raw)
In-Reply-To: 7vfx433l9x.fsf@alter.siamese.dyndns.org

Add new function maildomain() which returns FQDN for use in
send_message(). The value is passed to Net::SMTP HELO/EHLO handshake.
The domain name can also be set via --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, 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]

Signed-off-by: Jari Aalto <jari.aalto@cante•net>
---
 git-send-email.perl |   57 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 55 insertions(+), 2 deletions(-)

> Junio C Hamano <gitster@pobox•com> writes:
> I think you identified a good issue to tackle.  But is it really the
> optimal solution?
>
>  - Is it the best we can do to always make an empty connection only to
>    check if the we have hosts locally known as mailhost or localhost
>    listens to SMTP port?  And calling this function again and again, even
>    after sending one message to the same $smtp_server successfully ($smtp
>    in the global scope is already set in that case)?

A new patch below. I made the value global, so that it's set only once
for the duration of program.

>  - You are trying to improve the chance that $smtp_server likes the name
>    your side identifies as; what does it have to do with your local
>    "mailhost" or "localhost" listening to the SMTP port?  These local MTA
>    may be configured for local-only delivery after all.

There is now explicit option to set the name with option --mail-domain.
Hope this address the issue.

    ** applies after the other two patches **

Jari

diff --git a/git-send-email.perl b/git-send-email.perl
index 6af7bd3..ef7cc30 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,7 @@ 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;			# See maildomain()
 
 sub unique_email_list(@);
 sub cleanup_compose_files();
@@ -274,6 +276,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 +837,48 @@ sub sanitize_address
 
 }
 
+# Returns the local Fully Qualified Domain Name (FQDN) if available,
+# If this is not given to EHLO, the receiving SMTP may deny connection
+# Here is an example of Net::SMTP without explicit Helo: it
+# uses by default "localhost.localdomain"
+#
+# Net::SMTP=GLOB(0x267ec28)>>> EHLO localhost.localdomain
+# Net::SMTP=GLOB(0x267ec28)<<< 550 EHLO argument does not match calling host
+
+sub maildomain
+{
+        return $MAIL_DOMAIN if $MAIL_DOMAIN;
+
+	my $maildomain;
+	eval "use Net::SMTP";
+
+	unless ( $@ ) {
+		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;
+			}
+		}
+	}
+
+	unless ($maildomain) {
+		eval "use Net::Domain";
+		unless ( $@ ) {
+		    my $domain = Net::Domain::domainname();
+		    $maildomain = $domain
+			    unless $^O eq 'darwin' && $domain =~ /\.local$/;
+		}
+	}
+
+	$MAIL_DOMAIN = $maildomain;
+}
+
 # Returns 1 if the message was sent, and 0 otherwise.
 # In actuality, the whole program dies when there
 # is an error sending a message.
@@ -917,6 +962,8 @@ X-Mailer: git-send-email $gitversion
 		}
 	}
 
+	my $maildomain;
+
 	if ($dry_run) {
 		# We don't want to send the email.
 	} elsif ($smtp_server =~ m#^/#) {
@@ -936,13 +983,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);
+			$maildomain = maildomain() || "localhost.localdomain";
+			$smtp ||= Net::SMTP::SSL->new($smtp_server,
+						      Hello => $maildomain,
+						      Port => $smtp_server_port);
 		}
 		else {
 			require Net::SMTP;
+			$maildomain = maildomain() || "localhost.localdomain";
 			$smtp ||= Net::SMTP->new((defined $smtp_server_port)
 						 ? "$smtp_server:$smtp_server_port"
 						 : $smtp_server,
+						 Hello => $maildomain,
 						 Debug => $debug_net_smtp);
 			if ($smtp_encryption eq 'tls' && $smtp) {
 				require Net::SMTP::SSL;
@@ -962,9 +1014,10 @@ X-Mailer: git-send-email $gitversion
 		}
 
 		if (!$smtp) {
-			die "Unable to initialize SMTP properly. Check config. ",
+			die "Unable to initialize SMTP properly. Check config and use --smtp-debug. ",
 			    "VALUES: server=$smtp_server ",
 			    "encryption=$smtp_encryption ",
+			    "maildomain=$maildomain",
 			    defined $smtp_server_port ? "port=$smtp_server_port" : "";
 		}
 
-- 
1.7.0

  reply	other threads:[~2010-03-13 23:57 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-03-10 15:57 [PATCH] Do not strip empty lines / trailing spaces from a commit message template Sebastian Schuberth
2010-03-11  8:12 ` Jeff King
2010-03-11  8:31   ` Jeff King
2010-03-11 20:46     ` Junio C Hamano
2010-03-11 22:46       ` Jeff King
2010-03-12  5:54         ` Junio C Hamano
2010-03-12 17:07       ` Sebastian Schuberth
2010-03-12 23:13         ` Junio C Hamano
2010-03-13 17:36           ` [PATCH] git-send-email.perl - Fix 550 EHLO argument does not match calling host Jari Aalto
2010-03-13 22:32             ` Junio C Hamano
2010-03-13 23:56               ` Jari Aalto [this message]
2010-03-14  6:28                 ` Junio C Hamano
2010-03-14 10:19                   ` Jari Aalto
2010-03-14 12:09                     ` Junio C Hamano
2010-03-14 14:55                       ` Jari Aalto
2010-03-14 14:59                       ` Jari Aalto
2010-03-14 10:21                   ` Jari Aalto
2010-03-14 11:55                     ` Junio C Hamano
2010-03-14 14:41                       ` Jari Aalto
2010-03-14 15:03                       ` Jari Aalto
2010-03-14 13:17                     ` Jakub Narebski
2010-03-14 14:52                       ` Jari Aalto
2010-03-14 15:15                     ` [PATCH 1/3] git-send-email.perl: improve error message in send_message() Jari Aalto
2010-03-14 15:16                     ` [PATCH 2/3] git-send-email.perl: add option --smtp-debug Jari Aalto
2010-03-14 15:16                     ` [PATCH 3/3] git-send-email.perl - Fix 550 EHLO argument does not match calling host Jari Aalto
2010-03-14 19:53                       ` Jakub Narebski
2010-03-14 20:20                         ` Jari Aalto
2010-03-14 20:33                         ` [PATCH] " Jari Aalto
  -- strict thread matches above, loose matches on Subject: below --
2010-03-12 20:07 [PATCH] git-send-email.perl: improve error message in send_message() Jari Aalto
2010-03-12 21:53 ` [PATCH] git-send-email.perl: add option --smtp-debug Jari Aalto
2010-03-12 23:04   ` [PATCH] git-send-email.perl - Fix 550 EHLO argument does not match calling host Jari Aalto

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87eijng4hy.fsf@jondo.cante.net \
    --to=jari.aalto@cante$(echo .)net \
    --cc=git@vger$(echo .)kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox