How to get the body text of email with imaplib?
Question: 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?


Answer: 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`](https://docs.python.org/3/library/email.message.html)
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`.)

