Commit 7bc82bb1 authored by Peter Schneider-Kamp's avatar Peter Schneider-Kamp

add better algorithm to get fully qualified domain name for localhost

in smtplib.ehlo() and smtplib.helo().

closes patch #101103
closes bug   #110935
parent 10e1bf2f
...@@ -98,7 +98,6 @@ class SMTPRecipientsRefused(SMTPException): ...@@ -98,7 +98,6 @@ class SMTPRecipientsRefused(SMTPException):
self.args = ( recipients,) self.args = ( recipients,)
class SMTPDataError(SMTPResponseException): class SMTPDataError(SMTPResponseException):
"""The SMTP server didn't accept the data.""" """The SMTP server didn't accept the data."""
...@@ -108,6 +107,7 @@ class SMTPConnectError(SMTPResponseException): ...@@ -108,6 +107,7 @@ class SMTPConnectError(SMTPResponseException):
class SMTPHeloError(SMTPResponseException): class SMTPHeloError(SMTPResponseException):
"""The server refused our HELO reply.""" """The server refused our HELO reply."""
def quoteaddr(addr): def quoteaddr(addr):
"""Quote a subset of the email addresses defined by RFC 821. """Quote a subset of the email addresses defined by RFC 821.
...@@ -133,6 +133,24 @@ def quotedata(data): ...@@ -133,6 +133,24 @@ def quotedata(data):
return re.sub(r'(?m)^\.', '..', return re.sub(r'(?m)^\.', '..',
re.sub(r'(?:\r\n|\n|\r(?!\n))', CRLF, data)) re.sub(r'(?:\r\n|\n|\r(?!\n))', CRLF, data))
def _get_fqdn_hostname(name):
name = string.strip(name)
if len(name) == 0:
name = socket.gethostname()
try:
hostname, aliases, ipaddrs = socket.gethostbyaddr(name)
except socket.error:
pass
else:
aliases.insert(0, hostname)
for name in aliases:
if '.' in name:
break
else:
name = hostname
return name
class SMTP: class SMTP:
"""This class manages a connection to an SMTP or ESMTP server. """This class manages a connection to an SMTP or ESMTP server.
SMTP Objects: SMTP Objects:
...@@ -288,14 +306,7 @@ class SMTP: ...@@ -288,14 +306,7 @@ class SMTP:
Hostname to send for this command defaults to the FQDN of the local Hostname to send for this command defaults to the FQDN of the local
host. host.
""" """
name=string.strip(name) self.putcmd("helo", _get_fqdn_hostname(name))
if len(name)==0:
name = socket.gethostname()
try:
name = socket.gethostbyaddr(name)[0]
except socket.error:
pass
self.putcmd("helo",name)
(code,msg)=self.getreply() (code,msg)=self.getreply()
self.helo_resp=msg self.helo_resp=msg
return (code,msg) return (code,msg)
...@@ -305,14 +316,7 @@ class SMTP: ...@@ -305,14 +316,7 @@ class SMTP:
Hostname to send for this command defaults to the FQDN of the local Hostname to send for this command defaults to the FQDN of the local
host. host.
""" """
name=string.strip(name) self.putcmd("ehlo", _get_fqdn_hostname(name))
if len(name)==0:
name = socket.gethostname()
try:
name = socket.gethostbyaddr(name)[0]
except socket.error:
pass
self.putcmd("ehlo",name)
(code,msg)=self.getreply() (code,msg)=self.getreply()
# According to RFC1869 some (badly written) # According to RFC1869 some (badly written)
# MTA's will disconnect on an ehlo. Toss an exception if # MTA's will disconnect on an ehlo. Toss an exception if
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment