How to get get_body() to work? (about email)

Thomas Passin list1 at tompassin.net
Sun Mar 19 13:34:00 EDT 2023


On 3/18/2023 10:49 PM, Peng Yu wrote:
> Hi,
> 
> https://docs.python.org/3/library/email.parser.html
> 
> It says "For MIME messages, the root object will return True from its
> is_multipart() method, and the subparts can be accessed via the
> payload manipulation methods, such as get_body(), iter_parts(), and
> walk()."
> 
> But when I try the following code, get_body() is not found. How to get
> get_body() to work?
> 
> $ python3 -c 'import email, sys; msg =
> email.message_from_string(sys.stdin.read()); print(msg.get_body())'
> <<< some_text
> Traceback (most recent call last):
>    File "<string>", line 1, in <module>
> AttributeError: 'Message' object has no attribute 'get_body'
> 
A Message object does not have a get_body method, but an EmailMessage 
object does.

In the Python 3.10 docs, Just before the part you quoted, there is this 
sentence:

"You can pass the parser a bytes, string or file object, and the parser 
will return to you the root EmailMessage instance of the object 
structure".

So if you want to use get_body(), you should be feeding the parser your 
message string, rather than using email.message_from_string(), which 
returns a Message, not an EmailMessage.

With a Message object, you could use get_payload(), which will give you 
a list of Messages for each MIME part of the document.  When a part is 
not a multipart, it will give you a string, which sounds like what you 
want to end up with.

(see https://docs.python.org/3.10/library/email.compat32-message.html)


More information about the Python-list mailing list