annotate roundup/mailer.py @ 4531:ddff9669361b

Fix matching of incoming email addresses to the alternate_addresses field... ...of a user -- this would match substrings, e.g. if the user has discuss-support@example.com as an alternate email and an incoming mail is addressed to support@example.com this would (wrongly) match. Note: I *think* I've seen this discussed somewhere but couldn't find it, neither in the tracker nor in recent discussions on the mailinglists. So if someone remembers an issue which now should be closed, please tell me :-)
author Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
date Wed, 24 Aug 2011 14:43:52 +0000
parents 7f67092fe03d
children f2e6b303aa8a
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'
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
4
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
5 import time, quopri, os, socket, smtplib, re, sys, traceback, email
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
6
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
7 from cStringIO import StringIO
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
8
1981
ce6806a2a72d add roundup version to mailer headers
Richard Jones <richard@users.sourceforge.net>
parents: 1830
diff changeset
9 from roundup import __version__
3912
82f462d9ad16 use local timezone for mail date header
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3878
diff changeset
10 from roundup.date import get_timezone
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
11
4338
94ee533613ac Attempt to generate more human-readable addresses in email
Richard Jones <richard@users.sourceforge.net>
parents: 4313
diff changeset
12 from email.Utils import formatdate, formataddr, specialsre, escapesre
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
13 from email.Message import Message
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
14 from email.Header import Header
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
15 from email.MIMEText import MIMEText
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
16 from email.MIMEMultipart import MIMEMultipart
3464
75b4c2c32cf3 fix Date: header generation to be LOCALE-agnostic [SF#1352624]
Richard Jones <richard@users.sourceforge.net>
parents: 2626
diff changeset
17
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
18 class MessageSendError(RuntimeError):
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
19 pass
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
20
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
21 def encode_quopri(msg):
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
22 orig = msg.get_payload()
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
23 encdata = quopri.encodestring(orig)
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
24 msg.set_payload(encdata)
4114
da682f38bad3 bug introduced in the migration to the email package (issue 2550531)
Richard Jones <richard@users.sourceforge.net>
parents: 4092
diff changeset
25 del msg['Content-Transfer-Encoding']
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
26 msg['Content-Transfer-Encoding'] = 'quoted-printable'
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
27
4338
94ee533613ac Attempt to generate more human-readable addresses in email
Richard Jones <richard@users.sourceforge.net>
parents: 4313
diff changeset
28 def nice_sender_header(name, address, charset):
94ee533613ac Attempt to generate more human-readable addresses in email
Richard Jones <richard@users.sourceforge.net>
parents: 4313
diff changeset
29 # construct an address header so it's as human-readable as possible
94ee533613ac Attempt to generate more human-readable addresses in email
Richard Jones <richard@users.sourceforge.net>
parents: 4313
diff changeset
30 # even in the presence of a non-ASCII name part
4340
ac3f80e39d7a handle quoting/escaping specials after encoding;
Richard Jones <richard@users.sourceforge.net>
parents: 4338
diff changeset
31 if not name:
ac3f80e39d7a handle quoting/escaping specials after encoding;
Richard Jones <richard@users.sourceforge.net>
parents: 4338
diff changeset
32 return address
4338
94ee533613ac Attempt to generate more human-readable addresses in email
Richard Jones <richard@users.sourceforge.net>
parents: 4313
diff changeset
33 try:
4340
ac3f80e39d7a handle quoting/escaping specials after encoding;
Richard Jones <richard@users.sourceforge.net>
parents: 4338
diff changeset
34 encname = name.encode('ASCII')
4338
94ee533613ac Attempt to generate more human-readable addresses in email
Richard Jones <richard@users.sourceforge.net>
parents: 4313
diff changeset
35 except UnicodeEncodeError:
4340
ac3f80e39d7a handle quoting/escaping specials after encoding;
Richard Jones <richard@users.sourceforge.net>
parents: 4338
diff changeset
36 # use Header to encode correctly.
ac3f80e39d7a handle quoting/escaping specials after encoding;
Richard Jones <richard@users.sourceforge.net>
parents: 4338
diff changeset
37 encname = Header(name, charset=charset).encode()
ac3f80e39d7a handle quoting/escaping specials after encoding;
Richard Jones <richard@users.sourceforge.net>
parents: 4338
diff changeset
38
ac3f80e39d7a handle quoting/escaping specials after encoding;
Richard Jones <richard@users.sourceforge.net>
parents: 4338
diff changeset
39 # the important bits of formataddr()
ac3f80e39d7a handle quoting/escaping specials after encoding;
Richard Jones <richard@users.sourceforge.net>
parents: 4338
diff changeset
40 if specialsre.search(encname):
ac3f80e39d7a handle quoting/escaping specials after encoding;
Richard Jones <richard@users.sourceforge.net>
parents: 4338
diff changeset
41 encname = '"%s"'%escapesre.sub(r'\\\g<0>', encname)
ac3f80e39d7a handle quoting/escaping specials after encoding;
Richard Jones <richard@users.sourceforge.net>
parents: 4338
diff changeset
42
4341
7f67092fe03d fix comment
Richard Jones <richard@users.sourceforge.net>
parents: 4340
diff changeset
43 # now format the header as a string - don't return a Header as anonymous
7f67092fe03d fix comment
Richard Jones <richard@users.sourceforge.net>
parents: 4340
diff changeset
44 # headers play poorly with Messages (eg. won't get wrapped properly)
4340
ac3f80e39d7a handle quoting/escaping specials after encoding;
Richard Jones <richard@users.sourceforge.net>
parents: 4338
diff changeset
45 return '%s <%s>'%(encname, address)
4338
94ee533613ac Attempt to generate more human-readable addresses in email
Richard Jones <richard@users.sourceforge.net>
parents: 4313
diff changeset
46
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
47 class Mailer:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
48 """Roundup-specific mail sending."""
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
49 def __init__(self, config):
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
50 self.config = config
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
51
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
52 # 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
53 # 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
54 self.debug = os.environ.get('SENDMAILDEBUG', '') \
e49e6c7b14fb fix incompatibilities with new configuration;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2124
diff changeset
55 or config["MAIL_DEBUG"]
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
56
3912
82f462d9ad16 use local timezone for mail date header
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3878
diff changeset
57 # set timezone so that things like formatdate(localtime=True)
82f462d9ad16 use local timezone for mail date header
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3878
diff changeset
58 # use the configured timezone
3944
7c886f83c2ab Don't try to call time.tzset if it doesn't exist
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3912
diff changeset
59 # apparently tzset doesn't exist in python under Windows, my bad.
7c886f83c2ab Don't try to call time.tzset if it doesn't exist
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3912
diff changeset
60 # my pathetic attempts at googling a Windows-solution failed
7c886f83c2ab Don't try to call time.tzset if it doesn't exist
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3912
diff changeset
61 # so if you're on Windows your mail won't use your configured
7c886f83c2ab Don't try to call time.tzset if it doesn't exist
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3912
diff changeset
62 # timezone.
7c886f83c2ab Don't try to call time.tzset if it doesn't exist
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3912
diff changeset
63 if hasattr(time, 'tzset'):
7c886f83c2ab Don't try to call time.tzset if it doesn't exist
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3912
diff changeset
64 os.environ['TZ'] = get_timezone(self.config.TIMEZONE).tzname(None)
7c886f83c2ab Don't try to call time.tzset if it doesn't exist
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3912
diff changeset
65 time.tzset()
3912
82f462d9ad16 use local timezone for mail date header
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3878
diff changeset
66
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
67 def get_standard_message(self, to, subject, author=None, multipart=False):
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
68 '''Form a standard email message from Roundup.
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
69
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
70 "to" - recipients list
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
71 "subject" - Subject
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
72 "author" - (name, address) tuple or None for admin email
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
73
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
74 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
75 config (default UTF-8).
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
76
4114
da682f38bad3 bug introduced in the migration to the email package (issue 2550531)
Richard Jones <richard@users.sourceforge.net>
parents: 4092
diff changeset
77 Returns a Message object.
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
78 '''
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
79 # encode header values if they need to be
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
80 charset = getattr(self.config, 'EMAIL_CHARSET', 'utf-8')
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
81 tracker_name = unicode(self.config.TRACKER_NAME, 'utf-8')
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
82 if not author:
4313
7a6c5c117879 Fix handling of non-ascii in realname in the nosy mailer...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4287
diff changeset
83 author = (tracker_name, self.config.ADMIN_EMAIL)
7a6c5c117879 Fix handling of non-ascii in realname in the nosy mailer...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4287
diff changeset
84 name = author[0]
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
85 else:
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
86 name = unicode(author[0], 'utf-8')
4338
94ee533613ac Attempt to generate more human-readable addresses in email
Richard Jones <richard@users.sourceforge.net>
parents: 4313
diff changeset
87 author = nice_sender_header(name, author[1], charset)
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
88
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
89 if multipart:
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
90 message = MIMEMultipart()
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
91 else:
4236
2f4cee0e31e2 better construction of plain text
Richard Jones <richard@users.sourceforge.net>
parents: 4215
diff changeset
92 message = MIMEText("")
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
93 message.set_charset(charset)
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
94
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
95 try:
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
96 message['Subject'] = subject.encode('ascii')
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
97 except UnicodeError:
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
98 message['Subject'] = Header(subject, charset)
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
99 message['To'] = ', '.join(to)
4313
7a6c5c117879 Fix handling of non-ascii in realname in the nosy mailer...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4287
diff changeset
100 message['From'] = author
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
101 message['Date'] = formatdate(localtime=True)
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
102
3975
48457385bf61 Send a Precedence header in email so autoresponders don't
Richard Jones <richard@users.sourceforge.net>
parents: 3944
diff changeset
103 # add a Precedence header so autoresponders ignore us
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
104 message['Precedence'] = 'bulk'
3975
48457385bf61 Send a Precedence header in email so autoresponders don't
Richard Jones <richard@users.sourceforge.net>
parents: 3944
diff changeset
105
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
106 # Add a unique Roundup header to help filtering
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
107 try:
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
108 message['X-Roundup-Name'] = tracker_name.encode('ascii')
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
109 except UnicodeError:
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
110 message['X-Roundup-Name'] = Header(tracker_name, charset)
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
111
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
112 # and another one to avoid loops
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
113 message['X-Roundup-Loop'] = 'hello'
1981
ce6806a2a72d add roundup version to mailer headers
Richard Jones <richard@users.sourceforge.net>
parents: 1830
diff changeset
114 # finally, an aid to debugging problems
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
115 message['X-Roundup-Version'] = __version__
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
116
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
117 return message
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
118
1803
ee33ce4987f5 Let standard_message accept a different author.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1799
diff changeset
119 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
120 """Send a standard message.
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
121
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
122 Arguments:
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
123 - 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
124 - subject: the subject as a string.
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
125 - content: the body of the message as a string.
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
126 - author: the sender as a (name, address) tuple
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
127
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
128 All strings are assumed to be UTF-8 encoded.
1830
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
129 """
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
130 message = self.get_standard_message(to, subject, author)
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
131 message.set_payload(content)
4114
da682f38bad3 bug introduced in the migration to the email package (issue 2550531)
Richard Jones <richard@users.sourceforge.net>
parents: 4092
diff changeset
132 encode_quopri(message)
4214
d5cd6f440396 Fix issue2550565.
Stefan Seefeld <stefan@seefeld.name>
parents: 4116
diff changeset
133 self.smtp_send(to, message.as_string())
1981
ce6806a2a72d add roundup version to mailer headers
Richard Jones <richard@users.sourceforge.net>
parents: 1830
diff changeset
134
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
135 def bounce_message(self, bounced_message, to, error,
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
136 subject='Failed issue tracker submission'):
1830
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
137 """Bounce a message, attaching the failed submission.
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
138
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
139 Arguments:
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
140 - 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
141 - 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
142 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
143 ERROR_MESSAGES_TO setting.
1830
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
144 - error: the reason of failure as a string.
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
145 - 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
146
1830
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
147 """
2123
95da13c1bdbd have bounce_message do the error_messages_to heavy-lifting
Richard Jones <richard@users.sourceforge.net>
parents: 2059
diff changeset
148 # 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
149 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
150 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
151 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
152 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
153 to = [dispatcher_email]
95da13c1bdbd have bounce_message do the error_messages_to heavy-lifting
Richard Jones <richard@users.sourceforge.net>
parents: 2059
diff changeset
154 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
155 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
156
4215
57dfcc824acc fix problem with bounce-message if incoming mail has insufficient privilege...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4214
diff changeset
157 message = self.get_standard_message(to, subject, multipart=True)
2124
6deda7ff3b2a *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 2123
diff changeset
158
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
159 # add the error text
4215
57dfcc824acc fix problem with bounce-message if incoming mail has insufficient privilege...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4214
diff changeset
160 part = MIMEText('\n'.join(error))
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
161 message.attach(part)
1799
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 # attach the original message to the returned message
4215
57dfcc824acc fix problem with bounce-message if incoming mail has insufficient privilege...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4214
diff changeset
164 body = []
57dfcc824acc fix problem with bounce-message if incoming mail has insufficient privilege...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4214
diff changeset
165 for header in bounced_message.headers:
57dfcc824acc fix problem with bounce-message if incoming mail has insufficient privilege...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4214
diff changeset
166 body.append(header)
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
167 try:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
168 bounced_message.rewindbody()
4215
57dfcc824acc fix problem with bounce-message if incoming mail has insufficient privilege...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4214
diff changeset
169 except IOError, errmessage:
57dfcc824acc fix problem with bounce-message if incoming mail has insufficient privilege...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4214
diff changeset
170 body.append("*** couldn't include message body: %s ***" %
57dfcc824acc fix problem with bounce-message if incoming mail has insufficient privilege...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4214
diff changeset
171 errmessage)
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
172 else:
4215
57dfcc824acc fix problem with bounce-message if incoming mail has insufficient privilege...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4214
diff changeset
173 body.append('\n')
57dfcc824acc fix problem with bounce-message if incoming mail has insufficient privilege...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4214
diff changeset
174 body.append(bounced_message.fp.read())
57dfcc824acc fix problem with bounce-message if incoming mail has insufficient privilege...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4214
diff changeset
175 part = MIMEText(''.join(body))
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
176 message.attach(part)
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
177
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
178 # send
3667
35811df7c783 fix error during mailgw bouncing message [SF#1413501]
Richard Jones <richard@users.sourceforge.net>
parents: 3572
diff changeset
179 try:
4214
d5cd6f440396 Fix issue2550565.
Stefan Seefeld <stefan@seefeld.name>
parents: 4116
diff changeset
180 self.smtp_send(to, message.as_string())
3667
35811df7c783 fix error during mailgw bouncing message [SF#1413501]
Richard Jones <richard@users.sourceforge.net>
parents: 3572
diff changeset
181 except MessageSendError:
35811df7c783 fix error during mailgw bouncing message [SF#1413501]
Richard Jones <richard@users.sourceforge.net>
parents: 3572
diff changeset
182 # 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
183 # 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
184 # 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
185 # because of spam)
35811df7c783 fix error during mailgw bouncing message [SF#1413501]
Richard Jones <richard@users.sourceforge.net>
parents: 3572
diff changeset
186 pass
2626
e49e6c7b14fb fix incompatibilities with new configuration;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2124
diff changeset
187
3548
61d48244e7a8 login may now be for a single session
Richard Jones <richard@users.sourceforge.net>
parents: 3532
diff changeset
188 def exception_message(self):
61d48244e7a8 login may now be for a single session
Richard Jones <richard@users.sourceforge.net>
parents: 3532
diff changeset
189 '''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
190 traceback.
61d48244e7a8 login may now be for a single session
Richard Jones <richard@users.sourceforge.net>
parents: 3532
diff changeset
191 '''
61d48244e7a8 login may now be for a single session
Richard Jones <richard@users.sourceforge.net>
parents: 3532
diff changeset
192 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
193 to = [self.config.ADMIN_EMAIL]
3569
3954fbcefae5 fix incompatibility with python2.3 [SF#1432602]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3548
diff changeset
194 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
195 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
196
4287
630a20c51345 Allow non-admin email addresses as envelope sender.
Stefan Seefeld <stefan@seefeld.name>
parents: 4236
diff changeset
197 def smtp_send(self, to, message, sender=None):
1830
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
198 """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
199
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
200 Arguments:
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
201 - 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
202 - message: a StringIO instance with a full message.
4287
630a20c51345 Allow non-admin email addresses as envelope sender.
Stefan Seefeld <stefan@seefeld.name>
parents: 4236
diff changeset
203 - sender: if not 'None', the email address to use as the
630a20c51345 Allow non-admin email addresses as envelope sender.
Stefan Seefeld <stefan@seefeld.name>
parents: 4236
diff changeset
204 envelope sender. If 'None', the admin email is used.
1830
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
205 """
4287
630a20c51345 Allow non-admin email addresses as envelope sender.
Stefan Seefeld <stefan@seefeld.name>
parents: 4236
diff changeset
206
630a20c51345 Allow non-admin email addresses as envelope sender.
Stefan Seefeld <stefan@seefeld.name>
parents: 4236
diff changeset
207 if not sender:
630a20c51345 Allow non-admin email addresses as envelope sender.
Stefan Seefeld <stefan@seefeld.name>
parents: 4236
diff changeset
208 sender = self.config.ADMIN_EMAIL
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
209 if self.debug:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
210 # don't send - just write to a file
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
211 open(self.debug, 'a').write('FROM: %s\nTO: %s\n%s\n' %
4287
630a20c51345 Allow non-admin email addresses as envelope sender.
Stefan Seefeld <stefan@seefeld.name>
parents: 4236
diff changeset
212 (sender,
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
213 ', '.join(to), message))
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
214 else:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
215 # now try to send the message
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
216 try:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
217 # 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
218 # instead of to roundup
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
219 smtp = SMTPConnection(self.config)
4287
630a20c51345 Allow non-admin email addresses as envelope sender.
Stefan Seefeld <stefan@seefeld.name>
parents: 4236
diff changeset
220 smtp.sendmail(sender, to, message)
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
221 except socket.error, value:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
222 raise MessageSendError("Error: couldn't send email: "
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
223 "mailhost %s"%value)
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
224 except smtplib.SMTPException, msg:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
225 raise MessageSendError("Error: couldn't send email: %s"%msg)
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
226
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
227 class SMTPConnection(smtplib.SMTP):
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
228 ''' 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
229 '''
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
230 def __init__(self, config):
3878
6d14a3b4e295 allow admin to specify port and local hostname for SMTP connections
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3667
diff changeset
231 smtplib.SMTP.__init__(self, config.MAILHOST, port=config['MAIL_PORT'],
6d14a3b4e295 allow admin to specify port and local hostname for SMTP connections
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3667
diff changeset
232 local_hostname=config['MAIL_LOCAL_HOSTNAME'])
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
233
2626
e49e6c7b14fb fix incompatibilities with new configuration;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2124
diff changeset
234 # start the TLS if requested
e49e6c7b14fb fix incompatibilities with new configuration;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2124
diff changeset
235 if config["MAIL_TLS"]:
4116
391fa482f995 fix TLS handling with some SMTP servers (issues 2484879 and 1912923)
Richard Jones <richard@users.sourceforge.net>
parents: 4114
diff changeset
236 self.ehlo()
2626
e49e6c7b14fb fix incompatibilities with new configuration;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2124
diff changeset
237 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
238 config["MAIL_TLS_CERTFILE"])
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
239
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
240 # 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
241 mailuser = config["MAIL_USERNAME"]
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
242 if mailuser:
2626
e49e6c7b14fb fix incompatibilities with new configuration;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2124
diff changeset
243 self.login(mailuser, config["MAIL_PASSWORD"])
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
244
2626
e49e6c7b14fb fix incompatibilities with new configuration;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2124
diff changeset
245 # vim: set et sts=4 sw=4 :

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