From a9499a6d033556980ceed799ebd0313275ca63d2 Mon Sep 17 00:00:00 2001 From: jlgijsbers Date: Sat, 4 Oct 2003 11:21:47 +0000 Subject: [PATCH] Fix mailer (sf bug #817470) and add docstrings to prevent this from happening again. git-svn-id: http://svn.roundup-tracker.org/svnroot/roundup/trunk@1897 57a73879-2fb5-44c3-a270-3262357dd7e2 --- roundup/cgi/client.py | 8 ++++---- roundup/mailer.py | 31 +++++++++++++++++++++++++++---- roundup/mailgw.py | 4 ++-- roundup/roundupdb.py | 5 ++--- 4 files changed, 35 insertions(+), 13 deletions(-) diff --git a/roundup/cgi/client.py b/roundup/cgi/client.py index 575344c..d4499bb 100644 --- a/roundup/cgi/client.py +++ b/roundup/cgi/client.py @@ -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 @@ reply's additional "Re:" is ok), %(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 @@ The password has been reset for username "%(name)s". 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 @@ the link below: 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) diff --git a/roundup/mailer.py b/roundup/mailer.py index 0028618..6d9e6c8 100644 --- a/roundup/mailer.py +++ b/roundup/mailer.py @@ -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 @@ class Mailer: 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 @@ class Mailer: 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 @@ class Mailer: 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 @@ class Mailer: 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 @@ class Mailer: # 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: " diff --git a/roundup/mailgw.py b/roundup/mailgw.py index 23e2943..8ec27fe 100644 --- a/roundup/mailgw.py +++ b/roundup/mailgw.py @@ -73,7 +73,7 @@ are calling the create() method to create a new node). If an auditor raises 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 @@ Emails to Roundup trackers must include a Subject: line! 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 \ diff --git a/roundup/roundupdb.py b/roundup/roundupdb.py index 7edc5af..953b419 100644 --- a/roundup/roundupdb.py +++ b/roundup/roundupdb.py @@ -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 @@ class IssueClass: # 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))) -- 2.30.2