【问题标题】:How to read HTML email - Python如何阅读 HTML 电子邮件 - Python
【发布时间】:2021-11-01 19:39:51
【问题描述】:

我想从 IMAP 邮箱中读取电子邮件,并在每次有新电子邮件进入时提取“From”、“Subject”和“Body”(即 HTML),它应该使未读的电子邮件被读取并最终将电子邮件放入字典。我做了整个事情,除了将未读电子邮件更改为阅读的部分。这对于我使用的“imbox”模块似乎是不可能的。我避免使用 imaplib,因为它看起来非常低级/复杂,我认为应该以更简单的方式完成,当然如果没有其他方法,则必须使用 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)

它返回这样的一行:

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

但电子邮件在邮箱中仍然未读,因此每次都需要相同的未读电子邮件。 是否可以修改我的代码,以便将电子邮件从未读更改为已读,也许还有一些额外的模块?

【问题讨论】:

    标签: python email imap imaplib


    【解决方案1】:

    根据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)
    
    

    【讨论】:

      【解决方案2】:

      试用库: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 标志

      问候,lib 作者。

      【讨论】:

        猜你喜欢
        • 2015-10-20
        • 2019-04-29
        • 1970-01-01
        • 2019-05-14
        • 2015-07-08
        • 2011-03-21
        • 1970-01-01
        • 2020-04-30
        • 2014-08-03
        相关资源
        最近更新 更多