Home » Django » Django not sending emails to admins

Django not sending emails to admins

Posted by: admin November 30, 2017 Leave a comment

Questions:

According to the documentation, if DEBUG is set to False and something is provided under the ADMINS setting, Django will send an email whenever the code raises a 500 status code. I have the email settings filled out properly (as I can use send_mail fine) but whenever I intentionally put up erroneous code I get my 500.html template but no error email is sent. What could cause Django to not do this?

Answers:

In my case the cause was missing SERVER_EMAIL setting.

The default for SERVER_EMAIL is [email protected]. But many of email servers including
my email provider do not accept emails from such suspicious addresses. They silently drop the emails.

Changing the sender email address to [email protected] solved the problem. In settings.py:

SERVER_EMAIL = '[email protected]'

Questions:
Answers:

Another possibility for error is trouble with your ADMINS setting. The following setting will cause the sending of mail to admins to fail quietly:

ADMINS = (
  ('your name', '[email protected]')
)

What’s wrong with that? Well ADMINS needs to be a tuple of tuples, so the above needs to be formatted as

ADMINS = (
  ('your name', '[email protected]'),
)

Note the trailing comma. Without the failing comma, the ‘to’ address on the email will be incorrectly formatted (and then probably discarded silently by your SMTP server).

Questions:
Answers:

I had the same situation. I created a new project and app and it worked, so I knew it was my code. I tracked it down to the LOGGING dictionary in settings.py. I had made some changes a few weeks back for logging with Sentry, but for some reason the error just started today. I changed back to the original and got it working:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler'
        }
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
    }
}

Then, I made some changes slowly and got it working with Sentry and emailing the ADMINS as well.

Additionally, the LOGGING configuration gets merged with DEFAULT_LOGGING by default, so it’s useful to have a look at the source code of django.utils.log.DEFAULT_LOGGING to understand what else may have an effect on your particular situation.

Questions:
Answers:

Make sure your EMAIL_HOST and EMAIL_PORT are set up right in settings.py (these refer to your SMTP server). It might be assuming that you have an SMTP server running on localhost.

To test this locally, run Python’s built-in test SMTP server:

python -m smtpd -n -c DebuggingServer localhost:1025

Then set these values in your settings.py

EMAIL_HOST='localhost'
EMAIL_PORT=1025

Trigger a 500 error, and you should see the e-mail appear in the python smtpd terminal window.

Questions:
Answers:

My web hosting provider – Webfaction – only allows emails to be sent From an email that has been explicitly created in the administrator panel. Creating one fixed the problem.

Questions:
Answers:

Make sure you have DEBUG = False

Questions:
Answers:

Sorry if it is too naive, but in my case the emails were sent but were going directly to the SPAM folder. Before trying more complicated things check your SPAM folder first.

Questions:
Answers:

Another thing worth noting here is that settings handler500 might bypass the mechanism that sends errors on a 500 if the response from the view doesn’t have a status code of 500.
If you have a handler500 set, then in that view respond with something like this.

t = loader.get_template('500.html')
response = HttpResponseServerError(
    t.render(RequestContext(request, {'custom_context_var': 
        'IT BROKE OMG FIRE EVERYONE'})))
response.status_code = 500
return response

Questions:
Answers:

Try this

# ./manage shell
>>> from django.core.mail import send_mail
>>> send_mail('Subject here', 'Here is the message.', '[email protected]',['[email protected]'], fail_silently=False)

With a [email protected] that you actually get email at.

Questions:
Answers:

Although it’s been a while, here’s my response, so that other people can benefit in the future.

In my case, what was preventing emails to be sent to the ADMINS list, when an error occured, was an application specific setting. I was using django-piston, which provides the setting attributes PISTON_EMAIL_ERRORS and PISTON_DISPLAY_ERRORS. Setting these accordingly, enabled the application server to notify my by mail, whenever piston would crash.

Questions:
Answers:

If, for some reason, you set DEBUG_PROPAGATE_EXCEPTIONS to True (it’s False by default), email to admin will not work.

Questions:
Answers:

… and then there’s the facepalm error, when you’ve used this in development to prevent emails from going out, and then accidentally copy the setting to production:

# Print emails to console
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

(of course you don’t see them being printed to console when using a wsgi server). Removing the setting from production fixed this for me.

Questions:
Answers:

While likely not ideal, I have found using Gmail as the SMTP host works just fine. There is a useful guide at nathanostgard.com.

Feel free to post your relevant settings.py sections (including EMAIL_*, SERVER_EMAIL, ADMINS (just take out your real email), MANAGERS, and DEBUG) if you want an extra set of eyes to check for typos!

Questions:
Answers:

For what it’s worth I had this issue and none of these suggestions worked for me. It turns out that my problem was that SERVER_EMAIL was set to an address that the server (Webfaction) didn’t recognise. If this site were hosted on Webfaction (as my other sites are), this wouldn’t be a problem, but as this was on a different server, the Webfaction servers not only check the authentication of the email being sent, but also the From: value as well.

Questions:
Answers:

In my case, it’s the include_html in mail_admins.

When I set include_html to True,the email server reject to send my email because it think that my emails are spam.

Everything works just fine when I set include_html to False.

Questions:
Answers:

And yet another thing that can go wrong (I’ll just add it to the list, for those people that end up here despite all the great answers above):

Our django setup used SendGrid as the smtp host and had a single admin email-address defined in the django settings. This worked fine for some time, but at some point, mails stopped arriving.

As it turns out, the mail address ended up in the SendGrid ‘Bounced’ list for some unknown reason, causing emails to that address to be silently dropped forever after. Removing the address from that list, and whitelisting it, fixed the issue.