I am in python3.4 .
import imaplib
import email
user="XXXX"
password="YYYY"
con=imaplib.IMAP4_SSL('imap.gmail.com')
con.login(user,password)
con.list()
con.select("INBOX")
result,data=con.fetch(b'1', '(RFC822)')
raw=email.message_from_bytes(data[0][1])
>>> raw["From"]
'xxxx'
>>> raw["To"]
'python-list@python.org'
>>> raw["Subject"]
'Re:get the min date from a list'
When i run 'print(raw)' there are many lines of the body of the email ,
i can't get it with raw[TEXT]
OR raw['TEXT']
OR raw['BODY']
,
how can i get the body of the email text?
You're asking it for a header named TEXT
or BODY
, and obviously there is no such thing. I think you're mixing up IMAP4 part names (the things you pass in con.fetch
) and RFC2822 header names (the things you use in an email.message.Message
).
As the email.message
documentation explains, a Message
consists of headers and a payload. The payload is either a string (for non-multipart messages) or a list of sub-Message
s (for multipart). Either way, what you want here is raw.get_payload()
.
If you want to handle both, you can either first check raw.is_multipart()
, or you can check the type returned from get_payload()
. Of course you have to do decide what you want to do in the case of a multipart message; what counts as "the body" when there are three parts? Do you want the first? The first text/plain
? The first text/*
? The first text/plain
if there is one, the first text/*
if not, and the first of anything if even that doesn't exist? Or all of them concatenated together?
Let's assume you just want the first one. To do that:
def get_text(msg):
if msg.is_multipart():
return get_text(msg.get_payload(0))
else:
return msg.get_payload(None, True)
If you want something different, hopefully you can figure out how to do it yourself. (See the get_content_type
and/or get_content_maintype
methods on Message
.)