Читайте почту в Python 3.7, используя imaplib с текстом HTML и вложениями в письме - PullRequest
0 голосов
/ 23 ноября 2018

Я был бы очень признателен, если бы кто-нибудь мог помочь мне с этой проблемой.

Я реализовал приведенный ниже код для чтения "непрочитанных писем из почтового ящика gmail".Мне нужно напечатать «Кому», «От кого», «Тема», «Тело» и «сохранить вложения в указанном месте»

У меня есть 2 проблемы здесь.

  1. Еслиесть любое письмо с вложениями, выдает ошибку Body: [<email.message.Message object at 0x026D1050>, <email.message.Message object at 0x02776B70>].Он напечатает все необходимые вещи и сохранит вложения, но НЕ печатает тело.

Это прекрасно работает, если вложение не включено.

Если в теле письма есть какой-либо стиль, например, «жирный / курсив / подчеркивание / цвет ... и т. Д.», Он не печатается как есть.

Пример: Python печатается как Python = C2 = A0i =, и иногда "*" разделяется другой стиль.

def get_body(email_message):
for payload in email_message.get_payload():
     # print('Body:\t', payload.get_payload())
     break
return(payload.get_payload())
def read_email(server,uname,pwd):
    username = uname
    password = pwd
    mail = imaplib.IMAP4_SSL(server)
    mail.login(username, password)
    mail.select("inbox")
    try:
        result, data = mail.uid('search', None, '(UNSEEN)')
        inbox_item_list = data[0].split()
        most_recent = inbox_item_list[-1]
        result2, email_data = mail.uid('fetch', most_recent, '(RFC822)')
        raw_email = email_data[0][1].decode("UTF-8")
        email_message = email.message_from_string(raw_email)
        for part in email_message.walk():
            if part.get_content_maintype() == 'multipart':
                continue
            if part.get('Content-Disposition') is None:
                continue
            filename = part.get_filename()
            att_path = os.path.join(location, filename)

            if not os.path.isfile(att_path):
                fp = open(att_path, 'wb')
                fp.write(part.get_payload(decode=True))
                fp.close()
                print('Downloaded file:', filename)
        if email_message.is_multipart():
            for payload in email_message.get_payload():
                print('To:\t\t', email_message['To'])
                print('From:\t',     email_message['From'])
                print('Subject:', email_message['Subject'])
                print('Date:\t',email_message['Date'])
                print('Body:\t', get_body(email_message))
                break        
        else:
            print('Nothing'])               
    except IndexError:
        print("No new email")
while True:
    read_email("imap.gmail.com", "s@gmail.com", "spassword")
time.sleep(10)

Большое спасибо

1 Ответ

0 голосов
/ 29 ноября 2018

Я новичок в python, и это полный рабочий код, который я сделал для чтения невидимых писем.Вы можете распечатать элементы в соответствии с вашими требованиями.Он работает для Gmail и Office 365. Этот скрипт выполняется каждые 10 секунд.Это также может работать для других поставщиков электронной почты, передавая учетные данные.Надеюсь это поможет.

import email
import imaplib
import os
import html2text
import time
detach_dir = 'locationWhereYouWantToSaveYourAttachments'


def get_body(email_message):
for payload in email_message.get_payload():
    break
return payload.get_payload()

def two_way_email(server,uname,pwd):
    username = uname
    password = pwd
    mail = imaplib.IMAP4_SSL(server)
    mail.login(username, password)
    mail.select("inbox")
    try:
        result, data = mail.uid('search', None, '(UNSEEN)')
        inbox_item_list = data[0].split()
        most_recent = inbox_item_list[-1]
        result2, email_data = mail.uid('fetch', most_recent, '(RFC822)')
        raw_email = email_data[0][1].decode("UTF-8")
        email_message = email.message_from_string(raw_email)

        for part in email_message.walk():
            if part.get_content_maintype() == 'multipart':
                continue
            if part.get('Content-Disposition') is None:
                continue

            filename = part.get_filename()
            att_path = os.path.join(detach_dir, filename)

            if not os.path.isfile(att_path):
                fp = open(att_path, 'wb')
                fp.write(part.get_payload(decode=True))
                fp.close()
                print('Downloaded file:', filename)
        if email_message.is_multipart():
            for payload in email_message.get_payload():
                print('To:\t\t', email_message['To'])
                print('From:\t',     email_message['From'])
                print('Subject:', email_message['Subject'])
                print('Date:\t',email_message['Date'])
                for part in email_message.walk():
                    if (part.get_content_type() == 'text/plain') and (part.get('Content-Disposition') is None):
                        print('Body:\t',part.get_payload())
                break
        else:
            print('To:\t\t', email_message['To'])
            print('From:\t', email_message['From'])
            print('Subject:', email_message['Subject'])
            print('Date:\t', email_message['Date'])
            print('Thread-Index:\t', email_message['Thread-Index'])
            text = f"{email_message.get_payload(decode=True)}"
            html = text.replace("b'", "")
            h = html2text.HTML2Text()
            h.ignore_links = True
            output = (h.handle(f'''{html}''').replace("\\r\\n", ""))
            output = output.replace("'", "")
            print(output)

    except IndexError:
        print("No new email")
while True:
    two_way_email("outlook.office365.com", "yourOffice365EmailAddressHere", "yourpassword")
    two_way_email("imap.gmail.com", "yourGmailAddressHere", "yourPassword")
    time.sleep(10)
...