Possibly other characters are illegal. The docs don't mention the use of
DEFAULT_FROM_EMAIL in this way, perhaps documentation can cover it.
--
Ticket URL: <https://code.djangoproject.com/ticket/28726>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
* stage: Unreviewed => Accepted
Old description:
> Using `DEFAULT_FROM_EMAIL = '[test] Bob <nor...@example.com>'` will fail
> in django.core.mail.message.sanitize_address() at
> `parseaddr(force_text(addr))`
>
> Possibly other characters are illegal. The docs don't mention the use of
> DEFAULT_FROM_EMAIL in this way, perhaps documentation can cover it.
New description:
Using `DEFAULT_FROM_EMAIL = '[test] Bob <nor...@example.com>'` will fail
in django.core.mail.message.sanitize_address() at `parseaddr(addr)`
Possibly other characters are illegal. The docs don't mention the use of
DEFAULT_FROM_EMAIL in this way, perhaps documentation can cover it.
--
Comment:
If `from_email` is not provided, `EmailMessage` or
`EmailMultiAlternatives` will use `DEFAULT_FROM_EMAIL`. If
DEFAULT_FROM_EMAIL is not a tuple `sanitize_address` will pass
DEFAULT_FROM_EMAIL to the function `parseaddr` from the `email` module in
the standard library. `parseaddr`will then try to parse RFC 2822
addresses.
Space and "(),:;<>@[\] characters are allowed with restrictions
([https://stackoverflow.com/a/2049510/4819353]). If you pass a suqare
bracket `[` to `parseaddr` it will return someting like this: `[('', ''),
('', 'test'), ('', ''), ('Bob', 'nor...@example.com')]`. Since
`sanitize_address`will use only the first element from the returned list,
you will get an error.
I suggest that the documentation mentions some of this.
{{{
DEFAULT_FROM_EMAIL¶
...
The value should be a tuple containing two strings, `(name, address)`, or
a string in the form of `name <em...@example.com>`.
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/28726#comment:1>
Comment (by Jonatas CD):
Should also the default value be changed to a tuple?
Seems somewhat more coherent to me.
What do you think?
--
Ticket URL: <https://code.djangoproject.com/ticket/28726#comment:2>
* owner: nobody => Rebeca Sarai
* status: new => assigned
--
Ticket URL: <https://code.djangoproject.com/ticket/28726#comment:3>
* status: assigned => new
* owner: Rebeca Sarai => (none)
--
Ticket URL: <https://code.djangoproject.com/ticket/28726#comment:4>
* type: Bug => Cleanup/optimization
* easy: 1 => 0
Comment:
Changing the default value to a tuple could be backwards incompatible.
I'm not sure if documentation is needed here, however, it could be helpful
to improve the exception:
{{{
File "/home/tim/code/django/tests/mail/tests.py", line 845, in
test_html_send_mail
send_mail('Subject', 'Content', '[test] Bob <nor...@example.com>',
['nob...@example.com'], html_message='HTML Content')
File "/home/tim/code/django/django/core/mail/__init__.py", line 62, in
send_mail
return mail.send()
File "/home/tim/code/django/django/core/mail/message.py", line 349, in
send
return self.get_connection(fail_silently).send_messages([self])
File "/home/tim/code/django/django/core/mail/backends/smtp.py", line
111, in send_messages
sent = self._send(message)
File "/home/tim/code/django/django/core/mail/backends/smtp.py", line
123, in _send
from_email = sanitize_address(email_message.from_email, encoding)
File "/home/tim/code/django/django/core/mail/message.py", line 161, in
sanitize_address
address = Address(nm, addr_spec=addr)
File "/home/tim/code/cpython/Lib/email/headerregistry.py", line 42, in
__init__
a_s, rest = parser.get_addr_spec(addr_spec)
File "/home/tim/code/cpython/Lib/email/_header_value_parser.py", line
1986, in get_addr_spec
token, value = get_local_part(value)
File "/home/tim/code/cpython/Lib/email/_header_value_parser.py", line
1798, in get_local_part
if value[0] in CFWS_LEADER:
IndexError: string index out of range
}}}
That might involve patching cpython rather than Django.
--
Ticket URL: <https://code.djangoproject.com/ticket/28726#comment:3>
* cc: Adam (Chainz) Johnson (added)
Comment:
Maybe we can add a system check?
--
Ticket URL: <https://code.djangoproject.com/ticket/28726#comment:4>
Comment (by Tim Graham):
I also considered suggesting a system check but I doubt the issue is
common enough to justify it. The problem could also happen when using the
`from_email` argument of `EmailMessage` and improving the exception will
address that.
--
Ticket URL: <https://code.djangoproject.com/ticket/28726#comment:5>
* status: new => assigned
* owner: nobody => Glenn Paquette
--
Ticket URL: <https://code.djangoproject.com/ticket/28726#comment:6>
* status: assigned => closed
* version: 1.11 => 3.0
* resolution: => fixed
Comment:
Changing `DEFAULT_FROM_EMAIL` documentation doesn't solve it because you
can always use `from_email` argument of `EmailMessage` (as Tim pointed
out).
Moreover this issue was solved in 2628ea95151feb68f43a2a740e6fb0799a94b14b
that improved an exception:
{{{
File "/django/django/core/mail/message.py", line 84, in sanitize_address
raise ValueError('Invalid address "%s"' % addr)
ValueError: Invalid address "[test] Bob <nor...@example.com>"
}}}
I don't think that changes in documentation are required.
--
Ticket URL: <https://code.djangoproject.com/ticket/28726#comment:7>