Mercurial > p > roundup > code
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 |
| 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 : |
