I had a local postfix mail server setup and trying to send an email with the following setting:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_TLS = False
EMAIL_HOST = 'localhost'
EMAIL_PORT = 25
DEFAULT_FROM_EMAIL = 'TEST <test@blah.com>'
Here is the code responsible for sending the email:
email = EmailMessage(
subject=subject,
body=message,
from_email='test@blah.com',
to=uers,
cc=applicants + cc_email,
reply_to=uers,
)
email.content_subtype = 'html'
try:
email.send(fail_silently=False)
Because the mail server is setup locally, there is no need to supply any user name or password. So I didn't bother to specify them in the settings.py. When I had the server running, here is the error that I encountered:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/cheng/.virtualenvs/diandi/lib/python2.7/site-packages/django/core/mail/__init__.py", line 61, in send_mail
return mail.send()
File "/home/cheng/.virtualenvs/diandi/lib/python2.7/site-packages/django/core/mail/message.py", line 292, in send
return self.get_connection(fail_silently).send_messages([self])
File "/home/cheng/.virtualenvs/diandi/lib/python2.7/site-packages/django/core/mail/backends/smtp.py", line 100, in send_messages
new_conn_created = self.open()
File "/home/cheng/.virtualenvs/diandi/lib/python2.7/site-packages/django/core/mail/backends/smtp.py", line 67, in open
self.connection.login(self.username, self.password)
File "/usr/local/lib/python2.7.10/lib/python2.7/smtplib.py", line 585, in login
raise SMTPException("SMTP AUTH extension not supported by server.")
SMTPException: SMTP AUTH extension not supported by server.
The error message is very misleading, but this particular caught my eyes:
self.connection.login(self.username, self.password)
I didn't specify any username and password because I don't think I need them. Maybe I should put them back in? So I added the following lines:
EMAIL_HOST_USER = ''
EMAIL_HOST_PASSWORD = ''
Wholah, it worked! But why? So I looked under the hood:
self.username = settings.EMAIL_HOST_USER if username is None else username
self.password = settings.EMAIL_HOST_PASSWORD if password is None else password
When using the EmailBackend
class, a username and password can be passed in as parameters. I didn't pass either of them in my view function. Thus, Django defaults them to settings.EMAIL_HOST_USER
and settings.EMAIL_HOST_PASSWORD
. However, EMAIL_HOST_USER
and EMAIL_HOST_PASSWORD
are not defined in the settings file. So by the time self.connection.login(self.username, self.password)
is called, both username and password are None.
The error message SMTP AUTH extension not supported by server
is generated by python's own smtp library. I guess Django can throw a more meaningful error before this to make this error more apparent.