annotate roundup/mailer.py @ 2077:3e0961d6d44d

Added the "actor" property. Metakit backend not done (still not confident I know how it's supposed to work ;) Currently it will come up as NULL in the RDBMS backends for older items. The *dbm backends will look up the journal. I hope to remedy the former before 0.7's release. Fixed a bunch of migration issues in the rdbms backends while I was at it (index changes for key prop changes) and simplified the class table update code for RDBMSes that have "alter table" in their command set (ie. not sqlite) ... migration from "version 1" to "version 2" still hasn't actually been tested yet though.
author Richard Jones <richard@users.sourceforge.net>
date Mon, 15 Mar 2004 05:50:20 +0000
parents 48600089c73d
children 95da13c1bdbd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1981
diff changeset
1 """Sending Roundup-specific mail over SMTP.
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1981
diff changeset
2 """
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1981
diff changeset
3 __docformat__ = 'restructuredtext'
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
4 # $Id: mailer.py,v 1.7 2004-02-29 00:35:55 richard Exp $
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
5
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
6 import time, quopri, os, socket, smtplib, re
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
7
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
8 from cStringIO import StringIO
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
9 from MimeWriter import MimeWriter
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
10
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
11 from roundup.rfc2822 import encode_header
1981
ce6806a2a72d add roundup version to mailer headers
Richard Jones <richard@users.sourceforge.net>
parents: 1830
diff changeset
12 from roundup import __version__
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
13
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
14 class MessageSendError(RuntimeError):
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
15 pass
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
16
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
17 class Mailer:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
18 """Roundup-specific mail sending."""
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
19 def __init__(self, config):
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
20 self.config = config
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
21
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
22 # set to indicate to roundup not to actually _send_ email
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
23 # this var must contain a file to write the mail to
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
24 self.debug = os.environ.get('SENDMAILDEBUG', '')
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
25
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
26 def get_standard_message(self, to, subject, author=None):
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
27 '''Form a standard email message from Roundup.
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
28
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
29 "to" - recipients list
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
30 "subject" - Subject
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
31 "author" - (name, address) tuple or None for admin email
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
32
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
33 Subject and author are encoded using the EMAIL_CHARSET from the
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
34 config (default UTF-8).
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
35
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
36 Returns a Message object and body part writer.
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
37 '''
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
38 # encode header values if they need to be
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
39 charset = getattr(self.config, 'EMAIL_CHARSET', 'utf-8')
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
40 tracker_name = self.config.TRACKER_NAME
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
41 if charset != 'utf-8':
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
42 tracker = unicode(tracker_name, 'utf-8').encode(charset)
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
43 if not author:
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
44 author = straddr((tracker_name, self.config.ADMIN_EMAIL))
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
45 else:
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
46 name = author[0]
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
47 if charset != 'utf-8':
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
48 name = unicode(name, 'utf-8').encode(charset)
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
49 author = straddr((encode_header(name, charset), author[1]))
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
50
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
51 message = StringIO()
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
52 writer = MimeWriter(message)
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
53 writer.addheader('Subject', encode_header(subject, charset))
1830
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
54 writer.addheader('To', ', '.join(to))
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
55 writer.addheader('From', author)
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
56 writer.addheader('Date', time.strftime("%a, %d %b %Y %H:%M:%S +0000",
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
57 time.gmtime()))
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
58
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
59 # Add a unique Roundup header to help filtering
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
60 writer.addheader('X-Roundup-Name', encode_header(tracker_name,
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
61 charset))
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
62 # and another one to avoid loops
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
63 writer.addheader('X-Roundup-Loop', 'hello')
1981
ce6806a2a72d add roundup version to mailer headers
Richard Jones <richard@users.sourceforge.net>
parents: 1830
diff changeset
64 # finally, an aid to debugging problems
ce6806a2a72d add roundup version to mailer headers
Richard Jones <richard@users.sourceforge.net>
parents: 1830
diff changeset
65 writer.addheader('X-Roundup-Version', __version__)
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
66
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
67 writer.addheader('MIME-Version', '1.0')
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
68
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
69 return message, writer
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
70
1803
ee33ce4987f5 Let standard_message accept a different author.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1799
diff changeset
71 def standard_message(self, to, subject, content, author=None):
1830
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
72 """Send a standard message.
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
73
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
74 Arguments:
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
75 - to: a list of addresses usable by rfc822.parseaddr().
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
76 - subject: the subject as a string.
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
77 - content: the body of the message as a string.
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
78 - author: the sender as a (name, address) tuple
1830
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
79 """
1803
ee33ce4987f5 Let standard_message accept a different author.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1799
diff changeset
80 message, writer = self.get_standard_message(to, subject, author)
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
81
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
82 writer.addheader('Content-Transfer-Encoding', 'quoted-printable')
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
83 body = writer.startbody('text/plain; charset=utf-8')
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
84 content = StringIO(content)
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
85 quopri.encode(content, body, 0)
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
86
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
87 self.smtp_send(to, message)
1981
ce6806a2a72d add roundup version to mailer headers
Richard Jones <richard@users.sourceforge.net>
parents: 1830
diff changeset
88
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
89 def bounce_message(self, bounced_message, to, error,
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
90 subject='Failed issue tracker submission'):
1830
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
91 """Bounce a message, attaching the failed submission.
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
92
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
93 Arguments:
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
94 - bounced_message: an RFC822 Message object.
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
95 - to: a list of addresses usable by rfc822.parseaddr().
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
96 - error: the reason of failure as a string.
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
97 - subject: the subject as a string.
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
98
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
99 """
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
100 message, writer = self.get_standard_message(to, subject)
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
101
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
102 part = writer.startmultipartbody('mixed')
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
103 part = writer.nextpart()
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
104 part.addheader('Content-Transfer-Encoding', 'quoted-printable')
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
105 body = part.startbody('text/plain; charset=utf-8')
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
106 body.write('\n'.join(error))
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
107
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
108 # attach the original message to the returned message
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
109 part = writer.nextpart()
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
110 part.addheader('Content-Disposition', 'attachment')
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
111 part.addheader('Content-Description', 'Message you sent')
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
112 body = part.startbody('text/plain')
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
113
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
114 for header in bounced_message.headers:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
115 body.write(header)
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
116 body.write('\n')
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
117 try:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
118 bounced_message.rewindbody()
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
119 except IOError, message:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
120 body.write("*** couldn't include message body: %s ***"
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
121 % bounced_message)
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
122 else:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
123 body.write(bounced_message.fp.read())
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
124
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
125 writer.lastpart()
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
126
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
127 self.smtp_send(to, message)
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
128
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
129 def smtp_send(self, to, message):
1830
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
130 """Send a message over SMTP, using roundup's config.
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
131
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
132 Arguments:
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
133 - to: a list of addresses usable by rfc822.parseaddr().
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
134 - message: a StringIO instance with a full message.
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
135 """
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
136 if self.debug:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
137 # don't send - just write to a file
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
138 open(self.debug, 'a').write('FROM: %s\nTO: %s\n%s\n' %
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
139 (self.config.ADMIN_EMAIL,
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
140 ', '.join(to),
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
141 message.getvalue()))
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
142 else:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
143 # now try to send the message
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
144 try:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
145 # send the message as admin so bounces are sent there
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
146 # instead of to roundup
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
147 smtp = SMTPConnection(self.config)
1830
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
148 smtp.sendmail(self.config.ADMIN_EMAIL, to,
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
149 message.getvalue())
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
150 except socket.error, value:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
151 raise MessageSendError("Error: couldn't send email: "
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
152 "mailhost %s"%value)
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
153 except smtplib.SMTPException, msg:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
154 raise MessageSendError("Error: couldn't send email: %s"%msg)
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
155
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
156 class SMTPConnection(smtplib.SMTP):
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
157 ''' Open an SMTP connection to the mailhost specified in the config
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
158 '''
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
159 def __init__(self, config):
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
160
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
161 smtplib.SMTP.__init__(self, config.MAILHOST)
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
162
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
163 # use TLS?
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
164 use_tls = getattr(config, 'MAILHOST_TLS', 'no')
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
165 if use_tls == 'yes':
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
166 # do we have key files too?
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
167 keyfile = getattr(config, 'MAILHOST_TLS_KEYFILE', '')
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
168 if keyfile:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
169 certfile = getattr(config, 'MAILHOST_TLS_CERTFILE', '')
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
170 if certfile:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
171 args = (keyfile, certfile)
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
172 else:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
173 args = (keyfile, )
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
174 else:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
175 args = ()
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
176 # start the TLS
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
177 self.starttls(*args)
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
178
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
179 # ok, now do we also need to log in?
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
180 mailuser = getattr(config, 'MAILUSER', None)
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
181 if mailuser:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
182 self.login(*config.MAILUSER)
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
183
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
184 # use the 'email' module, either imported, or our copied version
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
185 try :
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
186 from email.Utils import formataddr as straddr
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
187 except ImportError :
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
188 # code taken from the email package 2.4.3
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
189 def straddr(pair, specialsre = re.compile(r'[][\()<>@,:;".]'),
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
190 escapesre = re.compile(r'[][\()"]')):
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
191 name, address = pair
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
192 if name:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
193 quotes = ''
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
194 if specialsre.search(name):
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
195 quotes = '"'
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
196 name = escapesre.sub(r'\\\g<0>', name)
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
197 return '%s%s%s <%s>' % (quotes, name, quotes, address)
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
198 return address

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