如何阅读 HTML 电子邮件 - Python

How to read HTML email - Python

我想从 IMAP 邮箱中读取邮件并提取“发件人”、“主题”和“正文”(即 HTML),每次收到新邮件时,它应该让未读邮件被阅读并最终将电子邮件放入字典中。除了将未读电子邮件更改为阅读的部分外,我几乎完成了所有事情。对于我使用的 'imbox' 模块,这似乎是不可能的。我避免使用imaplib,因为它看起来很低level/complex而且我认为应该以更简单的方式完成,当然如果没有其他方法,则必须使用imaplib。

代码如下:

from imbox import Imbox
import html2text

with Imbox('<IMAP SERVER>',
username='<USER>',
password='<PASS>',
ssl=True,
ssl_context=None,
starttls=False) as imbox:

unread_inbox_messages = imbox.messages(unread=True)
for uid, message in unread_inbox_messages:
    mail_from = message.sent_from[0]['email']
    mail_subject =  message.subject
    h = html2text.HTML2Text()
    h.ignore_links = True
    output = (h.handle(f'''{message.body['plain']}''').replace("\r\n", ""))
    output = output.replace("\n", "")
    mail_body = output[2:-2]
    mail_dict = {
        'email': {
            'From': mail_from,
            'Subject': mail_subject,
            'Body': mail_body
        }
    }
print(mail_dict)

它returns这样一行:

{'email': {'From': 'emailaddress@email.com', 'Subject': 'subject', 'Body': 'body message'}} 

但是邮件在邮箱里一直保持未读状态,所以每次都是一样的未读邮件。 是否可以修改我的代码,以便将电子邮件从未读更改为已读,也许还有一些额外的模块?

根据 documentation,您可以使用函数 mark_seenuid 将电子邮件标记为已读。

我还在下面添加了示例代码。

from imbox import Imbox
with Imbox('imap.gmail.com', username='username', password='password',
        ssl=True, ssl_context=None, starttls=False) as imbox:

        # fetch all messages from inbox
        all_inbox_messages = imbox.messages()
        
        for uid, message in all_inbox_messages:
        
            # mark the message as read
            imbox.mark_seen(uid)

尝试库:https://github.com/ikvk/imap_tools

from imap_tools import MailBox

with MailBox('imap.mail.com').login('test@mail.com', 'pwd') as mailbox:
    for msg in mailbox.fetch():  # all by default, mark_seen=True by default
        from_ = msg.from_
        subject = msg.subject
        body = msg.html or msg.text
        uids_for_move = []
        if 'cat' in body:
            uids_for_move.append(msg.uid)
    mailbox.move(uids_for_move, 'INBOX/cats')

此外,如果 mark_seen=False,您可以使用 mailbox.flag 来设置 MailMessageFlags.SEEN flag

问候,lib 作者。