| | 82 | from email.Charset import Charset, SHORTEST, QP, BASE64 |
| | 83 | self._charset = Charset() |
| | 84 | self._charset.header_encoding = BASE64 |
| | 85 | self._charset.body_encoding = BASE64 |
| | 86 | self._charset.input_charset = self._charset.output_charset = 'utf-8' |
| | 87 | self._charset.input_codec = self._charset.output_codec = 'utf-8' |
| | 88 | self._addr_re = re.compile("^\s*(.*)\s+<([\w\d_\-\.]+@[\w\d_\-\.]+)>\s*$"); |
| | 89 | |
| | 125 | def format_header(self, name, email=None): |
| | 126 | from email.Header import Header |
| | 127 | try: |
| | 128 | name = unicode(name, 'ascii') |
| | 129 | except UnicodeDecodeError: |
| | 130 | name = Header(name, self._charset) |
| | 131 | if not email: |
| | 132 | return name |
| | 133 | else: |
| | 134 | return "%s <%s>" % (name, email) |
| | 135 | |
| | 136 | def add_headers(self, msg, headers): |
| | 137 | for h in headers: |
| | 138 | value = headers[h] |
| | 139 | if isinstance(value, tuple): |
| | 140 | msg[h] = self.format_header(value[0], value[1]) |
| | 141 | continue |
| | 142 | mo = self._addr_re.match(value) |
| | 143 | if mo: |
| | 144 | msg[h] = self.format_header(mo.group(1), mo.group(2)) |
| | 145 | continue |
| | 146 | msg[h] = self.format_header(value) |
| | 147 | |
| | 158 | projname = self.config.get('project','name') |
| | 159 | |
| | 160 | headers = {} |
| | 161 | headers['X-Mailer'] = 'Trac %s, by Edgewall Software' % __version__ |
| | 162 | headers['X-Trac-Version'] = __version__ |
| | 163 | headers['X-Trac-Project'] = projname |
| | 164 | headers['X-URL'] = self.config.get('project','url') |
| | 165 | headers['Subject'] = self.subject |
| | 166 | headers['From'] = (projname, self.from_email) |
| | 167 | headers['Sender'] = self.from_email |
| | 168 | headers['Reply-To'] = self.replyto_email |
| | 169 | headers['To'] = rcpt |
| | 170 | headers['Date'] = formatdate() |
| | 171 | |
| 127 | | msg['X-Mailer'] = 'Trac %s, by Edgewall Software' % __version__ |
| 128 | | msg['X-Trac-Version'] = __version__ |
| 129 | | 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() |
| 138 | | for hdr in mime_headers.keys(): |
| 139 | | msg[hdr] = mime_headers[hdr] |
| | 173 | self.add_headers(msg, headers); |
| | 174 | self.add_headers(msg, mime_headers); |
| | 175 | |