Djangoで、メールを送信

/ PythonDjangoEmail

11日前に更新

概要

Djangoでメールを送信する処理というのは割とあります。ユーザーや管理者に何らかのお知らせを送りたいとか、パスワードを忘れた場合とか、会員登録時にアカウントを有効化するのに使う等、様々な例があります。私のブログも、ブログ購読やコメントの際にメールを送信しています。

Djangoでは簡単にメールを送れますので、紹介していきます。

メールをコンソールに表示する

settings.pyに以下を追加します。

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

これはメールを実際には送らずに、コンソールに表示してくれる設定です。ちょっとしたテストに重宝します。

ちなみにですが、次のようにするとメールを実際に送信します。Djangoのデフォルトでは、こちらが設定されています。

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

settings.pyを分けている場合なんかで、開発環境のconsole.EmailBackendを上書きしたい場合に有効です。

メールの設定

次の例は、Gmailを使ってメールを送信する設定です。Gmailに限らず、大体こんな感じになります。

# メールサーバーへの接続設定
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'spam@gmail.com'
EMAIL_HOST_PASSWORD = 'gmailパスワード'
EMAIL_USE_TLS = True

他のメールサーバや、自分のメールサーバを利用する場合は適宜書き換えてください。Gmailで上手く送信できない場合は、二段回認証を利用しましょう。その場合、PASSWORD部分がアカウントのパスではなく、発行されたパスワードを使うことになります。

メール送信処理の基本

基本的な流れとして、題名、本文、送信者、宛先を指定し、send_mail()を呼ぶことになります。

from django.core.mail import send_mail


subject = "題名"
message = "本文\\nです"
from_email = 'toritoritorina@gmail.com'  # 送信者
recipient_list = ["toritoritorina@gmail.com"]  # 宛先リスト
send_mail(subject, message, from_email, recipient_list)

非常に簡単ですね。message\nは、改行を意味します。ちなみにですが題名には改行を入れれないので、注意してください。

Userモデルのemail_userメソッド

Userモデルに定義されているemail_userというメソッドを使用することもできます。Userにはメールアドレスのフィールドがありますが、そのアドレスに対してメールが送信されます。なので、宛先不要です。

subject = "題名"
message = "本文\\nです"
user = request.user  # ログインユーザーを取得する
from_email = 'toritoritorina@gmail.com'  # 送信者
user.email_user(subject, message, from_email)  # メールの送信

EmailMessageでの柔軟なメール送信

send_mail()は簡単なメールに使うためのもので、bccやファイル添付をしたい場合、EmailMessageというクラスを利用する必要があります。

from django.core.mail import EmailMessage


subject = "題名"
message = "本文\\nです"
from_email = 'toritoritorina@gmail.com'  # 送信者
recipient_list = ["toritoritorina@gmail.com"]  # 宛先リスト
bcc =  ["toritoritorina@gmail.com"]  # BCCリスト
email = EmailMessage(subject, message, from_email, recipient_list, bcc)
email.send()

ちなみにですが、Toを空欄にしつつBccだけ指定することも可能です。このブログではコメントに返信があればコメント者にメールを送りますが、BCCには私を、Toにはコメント者...もしくは、メールアドレス空欄だったらToが空欄、という感じでメールを送信しています。

テンプレートファイルを使った送信

テンプレートファイルを使って本文を組み立てる、というのもよくやります。

from django.core.mail import send_mail, EmailMessage
from django.template.loader import render_to_string


subject = "題名"

context = {
    # テンプレートファイルに渡したいものを書く...
}
message = render_to_string('app/mails/mail.txt', context, request)

from_email = 'toritoritorina@gmail.com'  # 送信者
recipient_list = ["toritoritorina@gmail.com"]  # 宛先リスト
send_mail(subject, message, from_email, recipient_list)

こうした特殊なテンプレートファイルは、mails等といったディレクトリを作ってその中に入れておくとわかりやすいでしょう。

中身ですが、当然普通のテンプレートファイルとして書けます。

{{ user.username }}様

苗字: {{ user.first_name }}
名前: {{ user.last_name }}
メールアドレス: {{ user.email }}

{% if user.is_superuser %}
あなたは管理者です。
{% endif %}

デフォルトのメールアドレスを設定する

メールアドレスをべた書きするのではなく、変数として管理したいと思うかもしれません。

Djangoのデフォルトsettingsには幾つかメールアドレスを記入する場所があるのですが、デフォルトのメールアドレスならば次の属性があります。

DEFAULT_FROM_EMAIL = 'toritoritorina@gmail.com'

メール送信の幾つかの処理では、from_email引数(送信元のメールアドレス)がない場合にこの属性が使われます。なので、DEFAULT_FROM_EMAILを設定しておく方が安心です。

利用する際は次のように。

from django.conf import settings
from django.core.mail import send_mail


subject = "題名"
message = "本文\\nです"
from_email = settings.DEFAULT_FROM_EMAIL  # 送信者
recipient_list = ["toritoritorina@gmail.com"]  # 宛先リスト
send_mail(subject, message, from_email, recipient_list)

参考リンク

Djangoでのメール送信 - 設定からテストまで/djangocongress-jp-2019-talk

この記事の関連記事

コメント欄

記事にコメントする

名無し

いつもブログ拝見させて頂いております。

「Djangoで、会員登録機能を自作する」でパスワード忘れの再設定メールの受信をしたいと思い、こちらの記事を参考にさせてもらいました。

ただ、メールの受信がうまくいかないようで、メールの送信方法についてお伺いしたいと思い、ご連絡させて頂きました。

関数mail1を書き換えて、「Djangoで会員登録機能を自作する」のviews.pyの一番下に、以下のように書き加えたのですが、メール受信ができませんでした。

def mail1(request):
    subject = "題名"
    message = "本文\\nです"
    from_email = ""
    recipient_list = [
        "(自分のメールアドレス)"
    ]

    send_mail(subject, message, from_email, recipient_list)
    return render(request, 'register/password_reset_done.html')

「Djangoで会員登録機能を自作する」のviews.pyのPasswordResetDoneクラスやPasswordResetにmail1関数を組み込んだりもしましたが、上手くいきませんでした。

mail1関数は自作した関数なので、どこかで呼び出す必要があるのでしょうか?

ご教示よろしくお願い致します。

コメントに返信する

なりと

「Djangoで会員登録機能を自作する」は、既にメールを送るための設定がされています。必要なのはsettings.pyの書き換えだけです。

# Gmailで送信する場合は、以下のような感じ。
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'  # console.EmailBackendを取り消す。
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'your_mail@gmail.com'  # あなたのアカウント
EMAIL_HOST_PASSWORD = 'your_app_pasword'  # 2段階認証のアプリパスワードが確実
EMAIL_USE_TLS = True
名無し

ご回答ありがとうございます。

settings.pyに以下のように追加したのですが、新規会員登録のフォーム送信時に「SMTPAuthentificationError」というエラーが出てしまいました。

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.icloud.com' EMAIL_PORT = 587 EMAIL_HOST_USER = 'ユーザのメールアドレス' EMAIL_HOST_PASSWORD = 'ユーザのパスワード'
EMAIL_USE_TLS = True

メールアドレスはgmail.comではなく、icloud.comを使用しました。 Macの設定に問題があるのでしょうか?

名無し

解決致しました。

Googleアカウントでアプリパスワードを作る必要があり、そのパスワードをsettings.pyに入力することで送信できました。