changeset 1830:4ac11e7fa11a

Fix mailer bug [SF#817470]... ...and add docstrings to prevent this from happening again.
author Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
date Sat, 04 Oct 2003 11:21:47 +0000
parents 4e4afbe3cd30
children 921c48ecb3f5
files roundup/cgi/client.py roundup/mailer.py roundup/mailgw.py roundup/roundupdb.py
diffstat 4 files changed, 35 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/roundup/cgi/client.py	Fri Oct 03 19:15:24 2003 +0000
+++ b/roundup/cgi/client.py	Sat Oct 04 11:21:47 2003 +0000
@@ -1,4 +1,4 @@
-# $Id: client.py,v 1.140 2003-09-24 14:53:58 jlgijsbers Exp $
+# $Id: client.py,v 1.141 2003-10-04 11:21:47 jlgijsbers Exp $
 
 __doc__ = """
 WWW request handler (also used in the stand-alone server).
@@ -773,7 +773,7 @@
    %(url)s?@action=confrego&otk=%(otk)s
 """ % {'name': props['username'], 'tracker': tracker_name, 'url': self.base,
        'otk': otk, 'tracker_email': tracker_email}
-        if not self.standard_message(props['address'], subject, body,
+        if not self.standard_message([props['address']], subject, body,
                                      tracker_email):
             return
 
@@ -878,7 +878,7 @@
 
 Your password is now: %(password)s
 '''%{'name': name, 'password': newpw}
-            if not self.standard_message(address, subject, body):
+            if not self.standard_message([address], subject, body):
                 return
 
             self.ok_message.append('Password reset and email sent to %s'%address)
@@ -921,7 +921,7 @@
 
 You should then receive another email with the new password.
 '''%{'name': name, 'tracker': tracker_name, 'url': self.base, 'otk': otk}
-        if not self.standard_message(address, subject, body):
+        if not self.standard_message([address], subject, body):
             return
 
         self.ok_message.append('Email sent to %s'%address)
--- a/roundup/mailer.py	Fri Oct 03 19:15:24 2003 +0000
+++ b/roundup/mailer.py	Sat Oct 04 11:21:47 2003 +0000
@@ -1,5 +1,5 @@
 """Sending Roundup-specific mail over SMTP."""
-# $Id: mailer.py,v 1.2 2003-09-08 21:08:59 jlgijsbers Exp $
+# $Id: mailer.py,v 1.3 2003-10-04 11:21:47 jlgijsbers Exp $
 
 import time, quopri, os, socket, smtplib, re
 
@@ -27,7 +27,7 @@
         message = StringIO()
         writer = MimeWriter(message)
         writer.addheader('Subject', encode_header(subject))
-        writer.addheader('To', to)
+        writer.addheader('To', ', '.join(to))
         writer.addheader('From', author)
         writer.addheader('Date', time.strftime("%a, %d %b %Y %H:%M:%S +0000",
                                                time.gmtime()))
@@ -42,6 +42,14 @@
         return message, writer
 
     def standard_message(self, to, subject, content, author=None):
+        """Send a standard message.
+
+        Arguments:
+        - to: a list of addresses usable by rfc822.parseaddr().
+        - subject: the subject as a string.
+        - content: the body of the message as a string.
+        - author: the sender as a string, suitable for a 'From:' header.
+        """
         message, writer = self.get_standard_message(to, subject, author)
 
         writer.addheader('Content-Transfer-Encoding', 'quoted-printable')
@@ -53,7 +61,16 @@
        
     def bounce_message(self, bounced_message, to, error,
                        subject='Failed issue tracker submission'):
-        message, writer = self.get_standard_message(', '.join(to), subject)
+        """Bounce a message, attaching the failed submission.
+
+        Arguments:
+        - bounced_message: an RFC822 Message object.
+        - to: a list of addresses usable by rfc822.parseaddr().
+        - error: the reason of failure as a string.
+        - subject: the subject as a string.
+        
+        """
+        message, writer = self.get_standard_message(to, subject)
 
         part = writer.startmultipartbody('mixed')
         part = writer.nextpart()
@@ -83,6 +100,12 @@
         self.smtp_send(to, message)
         
     def smtp_send(self, to, message):
+        """Send a message over SMTP, using roundup's config.
+
+        Arguments:
+        - to: a list of addresses usable by rfc822.parseaddr().
+        - message: a StringIO instance with a full message.
+        """
         if self.debug:
             # don't send - just write to a file
             open(self.debug, 'a').write('FROM: %s\nTO: %s\n%s\n' %
@@ -95,7 +118,7 @@
                 # send the message as admin so bounces are sent there
                 # instead of to roundup
                 smtp = SMTPConnection(self.config)
-                smtp.sendmail(self.config.ADMIN_EMAIL, [to],
+                smtp.sendmail(self.config.ADMIN_EMAIL, to,
                               message.getvalue())
             except socket.error, value:
                 raise MessageSendError("Error: couldn't send email: "
--- a/roundup/mailgw.py	Fri Oct 03 19:15:24 2003 +0000
+++ b/roundup/mailgw.py	Sat Oct 04 11:21:47 2003 +0000
@@ -73,7 +73,7 @@
 an exception, the original message is bounced back to the sender with the
 explanatory message given in the exception. 
 
-$Id: mailgw.py,v 1.132 2003-09-08 21:27:16 jlgijsbers Exp $
+$Id: mailgw.py,v 1.133 2003-10-04 11:21:47 jlgijsbers Exp $
 """
 
 import string, re, os, mimetools, cStringIO, smtplib, socket, binascii, quopri
@@ -440,7 +440,7 @@
                     self.db.confirm_registration(otk.group('otk'))
                     subject = 'Your registration to %s is complete' % \
                               self.instance.config.TRACKER_NAME
-                    sendto = message.getaddrlist('from')[0][1]
+                    sendto = [message.getheader('from')]
                     self.mailer.standard_message(sendto, subject, '') 
                     return
                 elif hasattr(self.instance.config, 'MAIL_DEFAULT_CLASS') and \
--- a/roundup/roundupdb.py	Fri Oct 03 19:15:24 2003 +0000
+++ b/roundup/roundupdb.py	Sat Oct 04 11:21:47 2003 +0000
@@ -15,7 +15,7 @@
 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 # 
-# $Id: roundupdb.py,v 1.91 2003-09-16 16:12:38 kedder Exp $
+# $Id: roundupdb.py,v 1.92 2003-10-04 11:21:47 jlgijsbers Exp $
 
 __doc__ = """
 Extending hyperdb with types specific to issue-tracking.
@@ -288,8 +288,7 @@
 
         # create the message
         mailer = Mailer(self.db.config)
-        message, writer = mailer.get_standard_message(', '.join(sendto),
-                                                      subject, author)
+        message, writer = mailer.get_standard_message(sendto, subject, author)
 
         tracker_name = encode_header(self.db.config.TRACKER_NAME)
         writer.addheader('Reply-To', straddr((tracker_name, from_address)))

Roundup Issue Tracker: http://roundup-tracker.org/