У объекта 'str' нет атрибута 'is_multipart' при анализе тела письма - PullRequest
0 голосов
/ 04 июля 2019

Я создал функцию, которая запрашивает электронную почту Outlook. Это прекрасно работает для запроса заголовков писем за последние семь дней. Тем не менее, я не могу вернуть тело. Я перепробовал все, чтобы это исправить, но не уверен, где я иду не так.

Я пытался преобразовать обратно в байтовый объект, но я потерял

class OutlookAccount(object):
    def __init__(self, username=None, password=None, folder=None):
        self.username = username
        self.password = password
        self.folder = folder

    def login(self):
        self.conn = IMAP4_SSL('outlook.office365.com')
        response = self.conn.login(self.username, self.password)
        return response

    def search(self, query, folder=None, readonly=False):
        ff = self.folder if self.folder else folder
        self.conn.select(ff, readonly)
        resp, data = self.conn.search(None, query)
        return data

    def fetch(self, uids, query):
        uid_arr = b','.join(uids[0].split())
        resp, data = self.conn.fetch(uid_arr, query)
        return data

    def fetch_and_parse(self, uids, query):
        data = self.fetch(uids, query)
        parser = HeaderParser()
        emails = []

        for email in data:
            if len(email) < 2:
                continue
            msg = em.message_from_bytes(email[1]).as_string()
            emails.append(parser.parsestr(msg))

        if msg.is_multipart():
            for part in mime_msg.walk():
                if part.is_multipart():
                    for subpart in part.get_payload():
                        if subpart.is_multipart():
                            for subsubpart in subpart.get_payload():
                                body = body + str(subsubpart.get_payload(decode=True)) + '\n'

                        else:
                            body = body + str(subpart.get_payload(decode=True)) + '\n'

                else:
                    body = body + str(part.get_payload(decode=True)) + '\n'

        else:
            body = body + str(mime_msg.get_payload(decode=True)) + '\n'


        body = bytes(body,'utf-8').decode('unicode-escape')   
        emails.append(body)

        return emails

    def load_parse_query(self, search_query, fetch_query, folder=None, readonly=False):
        '''Perform search and fetch on an imap Gmail account. After fetching relevant info
        from fetch query, parse into a dict-like email object, return list of emails.'''
        uids = self.search(search_query, folder, readonly)
        return self.fetch_and_parse(uids, fetch_query)

Тело электронной почты возвращается в текстовом формате

...