summaryrefslogtreecommitdiff
path: root/Lib/email
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/email')
-rw-r--r--Lib/email/base64mime.py20
-rw-r--r--Lib/email/header.py9
-rw-r--r--Lib/email/message.py6
-rw-r--r--Lib/email/quoprimime.py2
-rw-r--r--Lib/email/test/test_email.py4
5 files changed, 18 insertions, 23 deletions
diff --git a/Lib/email/base64mime.py b/Lib/email/base64mime.py
index 0035b79f6f..369bf10789 100644
--- a/Lib/email/base64mime.py
+++ b/Lib/email/base64mime.py
@@ -101,25 +101,19 @@ def body_encode(s, maxlinelen=76, eol=NL):
-def decode(s, convert_eols=False):
+def decode(string):
"""Decode a raw base64 string, returning a bytes object.
- If convert_eols is set to a string value, all canonical email linefeeds,
- e.g. "\\r\\n", in the decoded text will be converted to the value of
- convert_eols. os.linesep is a good choice for convert_eols if you are
- decoding a text attachment.
-
This function does not parse a full MIME header value encoded with
base64 (like =?iso-8895-1?b?bmloISBuaWgh?=) -- please use the high
level email.Header class for that functionality.
"""
- if not s:
- return s
-
- dec = a2b_base64(s)
- if convert_eols:
- return dec.replace(CRLF, convert_eols)
- return dec
+ if not string:
+ return bytes()
+ elif isinstance(string, str):
+ return a2b_base64(string.encode('raw-unicode-escape'))
+ else:
+ return a2b_base64(s)
# For convenience and backwards compatibility w/ standard base64 module
diff --git a/Lib/email/header.py b/Lib/email/header.py
index e03e42d6c1..786a71f647 100644
--- a/Lib/email/header.py
+++ b/Lib/email/header.py
@@ -341,10 +341,11 @@ class _ValueFormatter:
self._current_line = _Accumulator(headerlen)
def __str__(self):
- # Remove the trailing TRANSITIONAL_SPACE
- last_line = self._current_line.pop()
- if last_line is not TRANSITIONAL_SPACE:
- self._current_line.push(last_line)
+ # Remove any trailing TRANSITIONAL_SPACE
+ if len(self._current_line) > 0:
+ last_line = self._current_line.pop()
+ if last_line is not TRANSITIONAL_SPACE:
+ self._current_line.push(last_line)
self.newline()
return NL.join(self._lines)
diff --git a/Lib/email/message.py b/Lib/email/message.py
index 50d66041c1..e368737efd 100644
--- a/Lib/email/message.py
+++ b/Lib/email/message.py
@@ -201,7 +201,8 @@ class Message:
# Incorrect padding
pass
elif cte in ('x-uuencode', 'uuencode', 'uue', 'x-uue'):
- in_file = BytesIO(bytes(payload + '\n'))
+ payload += '\n'
+ in_file = BytesIO(payload.encode('raw-unicode-escape'))
out_file = BytesIO()
try:
uu.decode(in_file, out_file, quiet=True)
@@ -752,7 +753,8 @@ class Message:
# LookupError will be raised if the charset isn't known to
# Python. UnicodeError will be raised if the encoded text
# contains a character not in the charset.
- charset = str(bytes(charset[2]), pcharset)
+ as_bytes = charset[2].encode('raw-unicode-escape')
+ charset = str(as_bytes, pcharset)
except (LookupError, UnicodeError):
charset = charset[2]
# charset characters must be in us-ascii range
diff --git a/Lib/email/quoprimime.py b/Lib/email/quoprimime.py
index 1301e0b78d..e59479cbc7 100644
--- a/Lib/email/quoprimime.py
+++ b/Lib/email/quoprimime.py
@@ -58,7 +58,7 @@ _QUOPRI_HEADER_MAP = dict((c, '=%02X' % c) for c in range(256))
_QUOPRI_BODY_MAP = _QUOPRI_HEADER_MAP.copy()
# Safe header bytes which need no encoding.
-for c in b'-!*+/' + bytes(ascii_letters, 'ascii') + bytes(digits, 'ascii'):
+for c in b'-!*+/' + ascii_letters.encode('ascii') + digits.encode('ascii'):
_QUOPRI_HEADER_MAP[c] = chr(c)
# Headers have one other special encoding; spaces become underscores.
_QUOPRI_HEADER_MAP[ord(' ')] = '_'
diff --git a/Lib/email/test/test_email.py b/Lib/email/test/test_email.py
index 78d702d8ee..f7cac97dcc 100644
--- a/Lib/email/test/test_email.py
+++ b/Lib/email/test/test_email.py
@@ -2538,10 +2538,8 @@ class TestBase64(unittest.TestCase):
def test_decode(self):
eq = self.assertEqual
- eq(base64mime.decode(''), '')
+ eq(base64mime.decode(''), b'')
eq(base64mime.decode('aGVsbG8='), b'hello')
- eq(base64mime.decode('aGVsbG8=', 'X'), b'hello')
- eq(base64mime.decode('aGVsbG8NCndvcmxk\n', 'X'), b'helloXworld')
def test_encode(self):
eq = self.assertEqual