PYTHON VERSION == 3.5
code:
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())
output:
['MIME-Version']
['MIME-Version']
['MIME-Version']
['Delivered-To']
['Delivered-To']
['Delivered-To']
['Delivered-To']
['Delivered-To']
['Delivered-To']
['Delivered-To']
['Delivered-To']
the output isn't correct because there should be more fields from the
msg
other than "MIME-Version"
and "Delivered-To"
I thought
email.message_from_bytes()
parses the contents of a byte string
is msg
not a byte string?
the docs recommend this:
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)
Is there a way to parse the returned message using the email module? so we can store the email details. like sender, body, header etc.
the answer turned out to be fairly easy
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())
instead of joining raw_email
with a space just join it by a \n
and the email
module can parse the fields correctly:
also an a awesome thing about using the email
module
is when you call email.message_from_bytes()
the output returned is
a dict
so you access the fields like this:
raw_email = b"\n".join(Mailbox.retr(i+1)[1])
parsed_email = email.message_from_bytes(raw_email)
print(parsed_email["header"])
but what if the field doesn't exist?:
raw_email = b"\n".join(Mailbox.retr(i+1)[1])
parsed_email = email.message_from_bytes(raw_email)
print(parsed_email["non-existent field"])
the above code will return None
and not throw a KeyError
来源:https://stackoverflow.com/questions/35679338/parsing-email-contents-from-poplib-with-email-module-python