Python 版本 == 3.5
代码:
import getpass, poplib, email
Mailbox = poplib.POP3_SSL('pop.googlemail.com', '995')
Mailbox.user("email_here@gmail.com")
Mailbox.pass_('password_here')
numMessages = len(Mailbox.list()[1])
for i in range(numMessages):
info = b" ".join(Mailbox.retr(i+1)[1])
msg = email.message_from_bytes(info)
print(msg.keys())
输出:
['MIME-Version']
['MIME-Version']
['MIME-Version']
['Delivered-To']
['Delivered-To']
['Delivered-To']
['Delivered-To']
['Delivered-To']
['Delivered-To']
['Delivered-To']
['Delivered-To']
输出不正确,因为应该有更多字段
msg
除了 “MIME-Version”
和 “Delivered-To”
我认为
email.message_from_bytes()
解析字节字符串的内容
msg
不是字节字符串吗?
docs推荐这个:
M = poplib.POP3('localhost')
M.user(getpass.getuser())
M.pass_(getpass.getpass())
numMessages = len(M.list()[1])
for i in range(numMessages):
for j in M.retr(i+1)[1]:
print(j)
有没有办法使用电子邮件模块解析返回的消息? 这样我们就可以存储电子邮件详细信息。如发件人、正文、 header 等。
最佳答案
事实证明答案相当简单
import getpass, poplib, email
Mailbox = poplib.POP3_SSL('pop.googlemail.com', '995')
Mailbox.user("email_here@gmail.com")
Mailbox.pass_('password_here')
numMessages = len(Mailbox.list()[1])
for i in range(numMessages):
raw_email = b"\n".join(Mailbox.retr(i+1)[1])
parsed_email = email.message_from_bytes(raw_email)
print(parsed_email.keys())
不必用空格连接 raw_email
,只需用 \n
连接即可,email
模块可以正确解析字段:
使用电子邮件
模块也是一件很棒的事情
当您调用 email.message_from_bytes()
时,返回的输出是
一个字典
因此您可以像这样访问字段:
raw_email = b"\n".join(Mailbox.retr(i+1)[1])
parsed_email = email.message_from_bytes(raw_email)
print(parsed_email["header"])
但是如果该字段不存在怎么办?:
raw_email = b"\n".join(Mailbox.retr(i+1)[1])
parsed_email = email.message_from_bytes(raw_email)
print(parsed_email["non-existent field"])
上面的代码将返回 None
并且不会抛出 KeyError
关于python - 使用电子邮件模块(PYTHON)解析来自 poplib 的电子邮件内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35679338/