#35497: Long email address causes crash when generating a message
---------------------------------------------+------------------------
Reporter: Alexandru Chirila | Owner: nobody
Type: Bug | Status: new
Component: Core (Mail) | Version: 5.0
Severity: Normal | Keywords:
Triage Stage: Unreviewed | Has patch: 0
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
---------------------------------------------+------------------------
Trying to generate an email message that has a long recipient address and
non-ASCII characters causes a crash.
How to reproduce:
{{{
EmailMessage(to=["ţēśţ." * 6 + "@
example.com"]).message()
}}}
Looking for an existing issue I have found #31784. It seems like the issue
there was only fixed for long names and long addresses.
----
Version info:
- Django: 5.0.6
- Python: 3.12.3
----
Full log:
{{{#!python
In [2]: from django.core.mail import EmailMessage
In [3]: EmailMessage(to=["ţēśţ." * 6 + "@
example.com"]).message()
---------------------------------------------------------------------------
UnicodeEncodeError Traceback (most recent call
last)
File .venv/lib/python3.12/site-packages/django/core/mail/message.py:64, in
forbid_multi_line_headers(name, val, encoding)
63 try:
---> 64 val.encode("ascii")
65 except UnicodeEncodeError:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3:
ordinal not in range(128)
During handling of the above exception, another exception occurred:
ValueError Traceback (most recent call
last)
Cell In[3], line 1
----> 1 EmailMessage(to=["ţēśţ." * 6 + "@
example.com"]).message()
File .venv/lib/python3.12/site-packages/django/core/mail/message.py:267,
in EmailMessage.message(self)
265 msg["Subject"] = self.subject
266 msg["From"] = self.extra_headers.get("From", self.from_email)
--> 267 self._set_list_header_if_not_empty(msg, "To",
self.to)
268 self._set_list_header_if_not_empty(msg, "Cc", self.cc)
269 self._set_list_header_if_not_empty(msg, "Reply-To", self.reply_to)
File .venv/lib/python3.12/site-packages/django/core/mail/message.py:432,
in EmailMessage._set_list_header_if_not_empty(self, msg, header, values)
430 except KeyError:
431 value = ", ".join(str(v) for v in values)
--> 432 msg[header] = value
File .venv/lib/python3.12/site-packages/django/core/mail/message.py:165,
in SafeMIMEText.__setitem__(self, name, val)
164 def __setitem__(self, name, val):
--> 165 name, val = forbid_multi_line_headers(name, val,
self.encoding)
166 MIMEText.__setitem__(self, name, val)
File .venv/lib/python3.12/site-packages/django/core/mail/message.py:67, in
forbid_multi_line_headers(name, val, encoding)
65 except UnicodeEncodeError:
66 if name.lower() in ADDRESS_HEADERS:
---> 67 val = ", ".join(
68 sanitize_address(addr, encoding) for addr in
getaddresses((val,))
69 )
70 else:
71 val = Header(val, encoding).encode()
File .venv/lib/python3.12/site-packages/django/core/mail/message.py:68, in
<genexpr>(.0)
65 except UnicodeEncodeError:
66 if name.lower() in ADDRESS_HEADERS:
67 val = ", ".join(
---> 68 sanitize_address(addr, encoding) for addr in
getaddresses((val,))
69 )
70 else:
71 val = Header(val, encoding).encode()
File .venv/lib/python3.12/site-packages/django/core/mail/message.py:120,
in sanitize_address(addr, encoding)
117 localpart = Header(localpart, encoding).encode()
118 domain = punycode(domain)
--> 120 parsed_address = Address(username=localpart, domain=domain)
121 return formataddr((nm, parsed_address.addr_spec))
File ~/.pyenv/versions/3.12.3/lib/python3.12/email/headerregistry.py:33,
in Address.__init__(self, display_name, username, domain, addr_spec)
31 inputs = ''.join(filter(None, (display_name, username, domain,
addr_spec)))
32 if '\r' in inputs or '\n' in inputs:
---> 33 raise ValueError("invalid arguments; address parts cannot
contain CR or LF")
35 # This clause with its potential 'raise' may only happen when an
36 # application program creates an Address object using an addr_spec
37 # keyword. The email library code itself must always supply
username
38 # and domain.
39 if addr_spec is not None:
ValueError: invalid arguments; address parts cannot contain CR or LF
}}}
--
Ticket URL: <
https://code.djangoproject.com/ticket/35497>
Django <
https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.