|
12 | 12 | import random |
13 | 13 | import warnings |
14 | 14 |
|
| 15 | +from copy import deepcopy |
15 | 16 | from io import StringIO, BytesIO |
16 | 17 | from email._policybase import compat32 |
17 | 18 | from email.header import Header |
@@ -173,10 +174,18 @@ def _write(self, msg): |
173 | 174 | # necessary. |
174 | 175 | oldfp = self._fp |
175 | 176 | try: |
| 177 | + self._munge_cte = None |
176 | 178 | self._fp = sfp = self._new_buffer() |
177 | 179 | self._dispatch(msg) |
178 | 180 | finally: |
179 | 181 | self._fp = oldfp |
| 182 | + munge_cte = self._munge_cte |
| 183 | + del self._munge_cte |
| 184 | + # If we munged the cte, copy the message again and re-fix the CTE. |
| 185 | + if munge_cte: |
| 186 | + msg = deepcopy(msg) |
| 187 | + msg.replace_header('content-transfer-encoding', munge_cte[0]) |
| 188 | + msg.replace_header('content-type', munge_cte[1]) |
180 | 189 | # Write the headers. First we see if the message object wants to |
181 | 190 | # handle that itself. If not, we'll do it generically. |
182 | 191 | meth = getattr(msg, '_write_headers', None) |
@@ -225,9 +234,14 @@ def _handle_text(self, msg): |
225 | 234 | if _has_surrogates(msg._payload): |
226 | 235 | charset = msg.get_param('charset') |
227 | 236 | if charset is not None: |
| 237 | + # XXX: This copy stuff is an ugly hack to avoid modifying the |
| 238 | + # existing message. |
| 239 | + msg = deepcopy(msg) |
228 | 240 | del msg['content-transfer-encoding'] |
229 | 241 | msg.set_payload(payload, charset) |
230 | 242 | payload = msg.get_payload() |
| 243 | + self._munge_cte = (msg['content-transfer-encoding'], |
| 244 | + msg['content-type']) |
231 | 245 | if self._mangle_from_: |
232 | 246 | payload = fcre.sub('>From ', payload) |
233 | 247 | self._write_lines(payload) |
|
0 commit comments