def _encode_parts(self, header_data, msg_data, encoder): """Encodes any MIME part in the current message that is 8-bit. :type header_data: :py:obj:`bytes` :type msg_data: :py:obj:`bytes` """ self.headers = None self.message = None if six.PY3: msg = BytesParser().parsebytes(header_data+msg_data) else: msg = Parser().parsestr(header_data+msg_data) for part in msg.walk(): if not part.is_multipart(): payload = part.get_payload() try: payload.encode('ascii') except UnicodeError: del part['Content-Transfer-Encoding'] encoder(part) self.parse_msg(msg)
def parse(self, data): """Parses the given string to populate the :attr:`headers` and :attr:`message` attributes. :param data: The complete message, headers and message body. :type data: :py:obj:`bytes` """ check_argtype(data, bytes, 'data') match = re.search(_HEADER_BOUNDARY, data) if not match: header_data = data payload = b'' else: header_data = data[:match.end(0)] payload = data[match.end(0):] header_data_decoded = utf8only_decode(header_data) self.headers = Parser().parsestr(header_data_decoded, True) self.message = self.headers.get_payload().encode('ascii') + payload self.headers.set_payload('')