add better algorithm to get fully qualified domain name for localhost

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

closes patch #101103
closes bug   #110935
This commit is contained in:
Peter Schneider-Kamp 2000-08-10 14:02:23 +00:00
parent 10e1bf2f64
commit 7bc82bb1f0

View file

@ -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):
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):
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:
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:
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