[Zope] problem with MailHost

Stephen Pitts smpitts@midsouth.rr.com
Mon, 7 Feb 2000 19:49:07 -0600


--xHFwDpU9dbj6ez1V
Content-Type: text/plain; charset=us-ascii

> Does anyone have any ideas? Should I not be using the POP server?
pop.albq.uswest.net seems to have an open SMTP port, so it should work
fine.

Try my patch to the MailHost code, and see if it makes things even
better. I'm going to make this into a HOWTO soon, I promise! 
-- 
Stephen Pitts
smpitts@midsouth.rr.com
webmaster - http://www.mschess.org

--xHFwDpU9dbj6ez1V
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="mailhost.smtplib.patch"

Only in lib/python/Products/MailHost/: .MailHost.py.swp
diff -ru ../Zope-2.1.2-src/lib/python/Products/MailHost/MailHost.py lib/python/Products/MailHost/MailHost.py
--- ../Zope-2.1.2-src/lib/python/Products/MailHost/MailHost.py	Wed Nov  3 08:42:15 1999
+++ lib/python/Products/MailHost/MailHost.py	Sun Jan 23 18:14:56 2000
@@ -85,7 +85,7 @@
 """SMTP mail objects"""
 
 from Globals import Persistent, HTMLFile, HTML, MessageDialog
-from socket import *; from select import select
+from smtplib import SMTP
 from AccessControl.Role import RoleManager
 from operator import truth
 import Acquisition, sys, string, types, mimetools
@@ -98,15 +98,13 @@
 smtpError = "SMTP Error"
 MailHostError = "MailHost Error"
 
-addForm=HTMLFile('addMailHost_form', globals(), localhost=gethostname())
-def add(self, id, title='', smtp_host=None, 
-        localhost='localhost', smtp_port=25, timeout=1.0, REQUEST=None):
+addForm=HTMLFile('addMailHost_form', globals())
+def add(self, id, title='', smtp_host=None, smtp_port=25, REQUEST=None):
     ' add a MailHost into the system '
     i=MailHost()            #create new mail host
     i.id=id                 #give it id
     i.title=title           #title
-    i._init(localHost=localhost, smtpHost=smtp_host, smtpPort=smtp_port,
-            timeout=timeout)
+    i._init(smtpHost=smtp_host, smtpPort=smtp_port)
     self._setObject(id,i)   #register it
     if REQUEST: return self.manage_main(self,REQUEST)
 
@@ -136,20 +134,15 @@
         'nothing yet'
         pass
 
-    def _init(self, localHost, smtpHost, smtpPort, timeout=1):
-        self.localHost=localHost
+    def _init(self, smtpHost, smtpPort):
         self.smtpHost=smtpHost
         self.smtpPort=smtpPort
-        self.timeout=timeout
 
-    def manage_makeChanges(self,title,localHost,smtpHost,smtpPort,
-                           timeout, REQUEST=None):
+    def manage_makeChanges(self,title,smtpHost,smtpPort, REQUEST=None):
         'make the changes'
         self.title=title
-        self.localHost=localHost
         self.smtpHost=smtpHost
         self.smtpPort=smtpPort
-        self.timeout=timeout
         if REQUEST: return MessageDialog(
             title  ='Changed %s' % self.__name__,
             message='%s has been updated' % self.id,
@@ -163,18 +156,15 @@
         mtemplate = getattr(self, messageTemplate)
         messageText = mtemplate(self, trueself.REQUEST)
         messageText=_encode(messageText, encode)
-        headers, message = decapitate(messageText)
+        headers = extractheaders(messageText)
         if mto: headers['to'] = mto
         if mfrom: headers['from'] = mfrom
         for requiredHeader in ('to', 'from'):
             if not headers.has_key(requiredHeader):
                 raise MailHostError,"Message missing SMTP Header '%s'"\
                       % requiredHeader
-        Send(trueself.smtpHost, trueself.smtpPort, 
-             trueself.localHost, trueself.timeout, 
-             headers['from'], headers['to'],
-             headers['subject'] or 'No Subject', messageText
-             )
+		mailserver = SMTP(trueself.smtpHost, trueself.smtpPort)
+		mailserver.sendmail(headers['from'], headers['to'], messageText)
 
         if not statusTemplate: return "SEND OK"
 
@@ -186,7 +176,7 @@
 
     def send(self, messageText, mto=None, mfrom=None, subject=None,
              encode=None):
-        headers, message = decapitate(messageText)
+        headers = extractheaders(messageText)
         
         if not headers['subject']:
             messageText="subject: %s\n%s" % (subject or '[No Subject]',
@@ -203,14 +193,12 @@
                 raise MailHostError,"Message missing SMTP Header '%s'"\
                 % requiredHeader
         messageText=_encode(messageText, encode)
-        sm=SendMail(self.smtpHost, self.smtpPort, self.localHost, self.timeout)
-        sm.send(mfrom=headers['from'], mto=headers['to'],
-                subj=headers['subject'] or 'No Subject',
-                body=messageText)
+        smtpserver = SMTP(self.smtpHost, self.smtpPort)
+        smtpserver.sendmail(headers['from'],headers['to'], messageText)
 
     def scheduledSend(self, messageText, mto=None, mfrom=None, subject=None,
                       encode=None):
-        headers, message = decapitate(messageText)
+        headers = extractheaders(messageText)
 
         if not headers['subject']:
             messageText="subject: %s\n%s" % (subject or '[No Subject]',
@@ -227,91 +215,17 @@
                 raise MailHostError,"Message missing SMTP Header '%s'"\
                 % requiredHeader
         messageText=_encode(messageText, encode)
-        Send(self.smtpHost, self.smtpPort, self.localHost, self.timeout,
-             headers['from'], headers['to'],
-             headers['subject'] or 'No Subject', messageText
-             )
+        smtpserver = SMTP(self.smtpHost, self.smtpPort)
+        smtpserver.sendmail(headers['from'], headers['to'], messageText)
 
     def simple_send(self, mto, mfrom, subject, body):
-        body="subject: %s\n\n%s" % (subject, body)
-        SendMail(self.smtpHost, self.smtpPort, self.localHost,
-                 self.timeout).send( 
-                     mfrom=mfrom, mto=mto, subj=subject, body=body
-                     )
+        body="from: %s\nto: %s\nsubject: %s\n\n%s" % (mfrom, mto, subject, body)
+        mailserver = SMTP(self.smtphost, self.smtpport)
+        mailserver.sendmail(mfrom, mto, body)
 
 class MailHost(Persistent, MailBase):
     "persistent version"
 
-def Send(host, port, localhost, timeout, from_, to, subject, body):
-    SendMail(host, port, localhost, timeout).send(from_, to, subject, body)
-        
-class SendMail:
-    singledots=re.compile('^\.$', re.M)
-    
-    def __init__(self, smtpHost, smtpPort, localHost="localhost", timeout=1):
-        self.conn = socket(AF_INET, SOCK_STREAM)
-        self.conn.connect(smtpHost, smtpPort)
-        self.timeout=timeout
-        self.fd=self.conn.fileno()
-        self.conn.send("helo "+localHost+"\015\012")
-        while 1:
-            if not self._check(): break
-
-    def __del__(self):
-        self._close()
-
-    def getLine(self):
-        line=''
-        tm=self.timeout
-        while 1:
-            if not select([self.fd],[],[],tm)[0]:       #check the socket
-                break
-            data=self.conn.recv(1)
-            if (not data) or (data == '\n'):
-                break
-            line=line+data
-        return line
-
-    def _check(self, lev='250'):
-        line = self.getLine()
-        if not line: return 0
-        try:
-            code=string.atoi(line[:3])
-        except:
-            raise smtpError, \
-                  "Cannot convert line from SMTP: %s" % line
-        if code > 400:
-            raise smtpError, \
-                  "Recieved error code %s from SMTP: %s"\
-                  % (code, line)
-        return 1
-
-    def send(self, mfrom, mto, subj='No Subject', body='Blank Message'):
-        self.conn.send("mail from:<%s>\015\012" % mfrom)
-        self._check()
-        if type(mto) in [types.ListType, types.TupleType]:
-            for person in mto:
-                self.conn.send("rcpt to:<%s>\015\012" % person)
-                self._check()
-        else:
-            self.conn.send("rcpt to:<%s>\015\012" % mto)
-            self._check()
-        self.conn.send("data\015\012")
-        self._check()
-        body=self.singledots.sub('..', body)
-        body=string.replace(body, '\r\n', '\n')
-        body=string.replace(body, '\r', '\n')
-        body=string.replace(body, '\n', '\015\012')
-        self.conn.send(body)
-        self.conn.send("\015\012.\015\012")
-        self._check('354')
-
-    def _close(self):
-        self.conn.send("quit\015\012")
-        self.conn.close()
-
-
-
 def _encode(body, encode=None):
     if encode is None:
         return body
@@ -329,8 +243,8 @@
     return newmfile.getvalue()
 
 
-def decapitate(message):
-    # split message into headers / body
+def extractheaders(message):
+    # return headers of message
     mfile=StringIO(message)
     mo=rfc822.Message(mfile)
 
@@ -345,5 +259,4 @@
     
     hd['from']=mo.getaddr('from')[1]
     hd['subject']=mo.getheader('subject') or "No Subject"
-
-    return hd, mfile.read()
+    return hd
Only in lib/python/Products/MailHost/: MailHost.pyc
Only in lib/python/Products/MailHost/: SendMailTag.pyc
Only in lib/python/Products/MailHost/: __init__.pyc
diff -ru ../Zope-2.1.2-src/lib/python/Products/MailHost/addMailHost_form.dtml lib/python/Products/MailHost/addMailHost_form.dtml
--- ../Zope-2.1.2-src/lib/python/Products/MailHost/addMailHost_form.dtml	Wed Nov  3 12:56:32 1999
+++ lib/python/Products/MailHost/addMailHost_form.dtml	Sun Jan 23 18:11:55 2000
@@ -36,12 +36,6 @@
   </TD>
 </TR>
 <TR VALIGN="TOP">
-  <TH ALIGN="LEFT">Local Host</TH>
-  <TD ALIGN="LEFT">
-    <INPUT TYPE="TEXT" NAME="localhost" SIZE="40" VALUE="<dtml-var localhost html_quote>">
-  </TD>
-</TR>
-<TR VALIGN="TOP">
   <TH ALIGN="LEFT">SMTP Host</TH>
   <TD ALIGN="LEFT">
     <INPUT TYPE="TEXT" NAME="smtp_host" SIZE="40">
@@ -51,12 +45,6 @@
   <TH ALIGN="LEFT">SMTP Port</TH>
   <TD ALIGN="LEFT">
     <INPUT TYPE="TEXT" NAME="smtp_port:int" SIZE="4" VALUE="25">
-  </TD>
-</TR>
-<TR VALIGN="TOP">
-  <TH ALIGN="LEFT">Max. Timeout</TH>
-  <TD ALIGN="LEFT">
-    <INPUT TYPE="TEXT" NAME="timeout:float" SIZE="4" VALUE="1">
   </TD>
 </TR>
 <TR VALIGN="TOP">
diff -ru ../Zope-2.1.2-src/lib/python/Products/MailHost/manageMailHost.dtml lib/python/Products/MailHost/manageMailHost.dtml
--- ../Zope-2.1.2-src/lib/python/Products/MailHost/manageMailHost.dtml	Wed Nov  3 12:56:32 1999
+++ lib/python/Products/MailHost/manageMailHost.dtml	Sun Jan 23 18:14:29 2000
@@ -19,12 +19,6 @@
   </TD>
 </TR>
 <TR VALIGN="TOP">
-  <TH ALIGN="LEFT">Local Host</TH>
-  <TD ALIGN="LEFT">
-    <INPUT TYPE="TEXT" NAME="localHost" SIZE="40" VALUE="<dtml-var localHost html_quote>">
-  </TD>
-</TR>
-<TR VALIGN="TOP">
   <TH ALIGN="LEFT">SMTP Host</TH>
   <TD ALIGN="LEFT">
     <INPUT TYPE="TEXT" NAME="smtpHost" SIZE="40" VALUE="<dtml-var smtpHost html_quote>">
@@ -35,12 +29,6 @@
   <TD ALIGN="LEFT">
     <INPUT TYPE="TEXT" NAME="smtpPort:int" SIZE="4" VALUE="<dtml-var smtpPort html_quote>">
   </TD>
-</TR>
-<TR VALIGN="TOP">
- <TH ALIGN="LEFT">Max. Timeout</TH>
- <TD ALIGN="LEFT">
-   <INPUT TYPE="TEXT" NAME="timeout:float" SIZE="4" VALUE="<dtml-var timeout html_quote>">
- </TD>
 </TR>
 
 <TR VALIGN="TOP">

--xHFwDpU9dbj6ez1V--