annotate roundup/mailer.py @ 3854:f4e8dc583256

Restored subject parser regexp to the string it was before the... ...implementation of customization of it, i.e., the version from CVS revision 1.184 of mailgw.py. This makes 'testFollowupTitleMatchMultiRe' work again.
author Erik Forsberg <forsberg@users.sourceforge.net>
date Sat, 12 May 2007 16:14:54 +0000
parents 35811df7c783
children 6d14a3b4e295
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'
3667
35811df7c783 fix error during mailgw bouncing message [SF#1413501]
Richard Jones <richard@users.sourceforge.net>
parents: 3572
diff changeset
4 # $Id: mailer.py,v 1.18 2006-08-11 01:41:25 richard Exp $
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
5
3548
61d48244e7a8 login may now be for a single session
Richard Jones <richard@users.sourceforge.net>
parents: 3532
diff changeset
6 import time, quopri, os, socket, smtplib, re, sys, traceback
1799
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
3464
75b4c2c32cf3 fix Date: header generation to be LOCALE-agnostic [SF#1352624]
Richard Jones <richard@users.sourceforge.net>
parents: 2626
diff changeset
14 try:
75b4c2c32cf3 fix Date: header generation to be LOCALE-agnostic [SF#1352624]
Richard Jones <richard@users.sourceforge.net>
parents: 2626
diff changeset
15 from email.Utils import formatdate
75b4c2c32cf3 fix Date: header generation to be LOCALE-agnostic [SF#1352624]
Richard Jones <richard@users.sourceforge.net>
parents: 2626
diff changeset
16 except ImportError:
3532
f43424d545a6 fix timezone offsetting in email Date: header
Richard Jones <richard@users.sourceforge.net>
parents: 3516
diff changeset
17 def formatdate():
f43424d545a6 fix timezone offsetting in email Date: header
Richard Jones <richard@users.sourceforge.net>
parents: 3516
diff changeset
18 return time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime())
3464
75b4c2c32cf3 fix Date: header generation to be LOCALE-agnostic [SF#1352624]
Richard Jones <richard@users.sourceforge.net>
parents: 2626
diff changeset
19
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
20 class MessageSendError(RuntimeError):
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
21 pass
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
22
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
23 class Mailer:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
24 """Roundup-specific mail sending."""
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
25 def __init__(self, config):
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
26 self.config = config
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
27
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
28 # 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
29 # this var must contain a file to write the mail to
2626
e49e6c7b14fb fix incompatibilities with new configuration;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2124
diff changeset
30 self.debug = os.environ.get('SENDMAILDEBUG', '') \
e49e6c7b14fb fix incompatibilities with new configuration;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2124
diff changeset
31 or config["MAIL_DEBUG"]
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
32
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
33 def get_standard_message(self, to, subject, author=None):
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
34 '''Form a standard email message from Roundup.
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 "to" - recipients list
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
37 "subject" - Subject
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
38 "author" - (name, address) tuple or None for admin email
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
39
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
40 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
41 config (default UTF-8).
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
42
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
43 Returns a Message object and body part writer.
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
44 '''
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
45 # encode header values if they need to be
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
46 charset = getattr(self.config, 'EMAIL_CHARSET', 'utf-8')
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
47 tracker_name = self.config.TRACKER_NAME
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
48 if charset != 'utf-8':
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
49 tracker = unicode(tracker_name, 'utf-8').encode(charset)
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
50 if not author:
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
51 author = straddr((tracker_name, self.config.ADMIN_EMAIL))
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
52 else:
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
53 name = author[0]
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
54 if charset != 'utf-8':
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
55 name = unicode(name, 'utf-8').encode(charset)
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
56 author = straddr((encode_header(name, charset), author[1]))
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
57
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
58 message = StringIO()
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
59 writer = MimeWriter(message)
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
60 writer.addheader('Subject', encode_header(subject, charset))
1830
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
61 writer.addheader('To', ', '.join(to))
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
62 writer.addheader('From', author)
3532
f43424d545a6 fix timezone offsetting in email Date: header
Richard Jones <richard@users.sourceforge.net>
parents: 3516
diff changeset
63 writer.addheader('Date', formatdate())
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
64
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
65 # Add a unique Roundup header to help filtering
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
66 writer.addheader('X-Roundup-Name', encode_header(tracker_name,
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
67 charset))
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
68 # and another one to avoid loops
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
69 writer.addheader('X-Roundup-Loop', 'hello')
1981
ce6806a2a72d add roundup version to mailer headers
Richard Jones <richard@users.sourceforge.net>
parents: 1830
diff changeset
70 # finally, an aid to debugging problems
ce6806a2a72d add roundup version to mailer headers
Richard Jones <richard@users.sourceforge.net>
parents: 1830
diff changeset
71 writer.addheader('X-Roundup-Version', __version__)
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
72
2626
e49e6c7b14fb fix incompatibilities with new configuration;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2124
diff changeset
73 writer.addheader('MIME-Version', '1.0')
e49e6c7b14fb fix incompatibilities with new configuration;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2124
diff changeset
74
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
75 return message, writer
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
76
1803
ee33ce4987f5 Let standard_message accept a different author.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1799
diff changeset
77 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
78 """Send a standard message.
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
79
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
80 Arguments:
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
81 - 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
82 - subject: the subject as a string.
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
83 - content: the body of the message as a string.
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
84 - 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
85 """
1803
ee33ce4987f5 Let standard_message accept a different author.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1799
diff changeset
86 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
87
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
88 writer.addheader('Content-Transfer-Encoding', 'quoted-printable')
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
89 body = writer.startbody('text/plain; charset=utf-8')
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
90 content = StringIO(content)
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
91 quopri.encode(content, body, 0)
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
92
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
93 self.smtp_send(to, message)
1981
ce6806a2a72d add roundup version to mailer headers
Richard Jones <richard@users.sourceforge.net>
parents: 1830
diff changeset
94
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
95 def bounce_message(self, bounced_message, to, error,
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
96 subject='Failed issue tracker submission'):
1830
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
97 """Bounce a message, attaching the failed submission.
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 Arguments:
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
100 - bounced_message: an RFC822 Message object.
2123
95da13c1bdbd have bounce_message do the error_messages_to heavy-lifting
Richard Jones <richard@users.sourceforge.net>
parents: 2059
diff changeset
101 - to: a list of addresses usable by rfc822.parseaddr(). Might be
95da13c1bdbd have bounce_message do the error_messages_to heavy-lifting
Richard Jones <richard@users.sourceforge.net>
parents: 2059
diff changeset
102 extended or overridden according to the config
95da13c1bdbd have bounce_message do the error_messages_to heavy-lifting
Richard Jones <richard@users.sourceforge.net>
parents: 2059
diff changeset
103 ERROR_MESSAGES_TO setting.
1830
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
104 - error: the reason of failure as a string.
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
105 - subject: the subject as a string.
2123
95da13c1bdbd have bounce_message do the error_messages_to heavy-lifting
Richard Jones <richard@users.sourceforge.net>
parents: 2059
diff changeset
106
1830
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
107 """
2123
95da13c1bdbd have bounce_message do the error_messages_to heavy-lifting
Richard Jones <richard@users.sourceforge.net>
parents: 2059
diff changeset
108 # see whether we should send to the dispatcher or not
95da13c1bdbd have bounce_message do the error_messages_to heavy-lifting
Richard Jones <richard@users.sourceforge.net>
parents: 2059
diff changeset
109 dispatcher_email = getattr(self.config, "DISPATCHER_EMAIL",
95da13c1bdbd have bounce_message do the error_messages_to heavy-lifting
Richard Jones <richard@users.sourceforge.net>
parents: 2059
diff changeset
110 getattr(self.config, "ADMIN_EMAIL"))
95da13c1bdbd have bounce_message do the error_messages_to heavy-lifting
Richard Jones <richard@users.sourceforge.net>
parents: 2059
diff changeset
111 error_messages_to = getattr(self.config, "ERROR_MESSAGES_TO", "user")
95da13c1bdbd have bounce_message do the error_messages_to heavy-lifting
Richard Jones <richard@users.sourceforge.net>
parents: 2059
diff changeset
112 if error_messages_to == "dispatcher":
95da13c1bdbd have bounce_message do the error_messages_to heavy-lifting
Richard Jones <richard@users.sourceforge.net>
parents: 2059
diff changeset
113 to = [dispatcher_email]
95da13c1bdbd have bounce_message do the error_messages_to heavy-lifting
Richard Jones <richard@users.sourceforge.net>
parents: 2059
diff changeset
114 elif error_messages_to == "both":
95da13c1bdbd have bounce_message do the error_messages_to heavy-lifting
Richard Jones <richard@users.sourceforge.net>
parents: 2059
diff changeset
115 to.append(dispatcher_email)
95da13c1bdbd have bounce_message do the error_messages_to heavy-lifting
Richard Jones <richard@users.sourceforge.net>
parents: 2059
diff changeset
116
2124
6deda7ff3b2a *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 2123
diff changeset
117 message, writer = self.get_standard_message(to, subject)
6deda7ff3b2a *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 2123
diff changeset
118
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
119 part = writer.startmultipartbody('mixed')
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
120 part = writer.nextpart()
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
121 part.addheader('Content-Transfer-Encoding', 'quoted-printable')
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
122 body = part.startbody('text/plain; charset=utf-8')
3516
fe75b55fc49d fix encoding of subject in generated error message [SF#1414465]
Richard Jones <richard@users.sourceforge.net>
parents: 3482
diff changeset
123 body.write(quopri.encodestring ('\n'.join(error)))
1799
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 # attach the original message to the returned message
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
126 part = writer.nextpart()
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
127 part.addheader('Content-Disposition', 'attachment')
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
128 part.addheader('Content-Description', 'Message you sent')
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
129 body = part.startbody('text/plain')
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
130
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
131 for header in bounced_message.headers:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
132 body.write(header)
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
133 body.write('\n')
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
134 try:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
135 bounced_message.rewindbody()
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
136 except IOError, message:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
137 body.write("*** couldn't include message body: %s ***"
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
138 % bounced_message)
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
139 else:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
140 body.write(bounced_message.fp.read())
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
141
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
142 writer.lastpart()
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
143
3667
35811df7c783 fix error during mailgw bouncing message [SF#1413501]
Richard Jones <richard@users.sourceforge.net>
parents: 3572
diff changeset
144 try:
35811df7c783 fix error during mailgw bouncing message [SF#1413501]
Richard Jones <richard@users.sourceforge.net>
parents: 3572
diff changeset
145 self.smtp_send(to, message)
35811df7c783 fix error during mailgw bouncing message [SF#1413501]
Richard Jones <richard@users.sourceforge.net>
parents: 3572
diff changeset
146 except MessageSendError:
35811df7c783 fix error during mailgw bouncing message [SF#1413501]
Richard Jones <richard@users.sourceforge.net>
parents: 3572
diff changeset
147 # squash mail sending errors when bouncing mail
35811df7c783 fix error during mailgw bouncing message [SF#1413501]
Richard Jones <richard@users.sourceforge.net>
parents: 3572
diff changeset
148 # TODO this *could* be better, as we could notify admin of the
35811df7c783 fix error during mailgw bouncing message [SF#1413501]
Richard Jones <richard@users.sourceforge.net>
parents: 3572
diff changeset
149 # problem (even though the vast majority of bounce errors are
35811df7c783 fix error during mailgw bouncing message [SF#1413501]
Richard Jones <richard@users.sourceforge.net>
parents: 3572
diff changeset
150 # because of spam)
35811df7c783 fix error during mailgw bouncing message [SF#1413501]
Richard Jones <richard@users.sourceforge.net>
parents: 3572
diff changeset
151 pass
2626
e49e6c7b14fb fix incompatibilities with new configuration;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2124
diff changeset
152
3548
61d48244e7a8 login may now be for a single session
Richard Jones <richard@users.sourceforge.net>
parents: 3532
diff changeset
153 def exception_message(self):
61d48244e7a8 login may now be for a single session
Richard Jones <richard@users.sourceforge.net>
parents: 3532
diff changeset
154 '''Send a message to the admins with information about the latest
61d48244e7a8 login may now be for a single session
Richard Jones <richard@users.sourceforge.net>
parents: 3532
diff changeset
155 traceback.
61d48244e7a8 login may now be for a single session
Richard Jones <richard@users.sourceforge.net>
parents: 3532
diff changeset
156 '''
61d48244e7a8 login may now be for a single session
Richard Jones <richard@users.sourceforge.net>
parents: 3532
diff changeset
157 subject = '%s: %s'%(self.config.TRACKER_NAME, sys.exc_info()[1])
61d48244e7a8 login may now be for a single session
Richard Jones <richard@users.sourceforge.net>
parents: 3532
diff changeset
158 to = [self.config.ADMIN_EMAIL]
3569
3954fbcefae5 fix incompatibility with python2.3 [SF#1432602]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3548
diff changeset
159 content = '\n'.join(traceback.format_exception(*sys.exc_info()))
3548
61d48244e7a8 login may now be for a single session
Richard Jones <richard@users.sourceforge.net>
parents: 3532
diff changeset
160 self.standard_message(to, subject, content)
61d48244e7a8 login may now be for a single session
Richard Jones <richard@users.sourceforge.net>
parents: 3532
diff changeset
161
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
162 def smtp_send(self, to, message):
1830
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
163 """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
164
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
165 Arguments:
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
166 - 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
167 - message: a StringIO instance with a full message.
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
168 """
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
169 if self.debug:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
170 # don't send - just write to a file
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
171 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
172 (self.config.ADMIN_EMAIL,
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
173 ', '.join(to),
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
174 message.getvalue()))
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
175 else:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
176 # now try to send the message
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
177 try:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
178 # 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
179 # instead of to roundup
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
180 smtp = SMTPConnection(self.config)
1830
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
181 smtp.sendmail(self.config.ADMIN_EMAIL, to,
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
182 message.getvalue())
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
183 except socket.error, value:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
184 raise MessageSendError("Error: couldn't send email: "
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
185 "mailhost %s"%value)
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
186 except smtplib.SMTPException, msg:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
187 raise MessageSendError("Error: couldn't send email: %s"%msg)
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
188
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
189 class SMTPConnection(smtplib.SMTP):
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
190 ''' 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
191 '''
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
192 def __init__(self, config):
2626
e49e6c7b14fb fix incompatibilities with new configuration;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2124
diff changeset
193
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
194 smtplib.SMTP.__init__(self, config.MAILHOST)
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
195
2626
e49e6c7b14fb fix incompatibilities with new configuration;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2124
diff changeset
196 # start the TLS if requested
e49e6c7b14fb fix incompatibilities with new configuration;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2124
diff changeset
197 if config["MAIL_TLS"]:
e49e6c7b14fb fix incompatibilities with new configuration;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2124
diff changeset
198 self.starttls(config["MAIL_TLS_KEYFILE"],
3572
a052781093d7 fix typo in SMTP TLS option name: "MAIL_TLS_CERFILE" [SF#1435452]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3569
diff changeset
199 config["MAIL_TLS_CERTFILE"])
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
200
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
201 # ok, now do we also need to log in?
2626
e49e6c7b14fb fix incompatibilities with new configuration;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2124
diff changeset
202 mailuser = config["MAIL_USERNAME"]
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
203 if mailuser:
2626
e49e6c7b14fb fix incompatibilities with new configuration;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2124
diff changeset
204 self.login(mailuser, config["MAIL_PASSWORD"])
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
205
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
206 # 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
207 try :
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
208 from email.Utils import formataddr as straddr
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
209 except ImportError :
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
210 # code taken from the email package 2.4.3
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
211 def straddr(pair, specialsre = re.compile(r'[][\()<>@,:;".]'),
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
212 escapesre = re.compile(r'[][\()"]')):
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
213 name, address = pair
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
214 if name:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
215 quotes = ''
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
216 if specialsre.search(name):
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
217 quotes = '"'
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
218 name = escapesre.sub(r'\\\g<0>', name)
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
219 return '%s%s%s <%s>' % (quotes, name, quotes, address)
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
220 return address
2626
e49e6c7b14fb fix incompatibilities with new configuration;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2124
diff changeset
221
e49e6c7b14fb fix incompatibilities with new configuration;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2124
diff changeset
222 # vim: set et sts=4 sw=4 :

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