Patch #957003: Implement smtplib.LMTP.

This commit is contained in:
Martin v. Löwis 2007-03-09 15:35:55 +00:00
parent fd61107e7a
commit 1190a38d33
3 changed files with 65 additions and 1 deletions

View File

@ -41,6 +41,23 @@ are also optional, and can contain a PEM formatted private key and
certificate chain file for the SSL connection.
\end{classdesc}
\begin{classdesc}{LMTP}{\optional{host\optional{, port\optional{,
local_hostname}}}}
The LMTP protocol, which is very similar to ESMTP, is heavily based
on the standard SMTP client. It's common to use Unix sockets for LMTP,
so our connect() method must support that as well as a regular
host:port server. To specify a Unix socket, you must use an absolute
path for \var{host}, starting with a '/'.
Authentication is supported, using the regular SMTP mechanism. When
using a Unix socket, LMTP generally don't support or require any
authentication, but your mileage might vary.
\versionadded{2.6}
\end{classdesc}
A nice selection of exceptions is defined as well:
\begin{excdesc}{SMTPException}

View File

@ -226,6 +226,7 @@ class SMTP:
debuglevel = 0
file = None
helo_resp = None
ehlo_msg = "ehlo"
ehlo_resp = None
does_esmtp = 0
@ -401,7 +402,7 @@ class SMTP:
host.
"""
self.esmtp_features = {}
self.putcmd("ehlo", name or self.local_hostname)
self.putcmd(self.ehlo_msg, name or self.local_hostname)
(code,msg)=self.getreply()
# According to RFC1869 some (badly written)
# MTA's will disconnect on an ehlo. Toss an exception if
@ -746,6 +747,50 @@ class SMTP_SSL(SMTP):
self.sock = SSLFakeSocket(self.sock, sslobj)
self.file = SSLFakeFile(sslobj)
#
# LMTP extension
#
LMTP_PORT = 2003
class LMTP(SMTP):
"""LMTP - Local Mail Transfer Protocol
The LMTP protocol, which is very similar to ESMTP, is heavily based
on the standard SMTP client. It's common to use Unix sockets for LMTP,
so our connect() method must support that as well as a regular
host:port server. To specify a Unix socket, you must use an absolute
path as the host, starting with a '/'.
Authentication is supported, using the regular SMTP mechanism. When
using a Unix socket, LMTP generally don't support or require any
authentication, but your mileage might vary."""
ehlo_msg = "lhlo"
def __init__(self, host = '', port = LMTP_PORT, local_hostname = None):
"""Initialize a new instance."""
SMTP.__init__(self, host, port, local_hostname)
def connect(self, host='localhost', port = 0):
"""Connect to the LMTP daemon, on either a Unix or a TCP socket."""
if host[0] == '/':
try:
self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
self.sock.connect(host)
except socket.error, msg:
if self.debuglevel > 0: print 'connect fail:', host
if self.sock:
self.sock.close()
self.sock = None
if not self.sock:
raise socket.error, msg
(code, msg) = self.getreply()
if self.debuglevel > 0: print "connect:", msg
return (code, msg)
else:
return SMTP.connect(self, host, port)
# Test the sendmail method, which tests most of the others.
# Note: This always sends to localhost.
if __name__ == '__main__':

View File

@ -152,6 +152,8 @@ Core and builtins
Library
-------
- Patch #957003: Implement smtplib.LMTP.
- Patch #1481079: add support for HTTP_REFERER to CGIHTTPServer.
- Bug #1115886: os.path.splitext('.cshrc') gives now ('.cshrc', '').