Djangoのメール周りメモ

追記: 翔泳社さんでDjangoの書籍を出版するのでぜひ読んでみてください。


はじめに

この記事は 2015 tech-yuruyuru アドベントカレンダー - connpass の18日目です

メール周りの機能は基本的に↓のEmailのトピックページにまとまってはいるのですが、他のページに書いてある内容が必要になったりするのでその辺りのことも一緒にまとめてます。

開発中の設定

開発中は実際にメールを送信してほしくないので、その設定をします。 ドキュメントを見た感じ2つぐらい方法があるみたいです。

Dummy Backend

settings.pyで以下のように記述すると、メールを実際には送信せず送信内容等をコンソールに表示してくれます。

EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend'

SMTPサーバをたてる

以下のコマンドを打つと、localhostのリスニングポート1025でSMTPサーバがたちあがります。

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

EMAIL_HOSTEMAIL_PORT をこれに合わせて設定しておくと、SMTPサーバは受け取った内容を端末に表示します。もちろんこの時送信はしません。 基本的にDummy Backendを使っておけばいい気がします。

メールの送信

準備

settings.pyに下記の設定を追記します。 EMAIL_PORTやEMAIL_HOSTは先程建てたSMTPサーバに合わせます。

# settings.py
EMAIL_HOST = 'localhost'
EMAIL_PORT = 1025
EMAIL_HOST_USER = ''
EMAIL_HOST_PASSWORD = ''
EMAIL_USE_TLS = False
DEFAULT_FROM_EMAIL = 'system@example.com'

メールの送信 (send_mail)

「件名」「本文」「送信元メールアドレス」「送信先メールアドレス」の順で指定します。

# send_mail.py
from django.core.mail import send_mail
from <project_name> import settings


def send_mail_for_inquiring(to_email):
    send_mail('問い合わせについて,
              'お問い合わせありがとうございました。',
              settings.DEFAULT_FROM_EMAIL,
              [to_email], fail_silently=False)

なお送信先はリストで指定します(複数指定可)。

email_userメソッド

https://docs.djangoproject.com/en/1.9/ref/contrib/auth/#django.contrib.auth.models.User.email_user

django.contrib.auth.modelsのUserクラスにもemail_userメソッドというのが用意されています。 中ではsend_mail呼んでいるだけですが、宛先が1人だけならこちらを使えばよさそうです。

user.email_user('メールの件名', 'メールの本文')

メール送信周りのテスト

https://docs.djangoproject.com/en/1.7/topics/testing/tools/#email-services

django.core.mail.outbox が送信されるメールを保持しますが、manage.pyのtestコマンド実行中は実際には送信されません。 またoutboxは各テストケースの開始時に初期化されます。

>>> from django.core import mail
>>> mail.send_mail('件名', 'メッセージ', 'from@example.com', ['to@example.com'], fail_silently=False)
>>> mail.outbox[0].subject
件名
>>> mail.outbox[0].message
メッセージ

メールを使ったアカウント登録処理

ユーザが登録時に入力したメールアドレスにメールを送信し、そこに記載されているリンクを踏むとアカウントを有効化する。というサービスを結構みかけます。 1から実装するのは少し大変そうですが、django-registration-reduxというライブラリを使えば簡単に実装できます。

ドキュメントも丁寧に書かれてあるので英語が大丈夫な人はそちらで十分ですが、以前 id:ottati 先生がまとめてくださってたのでそちらを参考にすると良さそうです。

http://ottati.hatenablog.com/entry/2015/04/14/184637

以上です