FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

multipart/related mail generated with EmailMessage() class lacks mandatory MIME-Version header · Issue #120946 · python/cpython · GitHub

Repository navigation

multipart/related mail generated with EmailMessage() class lacks mandatory MIME-Version header #120946

Description

Bug report

Bug description:

When creating an email with EmailMessage() that contains an HTML part with images using a multipart/related structure as the outter MIME structure, the resulting mail contains non MIME-Version header. While the only valid value for the MIME-Version header is "1.0", this is a required header field for MIME structures, see https://datatracker.ietf.org/doc/html/rfc2045#section-4

Here is a simple example code:

#!/usr/bin/python3

import email.message

svgimg='<svg xmlns="http://www.w3.org/2000/svg"><circle cx="100" cy="100" r="50" fill="green"/></svg>'

outer = email.message.EmailMessage()

outer.make_related()

inner = email.message.EmailMessage()
inner.set_content("Hello")
inner.add_alternative("<img src='cid:imgid'>", subtype="html")

outer.attach(inner)
outer.add_related(svgimg.encode(), "image", "svg", cid="imgid")

print(outer.as_string())

The output starts like this:

From: test@example.com
To: test@example.org
Subject: Hello
Content-Type: multipart/related;
 boundary="===============4597207535328563093=="

[...]

It needs a "MIME-Version: 1.0" header in the main part. This will also cause some spam rating in e.g. spamassassin.

(Note: The example code uses multipart/related as the outer structure and multipart/alternative as the inner structure. While counterintuitive, this is how it is usually done by almost all mail clients. The example given in the python docs here https://docs.python.org/3/library/email.examples.html does it the other way round.)

CPython versions tested on:

3.12

Operating systems tested on:

Linux

Linked PRs

Activity

  1. added
    type-bugAn unexpected behavior, bug, or error
    on Jun 24, 2024
  2. rapidcow commented on Jul 14, 2024

    Contributor

    That's interesting. EmailMessage seems to only set MIME-Version in the set_content() method, so your outer.make_related() and outer.add_related() didn't really do anything more than what MIMEPart already defines. (FYI MIMEPart is the base class of EmailMessage that does not implicitly set MIME-Version.)

    Maybe we can do the same thing in the make_*() and add_*() methods too? But I am not a Python contributor, so I don't have a say... In the meantime though, adding outer['MIME-Version'] = '1.0' somewhere should do the trick. :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions


      Back | FazBrowse Home | New Git URL