diff --git a/Lib/email/Message.py b/Lib/email/Message.py index 4c6b3dae9b2..66f8640eb1f 100644 --- a/Lib/email/Message.py +++ b/Lib/email/Message.py @@ -5,6 +5,7 @@ """ import re +import uu import binascii import warnings from cStringIO import StringIO @@ -165,13 +166,15 @@ class Message: the list object, you modify the message's payload in place. Optional i returns that index into the payload. - Optional decode is a flag (defaulting to False) indicating whether the - payload should be decoded or not, according to the - Content-Transfer-Encoding header. When True and the message is not a - multipart, the payload will be decoded if this header's value is - `quoted-printable' or `base64'. If some other encoding is used, or - the header is missing, or if the payload has bogus base64 data, the - payload is returned as-is (undecoded). + Optional decode is a flag indicating whether the payload should be + decoded or not, according to the Content-Transfer-Encoding header + (default is False). + + When True and the message is not a multipart, the payload will be + decoded if this header's value is `quoted-printable' or `base64'. If + some other encoding is used, or the header is missing, or if the + payload has bogus data (i.e. bogus base64 or uuencoded data), the + payload is returned as-is. If the message is a multipart and the decode flag is True, then None is returned. @@ -185,15 +188,23 @@ class Message: if decode: if self.is_multipart(): return None - cte = self.get('content-transfer-encoding', '') - if cte.lower() == 'quoted-printable': + cte = self.get('content-transfer-encoding', '').lower() + if cte == 'quoted-printable': return Utils._qdecode(payload) - elif cte.lower() == 'base64': + elif cte == 'base64': try: return Utils._bdecode(payload) except binascii.Error: # Incorrect padding return payload + elif cte in ('x-uuencode', 'uuencode', 'uue', 'x-uue'): + sfp = StringIO() + try: + uu.decode(StringIO(payload+'\n'), sfp) + payload = sfp.getvalue() + except uu.Error: + # Some decoding problem + return payload # Everything else, including encodings with 8bit or 7bit are returned # unchanged. return payload