Edgewall Software

Ticket #2014: Notify.py.patch

File Notify.py.patch, 2.8 KB (added by eblot, 7 years ago)

First attempt to improve notification with MIME content

  • trac/Notify.py

     
    119119            self.server.login(self.user_name, self.password) 
    120120 
    121121    def send(self, rcpt, mime_headers={}): 
    122         from email.MIMEText import MIMEText 
     122        from email.Message import Message 
    123123        from email.Header import Header 
    124         from email.Utils import formatdate 
     124        from email.Utils import formatdate, formataddr 
     125        from email.MIMEMultipart import MIMEMultipart 
     126        from email.Charset import Charset, SHORTEST, QP, BASE64 
     127 
    125128        body = self.hdf.render(self.template_name) 
    126         msg = MIMEText(body, 'plain', 'utf-8') 
    127         msg['X-Mailer'] = 'Trac %s, by Edgewall Software' % __version__ 
    128         msg['X-Trac-Version'] =  __version__ 
    129129        projname = self.config.get('project','name') 
    130         msg['X-Trac-Project'] =  projname 
    131         msg['X-URL'] =  self.config.get('project','url') 
    132         msg['Subject'] = Header(self.subject, 'utf-8') 
    133         msg['From'] = '%s <%s>' % (projname, self.from_email) 
    134         msg['Sender'] = self.from_email 
    135         msg['Reply-To'] = self.replyto_email 
    136         msg['To'] = rcpt 
    137         msg['Date'] = formatdate() 
     130 
     131        headers = {} 
     132        headers['X-Mailer'] = 'Trac %s, by Edgewall Software' % __version__ 
     133        headers['X-Trac-Version'] =  __version__ 
     134        headers['X-Trac-Project'] =  projname 
     135        headers['X-URL'] = self.config.get('project','url') 
     136        headers['Subject'] = self.subject 
     137        headers['From'] = formataddr((projname, self.from_email)) 
     138        headers['Sender'] = self.from_email 
     139        headers['Reply-To'] = self.replyto_email 
     140        headers['To'] = rcpt 
     141        headers['Date'] = formatdate() 
    138142        for hdr in mime_headers.keys(): 
    139             msg[hdr] = mime_headers[hdr] 
     143            headers[hdr] = mime_headers[hdr] 
     144 
     145        charset = Charset() 
     146        charset.header_encoding = BASE64 
     147        charset.body_encoding = BASE64 
     148        charset.input_charset = 'utf-8' 
     149        charset.output_charset = 'utf-8' 
     150        charset.input_codec = 'utf-8' 
     151        charset.output_codec = 'utf-8' 
     152 
     153        msgtext = Message() 
     154        msgtext.set_charset(charset) 
     155        msgtext.set_payload(body) 
     156 
     157        msg = MIMEMultipart(_subtype='mixed') 
     158        for k in headers.keys(): 
     159            try: 
     160                ascii = unicode(headers[k], 'ascii') 
     161                msg[k] = ascii 
     162            except UnicodeDecodeError: 
     163                msg[k] = Header(headers[k], charset) 
     164        msg.attach(msgtext) 
     165 
    140166        self.env.log.debug("Sending SMTP notification to %s on port %d" 
    141167                           % (self.smtp_server, self.smtp_port)) 
    142168        self.server.sendmail(self.from_email, [rcpt], msg.as_string())