如何阅读 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_seen
和 uid
将电子邮件标记为已读。
我还在下面添加了示例代码。
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 作者。
我想从 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_seen
和 uid
将电子邮件标记为已读。
我还在下面添加了示例代码。
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 作者。