Index: trac/Notify.py
===================================================================
--- trac/Notify.py	(revision 58)
+++ trac/Notify.py	(working copy)
@@ -119,24 +119,50 @@
             self.server.login(self.user_name, self.password)
 
     def send(self, rcpt, mime_headers={}):
-        from email.MIMEText import MIMEText
+        from email.Message import Message
         from email.Header import Header
-        from email.Utils import formatdate
+        from email.Utils import formatdate, formataddr
+        from email.MIMEMultipart import MIMEMultipart
+        from email.Charset import Charset, SHORTEST, QP, BASE64
+
         body = self.hdf.render(self.template_name)
-        msg = MIMEText(body, 'plain', 'utf-8')
-        msg['X-Mailer'] = 'Trac %s, by Edgewall Software' % __version__
-        msg['X-Trac-Version'] =  __version__
         projname = self.config.get('project','name')
-        msg['X-Trac-Project'] =  projname
-        msg['X-URL'] =  self.config.get('project','url')
-        msg['Subject'] = Header(self.subject, 'utf-8')
-        msg['From'] = '%s <%s>' % (projname, self.from_email)
-        msg['Sender'] = self.from_email
-        msg['Reply-To'] = self.replyto_email
-        msg['To'] = rcpt
-        msg['Date'] = formatdate()
+
+        headers = {}
+        headers['X-Mailer'] = 'Trac %s, by Edgewall Software' % __version__
+        headers['X-Trac-Version'] =  __version__
+        headers['X-Trac-Project'] =  projname
+        headers['X-URL'] = self.config.get('project','url')
+        headers['Subject'] = self.subject
+        headers['From'] = formataddr((projname, self.from_email))
+        headers['Sender'] = self.from_email
+        headers['Reply-To'] = self.replyto_email
+        headers['To'] = rcpt
+        headers['Date'] = formatdate()
         for hdr in mime_headers.keys():
-            msg[hdr] = mime_headers[hdr]
+            headers[hdr] = mime_headers[hdr]
+
+        charset = Charset()
+        charset.header_encoding = BASE64
+        charset.body_encoding = BASE64
+        charset.input_charset = 'utf-8'
+        charset.output_charset = 'utf-8'
+        charset.input_codec = 'utf-8'
+        charset.output_codec = 'utf-8'
+
+        msgtext = Message()
+        msgtext.set_charset(charset)
+        msgtext.set_payload(body)
+
+        msg = MIMEMultipart(_subtype='mixed')
+        for k in headers.keys():
+            try:
+                ascii = unicode(headers[k], 'ascii')
+                msg[k] = ascii
+            except UnicodeDecodeError:
+                msg[k] = Header(headers[k], charset)
+        msg.attach(msgtext)
+
         self.env.log.debug("Sending SMTP notification to %s on port %d"
                            % (self.smtp_server, self.smtp_port))
         self.server.sendmail(self.from_email, [rcpt], msg.as_string())

