Skip to content

email.parser header-only parsing records MultipartInvariantViolationDefect for valid multipart emails #106186

Closed

Description

@me-and

Bug report

A valid multipart email message, when parsed with email.parser.HeaderParser(policy=email.policy.default) will record a email.errors.MultipartInvariantViolationDefect.

If the parser isn't going to attempt to parse the message body, it shouldn't report that as a defect.

Simple test script:

import email.parser
import email.policy

email_str = '''\
Date: 01 Jan 2001 00:01+0000
From: [email protected]
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=autocracy

--autocracy
Content-Type: text/plain

By hanging on to outdated imperialist dogma which perpetuates the economic and
social differences in our society.

--autocracy
Content-Type: text/html

<html><body><p>By hanging on to outdated imperialist dogma which perpetuates
the economic and social differences in our society.</p></body></html>

--autocracy--
'''

full_parser = email.parser.Parser(policy=email.policy.default)
parsed_email_full = full_parser.parsestr(email_str)
print(parsed_email_full.defects)  # Prints [] as expected

header_parser = email.parser.HeaderParser(policy=email.policy.default)
parsed_email_headers_only = header_parser.parsestr(email_str)
print(parsed_email_headers_only.defects)  # Prints [MultipartInvariantViolationDefect()]

Your environment

  • Debian 12
  • Raspberry Pi 4 (arm64)
  • Python 3.11.2 (Debian package 3.11.2-1+b1)

Linked PRs

Activity

  1. added
    type-bugAn unexpected behavior, bug, or error
    on Jun 28, 2023
  2. htsedebenham commented on Jul 22, 2023

    @htsedebenham
    Contributor

    I believe this is the expected behaviour. Per the documentation, HeaderParser acts like Parser with headersonly=True. Modifying the test script as follows, the printed value is [MultipartInvariantViolationDefect()].

    email_str = '''\
    Date: 01 Jan 2001 00:01+0000
    From: [email protected]
    MIME-Version: 1.0
    Content-Type: multipart/mixed; boundary=autocracy
    
    --autocracy
    Content-Type: text/plain
    
    By hanging on to outdated imperialist dogma which perpetuates the economic and
    social differences in our society.
    
    --autocracy
    Content-Type: text/html
    
    <html><body><p>By hanging on to outdated imperialist dogma which perpetuates
    the economic and social differences in our society.</p></body></html>
    
    --autocracy--
    '''
    
    full_parser = email.parser.Parser(policy=email.policy.default)
    parsed_email_full = full_parser.parsestr(email_str)
    print(parsed_email_full.defects)  # Prints [] as reported
    
    full_parser = email.parser.Parser(policy=email.policy.default)
    parsed_email_full = full_parser.parsestr(email_str, headersonly=True)
    print(parsed_email_full.defects)  # Prints[MultipartInvariantViolationDefect()]
    
    header_parser = email.parser.HeaderParser(policy=email.policy.default)
    parsed_email_headers_only = header_parser.parsestr(email_str)
    print(parsed_email_headers_only.defects)  # Prints [MultipartInvariantViolationDefect()]
    
  3. htsedebenham commented on Jul 22, 2023

    @htsedebenham
    Contributor

    I see the issue, looking into it now.

  4. ambv commented on Jul 23, 2023

    @ambv
    Contributor

    Per documentation of Parser.parse():

    Optional headersonly is a flag specifying whether to stop parsing after reading the headers or not. The default is False, meaning it parses the entire contents of the file.

    From this reading, the issue is valid and the fix in the attached PR is the correct bugfix.

  5. added a commit that references this issue on Jul 23, 2023
  6. added 2 commits that reference this issue on Jul 23, 2023
  7. added 2 commits that reference this issue on Jul 23, 2023
  8. added a commit that references this issue on Jul 23, 2023
  9. added a commit that references this issue on Jul 23, 2023
  10. added
    stdlibStandard Library Python modules in the Lib/ directory
    on Nov 26, 2023
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

    stdlibStandard Library Python modules in the Lib/ directorytype-bugAn unexpected behavior, bug, or error

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions