python / python/cpython

email with multipart/related content does not round-trip parsebytes/as_bytes

Ouverte
#136,686 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

stdlib topic-email type-bug
Langage dominant
Python
Étoiles
77.2k
Forks
36k
Métriques de merge des PR
Métriques de PR en attente

Description

Bug report

Bug description:
import email
import email.parser
import email.policy

with open('sample_email.eml', 'rb') as f:
    raw_email = f.read()

policy = email.policy.default.clone(cte_type='8bit', utf8=True, refold_source='none')
parser = email.parser.BytesParser(policy=policy)
decoded_email = parser.parsebytes(raw_email)
print("Defects: %s" % decoded_email.defects)
reencoded_email = decoded_email.as_bytes(policy=policy)
print("Two messages matches: %s" % (raw_email == reencoded_email))

sample_email.txt (save it as sample_email.eml)

When ran on different python versions (including 3.13), it raises UnicodeEncodeError:

Defects: []
Traceback (most recent call last):
  File "/var/tmp/etienne/sample_email.py", line 13, in <module>
    reencoded_email = decoded_email.as_bytes(policy=policy)
  File "/usr/lib/python3.13/email/message.py", line 208, in as_bytes
    g.flatten(self, unixfrom=unixfrom)
    ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/email/generator.py", line 117, in flatten
    self._write(msg)
    ~~~~~~~~~~~^^^^^
  File "/usr/lib/python3.13/email/generator.py", line 182, in _write
    self._dispatch(msg)
    ~~~~~~~~~~~~~~^^^^^
  File "/usr/lib/python3.13/email/generator.py", line 219, in _dispatch
    meth(msg)
    ~~~~^^^^^
  File "/usr/lib/python3.13/email/generator.py", line 286, in _handle_multipart
    g.flatten(part, unixfrom=False, linesep=self._NL)
    ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/email/generator.py", line 117, in flatten
    self._write(msg)
    ~~~~~~~~~~~^^^^^
  File "/usr/lib/python3.13/email/generator.py", line 182, in _write
    self._dispatch(msg)
    ~~~~~~~~~~~~~~^^^^^
  File "/usr/lib/python3.13/email/generator.py", line 219, in _dispatch
    meth(msg)
    ~~~~^^^^^
  File "/usr/lib/python3.13/email/generator.py", line 278, in _handle_multipart
    self.write(subparts)
    ~~~~~~~~~~^^^^^^^^^^
  File "/usr/lib/python3.13/email/generator.py", line 420, in write
    self._fp.write(s.encode('ascii', 'surrogateescape'))
                   ~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
UnicodeEncodeError: 'ascii' codec can't encode characters in position 330-333: ordinal not in range(128)
CPython versions tested on:

3.13

Operating systems tested on:

Linux

Linked PRs
  • gh-136848

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Reproduisez l’exemple avec email.parser.BytesParser et le sample_email.eml fourni, puis suivez email/message.py jusqu’à email/generator.py, en particulier _handle_multipart et write. C’est terminé lorsque as_bytes(policy=policy) s’exécute sans UnicodeEncodeError et que les octets réencodés correspondent à l’entrée d’origine ; consultez le PR lié gh-136848 avant de commencer.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
python
Domaine
backend
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
À clarifier
Accessibilité débutants
25/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.