我想扫描我的电子邮件以便能够找到最常发件人。我有这段技术上可行的代码:
`from other import username, password
from imapclient import IMAPClient
import pprint
with IMAPClient(host="outlook.office365.com", use_uid=True) as mb:
mb.login(username, password)
mb_info = mb.select_folder('INBOX')
messages = mb.search("ALL")
some_messages = messages[:10]
response = mb.fetch(some_messages, 'ENVELOPE')
pprint.pprint(response)`
我在响应中获得了比我需要的更多的信息。我已经强调了我真正想要的唯一数据:
我希望能够执行下面这样的操作,但这不起作用:
`response = mb.fetch(some_messages, 'ENVELOPE.from_')`
有谁知道我可以在 fetch 命令中放入什么来实现此目的?我一直在寻找参数传递到 fetch 方法的语法和规则,但我只看到过三个示例:“ENVELOPE”、“RFC822”和“INTERNALDATE”。
我可以访问我想要的数据稍后在代码中使用它来创建所有发件人的列表:
`from_list = [response[thing][b'ENVELOPE'].from_[0].name for thing in response.keys()]`
它有效,但我希望我的代码更加简洁。因此,如果我可以通过修改传递给 .fetch() 的内容来避免这样做,我肯定会更喜欢这样做。
不能使用 IMAP
fetch
命令仅检索信封的 "from" 部分。
ENVELOPE
、
RFC822
和
INTERNALDATE
等选项是预定义的数据项,不能进一步细化。
的选择是:
-
继续使用当前方法: 这可能不是最有效的方法,但它有效,并且代码易于理解。如果处理的邮件数量较少,这可能不是什么大问题。
-
使用
BODYSTRUCTURE
命令:BODYSTRUCTURE
命令返回邮件的结构化表示形式,包括信封信息。可以解析此响应以仅提取 "from" 地址。这将需要更复杂的代码,但可以减少传输的数据量,尤其是在处理大型邮件时。
以下是使用
BODYSTRUCTURE
命令的示例:
from imapclient import IMAPClient
with IMAPClient(host="outlook.office365.com", use_uid=True) as mb:
mb.login(username, password)
mb.select_folder('INBOX')
messages = mb.search("ALL")
some_messages = messages[:10]
# 获取 BODYSTRUCTURE 信息
response = mb.fetch(some_messages, 'BODYSTRUCTURE')
# 提取每个邮件的 "from" 地址
from_list = []
for msg_id, data in response.items():
envelope = data[b'BODYSTRUCTURE'][0] # 假设是第一部分
from_addr = envelope.from_[0]
from_list.append(from_addr)
print(from_list)
这个代码片段首先获取所选邮件的
BODYSTRUCTURE
。然后,它遍历每个邮件的响应,并从
envelope
部分中提取 "from" 地址。
请记住,解析
BODYSTRUCTURE
响应可能很复杂,具体取决于邮件的结构。可能需要参考 RFC 3501 以了解
BODYSTRUCTURE
响应的完整格式。