]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Patch #957003: Implement smtplib.LMTP.
authorMartin v. Löwis <martin@v.loewis.de>
Fri, 9 Mar 2007 15:35:55 +0000 (15:35 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Fri, 9 Mar 2007 15:35:55 +0000 (15:35 +0000)
Doc/lib/libsmtplib.tex
Lib/smtplib.py
Misc/NEWS

index e0567e6c06405b96bd8c8b190829f43803e30db4..f7b809847567757ff5da7707b842dd208e6b8d11 100644 (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}
index a5c82a8523914afd3a33ce2f39e3724f3f19ce70..5f70b10dddd25b3cab24a39f1add3ec6845bfa3c 100755 (executable)
@@ -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__':
index dd25cbd420998b17bbdab8a9714819664861a353..635b2c40e52d217a5c5426ce1d23166d5b92afcc 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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', '').