Here are a few lessons learnt when sending HTML emails in Zope with unicode data. I'm still a beginner with this stuff and still probably have a lot to learn. What I've achived now works but might break with different encodings or on different systems so don't assume that these patterns will work in your setup.
To the send the email I'm using the default MailHost that comes with Zope 2.8.5. I call it's
send() passing the subject line a second time because the subject line is already in the body string.
The most valuable piece of magic to learn and remember from this is that when you construct the multi-part message you have to attach the plain text before the html text. Thank you Lukasz Lakomy for that tip!
Here's the code that constructs the message and send it:
# -*- coding: iso-8859-1 -*- e_subject = u'Provsprängning' e_from = email@example.com' e_to = firstname.lastname@example.org' body_html = u'<html>provsprängningen <em>av</em> kärnvapen</html>' body_plain = u'provsprängningen *av* kärnvapen' mime_msg = MIMEMultipart('related') mime_msg['Subject'] = e_subject mime_msg['From'] = e_from mime_msg['To'] = e_to mime_msg.preamble = 'This is a multi-part message in MIME format.' # Encapsulate the plain and HTML versions of the message body # in an 'alternative' part, so message agents can decide # which they want to display. msgAlternative = MIMEMultipart('alternative') mime_msg.attach(msgAlternative) # plain part msg_txt = MIMEText(body, _charset='iso-8859-1') msgAlternative.attach(msg_txt) # html part msg_txt = MIMEText(rendered_html, _subtype='html', _charset='iso-8859-1') msgAlternative.attach(msg_txt) self.MailHost.send(mime_msg.as_string())