annotate roundup/mailer.py @ 5305:e20f472fde7d

issue2550799: provide basic support for handling html only emails Initial implementation and testing with the dehtml html converter done. The use of beautifulsoup 4 is not tested. My test system breaks when running dehtml.py using beautiful soup. I don't get the failures when running under the test harness, but the text output is significantly different (different line breaks, number of newlines etc.) The tests for dehtml need to be generated for beautiful soup and the expected output changed. Since I have a wonky install of beautiful soup, I don't trust my output as the standard to test against. Also since beautiful soup is optional, the test harness needs to skip the beautifulsoup tests if import bs4 fails. Again something outside of my expertise. I deleted the work I had done to implement that. I could not get it working and wanted to get this feature in in some form.
author John Rouillard <rouilj@ieee.org>
date Fri, 13 Oct 2017 21:46:59 -0400
parents 198b6e810c67
children 17edccfe1755
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
5241
092c4522b3bf Mailer: Improves diagnostic messages for DEBUG.
Bernhard Reiter <bernhard@intevation.de>
parents: 4979
diff changeset
5 import time, quopri, os, socket, smtplib, re, sys, traceback, email, logging
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__
4536
f2e6b303aa8a When debugging mail (debug = <filename> setting in [mail] section...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4341
diff changeset
10 from roundup.date import get_timezone, Date
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
11
4967
760ffc0eae5b Change email package module names to conform v4 (issue2550875)
John Kristensen <john@jerrykan.com>
parents: 4659
diff changeset
12 from email.utils import formatdate, formataddr, specialsre, escapesre
760ffc0eae5b Change email package module names to conform v4 (issue2550875)
John Kristensen <john@jerrykan.com>
parents: 4659
diff changeset
13 from email.message import Message
760ffc0eae5b Change email package module names to conform v4 (issue2550875)
John Kristensen <john@jerrykan.com>
parents: 4659
diff changeset
14 from email.header import Header
760ffc0eae5b Change email package module names to conform v4 (issue2550875)
John Kristensen <john@jerrykan.com>
parents: 4659
diff changeset
15 from email.mime.base import MIMEBase
760ffc0eae5b Change email package module names to conform v4 (issue2550875)
John Kristensen <john@jerrykan.com>
parents: 4659
diff changeset
16 from email.mime.text import MIMEText
760ffc0eae5b Change email package module names to conform v4 (issue2550875)
John Kristensen <john@jerrykan.com>
parents: 4659
diff changeset
17 from email.mime.multipart import MIMEMultipart
3464
75b4c2c32cf3 fix Date: header generation to be LOCALE-agnostic [SF#1352624]
Richard Jones <richard@users.sourceforge.net>
parents: 2626
diff changeset
18
4979
f1a2bd1dea77 issue2550877: Writing headers with the email module will use continuation_ws = ' ' now for python 2.5 and 2.6 when importing anypy.email_.
Bernhard Reiter <bernhard@intevation.de>
parents: 4967
diff changeset
19 from roundup.anypy import email_
f1a2bd1dea77 issue2550877: Writing headers with the email module will use continuation_ws = ' ' now for python 2.5 and 2.6 when importing anypy.email_.
Bernhard Reiter <bernhard@intevation.de>
parents: 4967
diff changeset
20
4541
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
21 try:
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
22 import pyme, pyme.core
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
23 except ImportError:
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
24 pyme = None
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
25
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
26
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
27 class MessageSendError(RuntimeError):
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
28 pass
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
29
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
30 def encode_quopri(msg):
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
31 orig = msg.get_payload()
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
32 encdata = quopri.encodestring(orig)
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
33 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
34 del msg['Content-Transfer-Encoding']
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
35 msg['Content-Transfer-Encoding'] = 'quoted-printable'
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
36
4338
94ee533613ac Attempt to generate more human-readable addresses in email
Richard Jones <richard@users.sourceforge.net>
parents: 4313
diff changeset
37 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
38 # 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
39 # 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
40 if not name:
ac3f80e39d7a handle quoting/escaping specials after encoding;
Richard Jones <richard@users.sourceforge.net>
parents: 4338
diff changeset
41 return address
4338
94ee533613ac Attempt to generate more human-readable addresses in email
Richard Jones <richard@users.sourceforge.net>
parents: 4313
diff changeset
42 try:
4340
ac3f80e39d7a handle quoting/escaping specials after encoding;
Richard Jones <richard@users.sourceforge.net>
parents: 4338
diff changeset
43 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
44 except UnicodeEncodeError:
4340
ac3f80e39d7a handle quoting/escaping specials after encoding;
Richard Jones <richard@users.sourceforge.net>
parents: 4338
diff changeset
45 # use Header to encode correctly.
ac3f80e39d7a handle quoting/escaping specials after encoding;
Richard Jones <richard@users.sourceforge.net>
parents: 4338
diff changeset
46 encname = Header(name, charset=charset).encode()
ac3f80e39d7a handle quoting/escaping specials after encoding;
Richard Jones <richard@users.sourceforge.net>
parents: 4338
diff changeset
47
ac3f80e39d7a handle quoting/escaping specials after encoding;
Richard Jones <richard@users.sourceforge.net>
parents: 4338
diff changeset
48 # the important bits of formataddr()
ac3f80e39d7a handle quoting/escaping specials after encoding;
Richard Jones <richard@users.sourceforge.net>
parents: 4338
diff changeset
49 if specialsre.search(encname):
ac3f80e39d7a handle quoting/escaping specials after encoding;
Richard Jones <richard@users.sourceforge.net>
parents: 4338
diff changeset
50 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
51
4341
7f67092fe03d fix comment
Richard Jones <richard@users.sourceforge.net>
parents: 4340
diff changeset
52 # 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
53 # 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
54 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
55
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
56 class Mailer:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
57 """Roundup-specific mail sending."""
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
58 def __init__(self, config):
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
59 self.config = config
5241
092c4522b3bf Mailer: Improves diagnostic messages for DEBUG.
Bernhard Reiter <bernhard@intevation.de>
parents: 4979
diff changeset
60 self.logger = logging.getLogger('roundup.mailer')
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
61
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
62 # 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
63 # 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
64 self.debug = os.environ.get('SENDMAILDEBUG', '') \
e49e6c7b14fb fix incompatibilities with new configuration;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2124
diff changeset
65 or config["MAIL_DEBUG"]
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
66
3912
82f462d9ad16 use local timezone for mail date header
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3878
diff changeset
67 # 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
68 # 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
69 # 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
70 # 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
71 # 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
72 # timezone.
7c886f83c2ab Don't try to call time.tzset if it doesn't exist
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3912
diff changeset
73 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
74 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
75 time.tzset()
3912
82f462d9ad16 use local timezone for mail date header
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3878
diff changeset
76
4541
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
77 def set_message_attributes(self, message, to, subject, author=None):
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
78 ''' Add attributes to a standard output message
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
79 "to" - recipients list
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
80 "subject" - Subject
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
81 "author" - (name, address) tuple or None for admin email
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
82
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
83 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
84 config (default UTF-8).
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
85 '''
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
86 # encode header values if they need to be
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
87 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
88 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
89 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
90 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
91 name = author[0]
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
92 else:
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
93 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
94 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
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
4541
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
117 def get_standard_message(self, multipart=False):
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
118 '''Form a standard email message from Roundup.
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
119 Returns a Message object.
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
120 '''
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
121 charset = getattr(self.config, 'EMAIL_CHARSET', 'utf-8')
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
122 if multipart:
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
123 message = MIMEMultipart()
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
124 else:
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
125 message = MIMEText("")
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
126 message.set_charset(charset)
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
127
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
128 return message
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
129
1803
ee33ce4987f5 Let standard_message accept a different author.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1799
diff changeset
130 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
131 """Send a standard message.
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
132
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
133 Arguments:
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
134 - 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
135 - subject: the subject as a string.
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
136 - content: the body of the message as a string.
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
137 - 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
138
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
139 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
140 """
4541
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
141 message = self.get_standard_message()
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
142 self.set_message_attributes(message, to, subject, author)
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
143 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
144 encode_quopri(message)
4214
d5cd6f440396 Fix issue2550565.
Stefan Seefeld <stefan@seefeld.name>
parents: 4116
diff changeset
145 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
146
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
147 def bounce_message(self, bounced_message, to, error,
4541
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
148 subject='Failed issue tracker submission', crypt=False):
1830
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
149 """Bounce a message, attaching the failed submission.
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
150
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
151 Arguments:
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
152 - 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
153 - 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
154 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
155 ERROR_MESSAGES_TO setting.
1830
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
156 - error: the reason of failure as a string.
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
157 - subject: the subject as a string.
4541
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
158 - crypt: require encryption with pgp for user -- applies only to
4659
eabe86afc6ee issue2550756: Fix `oder' typo in mailer.Mailer.bounce_message docstring, thanks W. Trevor King
John Kristensen <john@jerrykan.com>
parents: 4541
diff changeset
159 mail sent back to the user, not the dispatcher or admin.
2123
95da13c1bdbd have bounce_message do the error_messages_to heavy-lifting
Richard Jones <richard@users.sourceforge.net>
parents: 2059
diff changeset
160
1830
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
161 """
4541
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
162 crypt_to = None
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
163 if crypt:
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
164 crypt_to = to
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
165 to = None
2123
95da13c1bdbd have bounce_message do the error_messages_to heavy-lifting
Richard Jones <richard@users.sourceforge.net>
parents: 2059
diff changeset
166 # 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
167 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
168 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
169 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
170 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
171 to = [dispatcher_email]
4541
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
172 crypt = False
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
173 crypt_to = None
2123
95da13c1bdbd have bounce_message do the error_messages_to heavy-lifting
Richard Jones <richard@users.sourceforge.net>
parents: 2059
diff changeset
174 elif error_messages_to == "both":
4541
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
175 if crypt:
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
176 to = [dispatcher_email]
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
177 else:
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
178 to.append(dispatcher_email)
2123
95da13c1bdbd have bounce_message do the error_messages_to heavy-lifting
Richard Jones <richard@users.sourceforge.net>
parents: 2059
diff changeset
179
4541
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
180 message = self.get_standard_message(multipart=True)
2124
6deda7ff3b2a *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 2123
diff changeset
181
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
182 # 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
183 part = MIMEText('\n'.join(error))
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
184 message.attach(part)
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
185
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
186 # 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
187 body = []
57dfcc824acc fix problem with bounce-message if incoming mail has insufficient privilege...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4214
diff changeset
188 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
189 body.append(header)
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
190 try:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
191 bounced_message.rewindbody()
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5241
diff changeset
192 except IOError as errmessage:
4215
57dfcc824acc fix problem with bounce-message if incoming mail has insufficient privilege...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4214
diff changeset
193 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
194 errmessage)
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
195 else:
4215
57dfcc824acc fix problem with bounce-message if incoming mail has insufficient privilege...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4214
diff changeset
196 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
197 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
198 part = MIMEText(''.join(body))
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
199 message.attach(part)
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
200
5241
092c4522b3bf Mailer: Improves diagnostic messages for DEBUG.
Bernhard Reiter <bernhard@intevation.de>
parents: 4979
diff changeset
201 self.logger.debug("bounce_message: to=%s, crypt_to=%s", to, crypt_to)
092c4522b3bf Mailer: Improves diagnostic messages for DEBUG.
Bernhard Reiter <bernhard@intevation.de>
parents: 4979
diff changeset
202
4541
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
203 if to:
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
204 # send
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
205 self.set_message_attributes(message, to, subject)
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
206 try:
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
207 self.smtp_send(to, message.as_string())
5241
092c4522b3bf Mailer: Improves diagnostic messages for DEBUG.
Bernhard Reiter <bernhard@intevation.de>
parents: 4979
diff changeset
208 except MessageSendError as e:
4541
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
209 # squash mail sending errors when bouncing mail
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
210 # TODO this *could* be better, as we could notify admin of the
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
211 # problem (even though the vast majority of bounce errors are
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
212 # because of spam)
5241
092c4522b3bf Mailer: Improves diagnostic messages for DEBUG.
Bernhard Reiter <bernhard@intevation.de>
parents: 4979
diff changeset
213 self.logger.debug("MessageSendError: %s", str(e))
4541
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
214 pass
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
215 if crypt_to:
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
216 plain = pyme.core.Data(message.as_string())
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
217 cipher = pyme.core.Data()
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
218 ctx = pyme.core.Context()
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
219 ctx.set_armor(1)
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
220 keys = []
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
221 adrs = []
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
222 for adr in crypt_to:
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
223 ctx.op_keylist_start(adr, 0)
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
224 # only first key per email
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
225 k = ctx.op_keylist_next()
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
226 if k is not None:
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
227 adrs.append(adr)
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
228 keys.append(k)
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
229 ctx.op_keylist_end()
5241
092c4522b3bf Mailer: Improves diagnostic messages for DEBUG.
Bernhard Reiter <bernhard@intevation.de>
parents: 4979
diff changeset
230 if not adrs:
092c4522b3bf Mailer: Improves diagnostic messages for DEBUG.
Bernhard Reiter <bernhard@intevation.de>
parents: 4979
diff changeset
231 self.logger.debug("bounce_message: no keys found for %s",
092c4522b3bf Mailer: Improves diagnostic messages for DEBUG.
Bernhard Reiter <bernhard@intevation.de>
parents: 4979
diff changeset
232 crypt_to)
4541
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
233 crypt_to = adrs
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
234 if crypt_to:
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
235 try:
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
236 ctx.op_encrypt(keys, 1, plain, cipher)
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
237 cipher.seek(0,0)
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
238 message=MIMEMultipart('encrypted', boundary=None,
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
239 _subparts=None, protocol="application/pgp-encrypted")
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
240 part=MIMEBase('application', 'pgp-encrypted')
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
241 part.set_payload("Version: 1\r\n")
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
242 message.attach(part)
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
243 part=MIMEBase('application', 'octet-stream')
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
244 part.set_payload(cipher.read())
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
245 message.attach(part)
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
246 except pyme.GPGMEError:
5241
092c4522b3bf Mailer: Improves diagnostic messages for DEBUG.
Bernhard Reiter <bernhard@intevation.de>
parents: 4979
diff changeset
247 self.logger.debug("bounce_message: Cannot encrypt to %s",
092c4522b3bf Mailer: Improves diagnostic messages for DEBUG.
Bernhard Reiter <bernhard@intevation.de>
parents: 4979
diff changeset
248 str(crypto_to))
4541
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
249 crypt_to = None
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
250 if crypt_to:
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
251 self.set_message_attributes(message, crypt_to, subject)
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
252 try:
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
253 self.smtp_send(crypt_to, message.as_string())
5241
092c4522b3bf Mailer: Improves diagnostic messages for DEBUG.
Bernhard Reiter <bernhard@intevation.de>
parents: 4979
diff changeset
254 except MessageSendError as e:
4541
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
255 # ignore on error, see above.
5241
092c4522b3bf Mailer: Improves diagnostic messages for DEBUG.
Bernhard Reiter <bernhard@intevation.de>
parents: 4979
diff changeset
256 self.logger.debug("MessageSendError: %s", str(e))
4541
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4536
diff changeset
257 pass
2626
e49e6c7b14fb fix incompatibilities with new configuration;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2124
diff changeset
258
3548
61d48244e7a8 login may now be for a single session
Richard Jones <richard@users.sourceforge.net>
parents: 3532
diff changeset
259 def exception_message(self):
61d48244e7a8 login may now be for a single session
Richard Jones <richard@users.sourceforge.net>
parents: 3532
diff changeset
260 '''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
261 traceback.
61d48244e7a8 login may now be for a single session
Richard Jones <richard@users.sourceforge.net>
parents: 3532
diff changeset
262 '''
61d48244e7a8 login may now be for a single session
Richard Jones <richard@users.sourceforge.net>
parents: 3532
diff changeset
263 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
264 to = [self.config.ADMIN_EMAIL]
3569
3954fbcefae5 fix incompatibility with python2.3 [SF#1432602]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3548
diff changeset
265 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
266 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
267
4287
630a20c51345 Allow non-admin email addresses as envelope sender.
Stefan Seefeld <stefan@seefeld.name>
parents: 4236
diff changeset
268 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
269 """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
270
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
271 Arguments:
4ac11e7fa11a Fix mailer bug [SF#817470]...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1803
diff changeset
272 - 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
273 - 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
274 - 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
275 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
276 """
4287
630a20c51345 Allow non-admin email addresses as envelope sender.
Stefan Seefeld <stefan@seefeld.name>
parents: 4236
diff changeset
277
630a20c51345 Allow non-admin email addresses as envelope sender.
Stefan Seefeld <stefan@seefeld.name>
parents: 4236
diff changeset
278 if not sender:
630a20c51345 Allow non-admin email addresses as envelope sender.
Stefan Seefeld <stefan@seefeld.name>
parents: 4236
diff changeset
279 sender = self.config.ADMIN_EMAIL
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
280 if self.debug:
4536
f2e6b303aa8a When debugging mail (debug = <filename> setting in [mail] section...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4341
diff changeset
281 # don't send - just write to a file, use unix from line so
f2e6b303aa8a When debugging mail (debug = <filename> setting in [mail] section...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4341
diff changeset
282 # that resulting file can be openened in a mailer
f2e6b303aa8a When debugging mail (debug = <filename> setting in [mail] section...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4341
diff changeset
283 fmt = '%a %b %m %H:%M:%S %Y'
f2e6b303aa8a When debugging mail (debug = <filename> setting in [mail] section...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4341
diff changeset
284 unixfrm = 'From %s %s' % (sender, Date ('.').pretty (fmt))
f2e6b303aa8a When debugging mail (debug = <filename> setting in [mail] section...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4341
diff changeset
285 open(self.debug, 'a').write('%s\nFROM: %s\nTO: %s\n%s\n\n' %
f2e6b303aa8a When debugging mail (debug = <filename> setting in [mail] section...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4341
diff changeset
286 (unixfrm, sender,
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 3975
diff changeset
287 ', '.join(to), message))
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
288 else:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
289 # now try to send the message
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
290 try:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
291 # 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
292 # instead of to roundup
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
293 smtp = SMTPConnection(self.config)
4287
630a20c51345 Allow non-admin email addresses as envelope sender.
Stefan Seefeld <stefan@seefeld.name>
parents: 4236
diff changeset
294 smtp.sendmail(sender, to, message)
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5241
diff changeset
295 except socket.error as value:
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
296 raise MessageSendError("Error: couldn't send email: "
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
297 "mailhost %s"%value)
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
298 except smtplib.SMTPException, msg:
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
299 raise MessageSendError("Error: couldn't send email: %s"%msg)
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
300
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
301 class SMTPConnection(smtplib.SMTP):
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
302 ''' 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
303 '''
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
304 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
305 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
306 local_hostname=config['MAIL_LOCAL_HOSTNAME'])
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
307
2626
e49e6c7b14fb fix incompatibilities with new configuration;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2124
diff changeset
308 # start the TLS if requested
e49e6c7b14fb fix incompatibilities with new configuration;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2124
diff changeset
309 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
310 self.ehlo()
2626
e49e6c7b14fb fix incompatibilities with new configuration;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2124
diff changeset
311 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
312 config["MAIL_TLS_CERTFILE"])
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
313
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
314 # 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
315 mailuser = config["MAIL_USERNAME"]
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
316 if mailuser:
2626
e49e6c7b14fb fix incompatibilities with new configuration;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2124
diff changeset
317 self.login(mailuser, config["MAIL_PASSWORD"])
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
diff changeset
318
2626
e49e6c7b14fb fix incompatibilities with new configuration;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2124
diff changeset
319 # vim: set et sts=4 sw=4 :

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