GAミント至上主義

安くて速いが好きなWEBアプリ開発者。最近はPython, Vue.js, Firebase, GKE。@株式会社ビズオーシャン

DjangoのAdminsにメールが送られない時のチェックリスト

Djangoではsettings.pyのADMINSにメールアドレスを指定しておくと、エラー時に通知を送ってくれるので便利。

でもこれまでの開発でもよくなぜか届かない問題があり、最近Templyの開発でも起きたので備忘録。

temply.bizocean.jp


まず、メールサーバーの設定が済んでいて、django.core.mail.send_mailで送れることは前提として話を進める。

ADMINSの設定

名前、メールアドレスのタプルのリストを設定
https://docs.djangoproject.com/en/2.0/ref/settings/#admins

DEBUG=False

これは本番では間違えないと思うし当たり前だけど一応。

LOGGINGの設定

今回の原因1つ目
ログを受け取ってメールにしているので設定に追加が必要。

下記抜粋

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'standard': {
            'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
        },
    },
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse',
        },
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
            'include_html': True,
            'filters': ['require_debug_false'],
        },
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': os.environ.get('DJANGO_LOG_LEVEL', 'INFO'),
            'propagate': True,
        },
    },
}

SERVER_EMAILの設定

今回の原因2つ目

似たようなメールの送信元としてDEFAULT_FROM_EMAILがあるが、ADMINSとMANAGERSはこれを使わない。
代わりにSERVER_EMAILを使っており、設定しないとroot@localhostが使われてしまう。

自前のメールサーバーであれば問題ないかもしれないが、今回メールのbackendに使っていたsendgridでは問題があるようで、スパムにも入らず消えてしまっていた。

https://docs.djangoproject.com/en/2.0/ref/settings/#server-email

SERVER_EMAIL = 'admins@sample.jp'

1日で理解するDjango超基礎入門

1日で理解するDjango超基礎入門

Django1.10 QUICKSTART-BOOK with Python3: 作りながら学ぶDjangoアプリケーション開発

Django1.10 QUICKSTART-BOOK with Python3: 作りながら学ぶDjangoアプリケーション開発