pkg_upload.cygpart(__pkg_announce): added perl code to embedded perl
script for email domain FQDN copied from git send-email with minor hooks
---
 lib/pkg_upload.cygpart | 51 +++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 50 insertions(+), 1 deletion(-)

diff --git a/lib/pkg_upload.cygpart b/lib/pkg_upload.cygpart
index f88525d..06024b4 100644
--- a/lib/pkg_upload.cygpart
+++ b/lib/pkg_upload.cygpart
@@ -168,6 +168,7 @@ EOF
        echo "Upload complete."
 }
 
+
 __pkg_announce() {
        local msg=$(mktemp -t cygwin-announce-${PF}.XXXXXX)
        local msgat=$(date +@%s)
@@ -198,7 +199,52 @@ _EOF
 
        ${EDITOR:-vi} $msg || error "Editor exited abormally, aborting 
annoucement"
 
+# FQDN from git send-email
+# 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 receiving 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 ()
+
        perl <(cat <<EOF
+sub valid_fqdn {
+       my \$domain = shift;
+       return defined \$domain && !(\$^O eq 'darwin' && \$domain =~ 
/\.local\$/) && \$domain =~ /\./;
+}
+sub maildomain_net {
+    use Net::Domain ();
+       my \$maildomain;
+       my \$domain = Net::Domain::domainname();
+       \$maildomain = \$domain if valid_fqdn(\$domain);
+       return \$maildomain;
+}
+sub maildomain_mta {
+       my \$maildomain;
+       for my \$host (qw(mailhost localhost)) {
+               my \$smtp = Net::SMTP->new(\$host);
+               if (defined \$smtp) {
+                       my \$domain = \$smtp->domain;
+                       \$smtp->quit;
+                       \$maildomain = \$domain if valid_fqdn(\$domain);
+                       last if \$maildomain;
+               }
+       }
+       return \$maildomain;
+}
+sub maildomain {
+       return maildomain_net() || maildomain_mta() || 'localhost.localdomain';
+}
+
 use strict;
 use MIME::Parser;
 use Net::SMTP;
@@ -214,7 +260,9 @@ my \$entity = \$parser->parse_open("$msg");
 
 print "Sending announcement of ${NAME}-${PVR} via \$smtp_server\n";
 
+my \$smtp_domain ||= maildomain();  # get FQDN and add Hello below
 my \$smtp = new Net::SMTP(\$smtp_server,
+                         Hello => \$smtp_domain,
                          ${SMTP_SERVER_PORT+Port => ${SMTP_SERVER_PORT},}
                          SSL => \$smtp_encryption eq 'ssl')
         or die "No mailserver at ".\$smtp_server;
@@ -224,7 +272,8 @@ if (\$smtp_encryption eq 'tls') {
        \$smtp->response();
        \$smtp->code == 220 or die "$server does not support STARTTLS";
        \$smtp = Net::SMTP::SSL->start_SSL(\$smtp) or die "STARTTLS failed";
-       \$smtp->hello(\$smtp_server);
+       # Send EHLO again to receive fresh supported commands
+       \$smtp->hello(\$smtp_domain);
 }
 if (defined \$smtp_user) {
        use Authen::SASL qw(Perl);
-- 
2.27.0

Reply via email to