Djangoで、メールを送信

Twitterでシェア FaceBookでシェア はてなブックマークでシェア

Python - Django
2018年11月22日21:25に更新(約21日前)
2018年11月7日20:23に作成(約36日前)

旧ブログ移行記事です。

概要

Djangoでメールを送信するサンプルです。

メール送信のテスト用設定

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

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

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

ほかにも、ファイルに書き込むもの等、いくつかの種類があります。言うまでもありませんが、本番の環境では使用しないようにしましょう。

ソースコード全体

views.pyです。メールを送信するためのいくつかのサンプルビューを書きました。

from django.contrib.auth.models import User
from django.core.mail import send_mail, EmailMessage
from django.shortcuts import render, redirect
from django.template.loader import get_template
from django.views.decorators.http import require_POST
from testproject import settings


def mail1(request):
    subject = "題名"
    message = "本文\\nです"
    from_email = "info@mail.narito.ninja"
    # 宛先を変えたい場合は、このリストの中を変更しましょう。このアドレスは私のアドレスです。
    # たまにメールが届きます。ちょっとほんわかします。
    recipient_list = [
        "toritoritorina@gmail.com",
        "narito@mail.narito.ninja"
    ]

    send_mail(subject, message, from_email, recipient_list)
    return render(request, 'testapp/index.html')


def mail2(request):
    subject = "題名"
    message = "本文\\nです"
    # ログインユーザーなら、request.userでUserモデルインスタンスが取得できます
    user = User.objects.get(email="toritoritorina@gmail.com")
    user.email_user(subject, message)  # メールの送信

    from_email = "info@mail.narito.ninja"
    user.email_user(subject, message, from_email)  # メールの送信
    return render(request, 'testapp/index.html')


def mail3(request):
    subject = "題名"
    message = "本文\\nです"
    from_email = settings.EMAIL_HOST_USER
    recipient_list = [
        "narito@mail.narito.ninja"
    ]
    send_mail(subject, message, from_email, recipient_list)
    return render(request, 'testapp/index.html')


def mail4(request):
    subject = "題名"
    message = "本文\\nです"
    from_email = settings.EMAIL_HOST_USER
    to = ["narito@mail.narito.ninja"]
    bcc = ["info@mail.narito.ninja"]
    email = EmailMessage(subject, message, from_email, to, bcc)
    email.send()
    return render(request, 'testapp/index.html')


def mail5(request):
    subject = "題名"

    mail_template = get_template('testapp/mailtemplate/mail.txt')
    user = User.objects.get(pk=1)  # is_superuser=True 等もよく使う
    context = {
        "user": user,
    }
    message = mail_template.render(context)

    from_email = settings.EMAIL_HOST_USER
    recipient_list = [
        "narito@mail.narito.ninja"
    ]
    send_mail(subject, message, from_email, recipient_list)
    return render(request, 'testapp/index.html')

send_mail関数での送信

まずはメール1です。基本的なメールの送信方法になります。send_mail関数に、件名本文fromtoを指定するだけです。

def mail1(request):
    subject = "題名"
    message = "本文\\nです"
    from_email = "info@mail.narito.ninja"
    recipient_list = [
        "toritoritorina@gmail.com",
        "narito@mail.narito.ninja"
    ]

    send_mail(subject, message, from_email, recipient_list)
    return render(request, 'testapp/index.html')

送信すると、以下の画像のようになります。動作していますね。

Userモデルのemail_userメソッド

次に、mail2です。これはUserモデルに定義されているemail_userというメソッドを使用しています。from_emailを指定しないと、settings.pyのDEFAULT_FROM_EMAILが使われます。

def mail2(request):
    subject = "題名"
    message = "本文\\nです"
    # ログインユーザーなら、request.userでUserモデルインスタンスが取得できます
    user = User.objects.get(email="toritoritorina@gmail.com")
    user.email_user(subject, message)  # メールの送信

    from_email = "info@mail.narito.ninja"
    user.email_user(subject, message, from_email)  # メールの送信
    return render(request, 'testapp/index.html')

以下画像のようになります。from_emailを省略したので、From: webmaster@localhostとなっていますね。

ちょっと脱線しますが、Djangoのデフォルトの設定はdjango/conf/global_setting.pyにあります。そこで、

DEFAULT_FROM_EMAIL = 'webmaster@localhost'

と定義されており、このメールアドレスが使われたということです。私達が目にするsettings.pyは、上記のglobal_settings.pyを上書きしている形になります。

メールサーバーを使った送信

mail3ですが、その前にsettings.pyを変更しましょう。実際にgmailを使ってメールを送信してみることにします。

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

EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'gmailアカウント名'
EMAIL_HOST_PASSWORD = 'gmailパスワード'
EMAIL_USE_TLS = True

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

mail3のコード自体ははmail1とほとんど同じですね。

def mail3(request):
    subject = "題名"
    message = "本文\\nです"
    from_email = settings.EMAIL_HOST_USER
    recipient_list = [
        "narito@mail.narito.ninja"
    ]
    send_mail(subject, message, from_email, recipient_list)
    return render(request, 'testapp/index.html')

これを実際に送信してみました。gmailの送信済みを見ると、ちゃんと送信されていることがわかります。

EmailMessageでの柔軟なメール送信

続いてmail4。今回はbccを使いたいと思いました。 bccやファイル添付をしたい場合、EmailMessageを使います。 Django の send_mail 関数は、実際には EmailMessage クラスに対して薄いラッパをかぶせたものに すぎません。

def mail4(request):
    subject = "題名"
    message = "本文\\nです"
    from_email = settings.EMAIL_HOST_USER
    to = ["narito@mail.narito.ninja"]
    bcc = ["info@mail.narito.ninja"]
    email = EmailMessage(subject, message, from_email, to, bcc)
    email.send()
    return render(request, 'testapp/index.html')

ちゃんとbccも追加されてますね。

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

テンプレートを使った送信

最後、mail5です。 メールの文章が複雑になったり、あるモデルの属性を文章に埋め込みたくなりました。 このような場合にはテンプレートを使って文章を組み立てれます。

def mail5(request):
    subject = "題名"

    mail_template = get_template('testapp/mailtemplate/mail.txt')
    user = User.objects.get(pk=1)  # is_superuser=True 等もよく使う
    context = {
        "user": user,
    }
    message = mail_template.render(context)

    from_email = settings.EMAIL_HOST_USER
    recipient_list = [
        "narito@mail.narito.ninja"
    ]
    send_mail(subject, message, from_email, recipient_list)
    return render(request, 'testapp/index.html')

app/mailtemplate/mail.txtという感じで、メール文章用のディレクトリを作っておくとわかりやすいでしょう。通常のtemplateと、同じように書けます。

{{ user.username }}様

苗字: {{ user.first_name }}
名前: {{ user.last_name }}
メールアドレス: {{ user.email }}
{% if user.is_superuser %}
あなたは管理者です。
{% endif %}

以下の部分がポイントです。

mail_template = get_template('app/mailtemplate/mail.txt')
user = User.objects.get(email="toritoritorina@gmail.com")
context = {
    "user": user,
}
message = mail_template.render(context)

実際に送信してみました。 上のメールは、通常のUser。下は管理者で送信しました。

Twitterでシェア FaceBookでシェア はてなブックマークでシェア

記事にコメントする