mirror of https://github.com/python/cpython
Patch #957003: Implement smtplib.LMTP.
This commit is contained in:
parent
fd61107e7a
commit
1190a38d33
|
@ -41,6 +41,23 @@ are also optional, and can contain a PEM formatted private key and
|
||||||
certificate chain file for the SSL connection.
|
certificate chain file for the SSL connection.
|
||||||
\end{classdesc}
|
\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:
|
A nice selection of exceptions is defined as well:
|
||||||
|
|
||||||
\begin{excdesc}{SMTPException}
|
\begin{excdesc}{SMTPException}
|
||||||
|
|
|
@ -226,6 +226,7 @@ class SMTP:
|
||||||
debuglevel = 0
|
debuglevel = 0
|
||||||
file = None
|
file = None
|
||||||
helo_resp = None
|
helo_resp = None
|
||||||
|
ehlo_msg = "ehlo"
|
||||||
ehlo_resp = None
|
ehlo_resp = None
|
||||||
does_esmtp = 0
|
does_esmtp = 0
|
||||||
|
|
||||||
|
@ -401,7 +402,7 @@ class SMTP:
|
||||||
host.
|
host.
|
||||||
"""
|
"""
|
||||||
self.esmtp_features = {}
|
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()
|
(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
|
||||||
|
@ -746,6 +747,50 @@ class SMTP_SSL(SMTP):
|
||||||
self.sock = SSLFakeSocket(self.sock, sslobj)
|
self.sock = SSLFakeSocket(self.sock, sslobj)
|
||||||
self.file = SSLFakeFile(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.
|
# Test the sendmail method, which tests most of the others.
|
||||||
# Note: This always sends to localhost.
|
# Note: This always sends to localhost.
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
|
@ -152,6 +152,8 @@ Core and builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Patch #957003: Implement smtplib.LMTP.
|
||||||
|
|
||||||
- Patch #1481079: add support for HTTP_REFERER to CGIHTTPServer.
|
- Patch #1481079: add support for HTTP_REFERER to CGIHTTPServer.
|
||||||
|
|
||||||
- Bug #1115886: os.path.splitext('.cshrc') gives now ('.cshrc', '').
|
- Bug #1115886: os.path.splitext('.cshrc') gives now ('.cshrc', '').
|
||||||
|
|
Loading…
Reference in New Issue