DjangoのロガーでSMTP送信する方法

ノウハウ
スポンサーリンク

Djangoでメール送信の設定を「django.utils.log.AdminEmailHandler」で紹介しているブログ[1]はよくあるのですが、「logging.handlers.SMTPHandler」で設定しているブログがなかったため、公式サイト[2]を調べながら設定しました。

目次

 


 

ロガーの設定

handlersemailloggerssendmailを追加します。
TLSを使うためにsecureに空のタプルを送る必要があるのがポイント!

settings.py(追記) (例)
# Mail
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = "Gメールのユーザ名"
EMAIL_HOST_PASSWORD = "Gメールのアプリパスワード"
EMAIL_USE_TLS = True

# LOGGING
LOGGING = {
    'handlers': {
        'email': {
            'level': 'CRITICAL',
            'class':'logging.handlers.SMTPHandler',
            'mailhost': EMAIL_HOST,
            'fromaddr': 'メールの送信元アドレス',
            'toaddrs': ['メールの宛先アドレス'],
            'subject': 'メールの件名',
            'credentials': (EMAIL_HOST_USER, EMAIL_HOST_PASSWORD),
            'secure': (),
        },
    },
    'loggers': {
        'sendmail': {
            'handlers': ['console', 'file', 'email'],
            'level': 'DEBUG',
            'propagate': False,
        },
    },
}

・上の例ではGメールを想定していますが、使用するメーラーによってEMAIL_*系の変数は変更してください。
handlersemailloggerssendmailの設定は、ご自分の環境に合わせて設定してください。

※補足 独自アプリでGメールを使うにはアプリパスワードが必要です。詳しくは「DjangoでGメールを送る方法」をご覧ください。

 

 

メールを送信してみる

せっかくなので、Gメールへの送信を確認しています。
ここでは、sendmailというコマンドを作成しようと思います。

 

事前準備 コマンド関連ファイルの作成

myappというアプリにコマンドを追加していきます。

 

コマンド実行
(Pjojectを作っていなかったら以下を実行)
$ django-admin startproject mysite .
(事前準備)
$ cd mysite
$ python manage.py startapp myapp
$ mkdir -p myapp/management/commands
$ touch myapp/management/commands/__init__.py
$ touch myapp/management/commands/sendmail.py
settings.py(追記)
INSTALLED_APPS = [
    ...
    'myapp.apps.MyappConfig'
]

 

コマンドファイルを作成

/myapp/management/commands/sendmail.py
import logging
from django.core.management.base import BaseCommand
from django.core.mail import send_mail

class Command(BaseCommand):
    help = "テストコマンド"
    logger = logging.getLogger('mylog')

    def handle(self, *args, **options):
        self.logger.critical('[maillogger]致命的な問題だよ')

    def add_arguments(self, parser):
        parser.add_argument('--send', action='store_true', help='メールを送信する。')

 

メールを送信してみる

コマンド実行
$ python manage.py sendmail --send

以下のようにメールが届くはずです。

 

 

 

参考

[1] Django エラー時にメールを送信する
[2] logging.handlers --- ロギングハンドラ

 

 

以上!

コメント

タイトルとURLをコピーしました