【Django】簡単にメール送信機能を追加する方法(単一送信・複数送信・ファイル添付)

時計 2020.09.22 / 時計

【Django】簡単にメール送信機能を追加する方法(単一送信・複数送信・ファイル添付)

本記事ではDjangoにメール送信機能を追加する方法を解説します。

Webアプリケーションには多くの場合、メール送信機能を持たせることが多いと思います。様々なDjangoによるWebアプリケーションやブログなどにメール機能は使用されております。

私の場合

ping死活監視システムでサーバーが機能停止したことを感知した際に特定のメールアドレス宛にメールを送信して担当者に知らせるようにしています

Djangoでは、非常に簡単にこのメール送信機能を追加することができます。

メールをただ送信するだけでなく、複数のメールを同時に送信する方法や、ファイル添付してメール送信する方法についても解説しています。

DjangoではなくPythonスクリプトでメールを送信したい場合は、以下記事でsmtplibモジュールを利用した方法を解説しています。

本記事の対象者

本記事は以下に該当する方向けの内容となっています。

対象者

Python学習者(初級~中級者)

DjangoでWebアプリケーションを作成している人

メール送信機能を実装したい人

メールにファイル添付の方法がわからない人

必要なメール送信サーバーの情報

Djangoでメール送信機能を実装する方法を解説する前に、メール送信サーバーの情報を用意しておく必要があります。

以下に事前に必要なサーバー情報を記します。(例にはGmailの場合の情報を記しています)

必要なサーバー情報

SMTPサーバーアドレス(例:smtp.gmail.com)

PORT番号(例:587)

ユーザーID(例:gamilアカウント名)

パスワード(例:gmailアカウントのパスワード)

使用するサーバーの上記情報を準備できたら、実際にメール機能を実装していきましょう。

settings.pyにメール送信サーバー情報を追加

まず初めにsettings.pyに準備したメール送信サーバー情報を追加します。

settings.py内であればどこでもいいので、以下のようにサーバー情報を追加してみましょう。
例として、gmailの場合で記載しています。

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

EMAIL_USE_TLSは、TLSとあるので暗号化の設定であることはすぐにわかりますね。
ここではメールにTLS暗号化を使うか指定します。基本的にはここはTrueで大丈夫です。

メール送信方法

ここまででメールを送信するための事前準備は終わりました。

では実際にメールをDjangoで作成したWebアプリケーションからメールサーバーを通して送信してみましょう。

Djangoにはデフォルトで、メールを簡単に送信するためのメソッドが複数用意されています。

それらメソッドはdjango.core.mailに格納されており、使用するメソッドをそこからインポートして使用していきます。

まず最初は、一通のメールを送信するためのsend_mailメソッドを紹介します。

send_mail(subject, message, from_email, recipient_list, fail_silently=False)

subjectにはメールタイトル、messageにはメール本文、from_emailには送信者のメールアドレス(空の場合はsettings.py内のDEFAULT_FROM_EMAILの値が使われます)、recipient_listには送信先のアドレスを指定します(To:フィールドにアドレスが入ります)。

fail_silently=Falseは入力必須ではありません。
これはエラーが発生した際に、値がFalseであればsmtplib.SMTPExceptionを発生させるものです。

以下にサンプルコードを記載しますので、参考にしてください。

from django.core.mail import send_mail
from django.http import HttpResponse

def index(request):
    subject = "Office54 test mail"
    message = "test mail"
    from_email = "office54@office54.net"
    recipient_list = ["fivefour@office54.net"]

    send_mail(subject, message, from_email, recipient_list)
    return HttpResponse('<h1>Office54にテストメール送信完了</h1>')
  

メール送信方法(複数同時送信)

ここでは同時に複数の異なった内容のメールを送信する方法について説明します。

これは送信相手によって、内容やタイトルを変えたいときに使えますね。

使用するメソッドはsend_mass_mail()です。

send_mass_mail(datatuple, fail_silently=False)

datatupleにはタプル型の以下フォーマットの値を入れます。

(subject, message, from_email, recipient_list)

上記フォーマットはsend_mailメソッドで引数に指定した値と同じものですね。

以下にサンプルプログラムを記します。

from django.core.mail import send_mass_mail
from django.http import HttpResponse

def index(request):
    message_one(‘subject1’, ’message1’, ‘office54@office54.net’, [‘fivefore@office54.net’])
    message_two(‘subject2’, ’message2’, ‘office54@office54.net’, [‘to@office54.net’])
    send_mass_mail((message_one, message_two))
    return HttpResponse('<h1>複数宛先ににテストメール送信完了</h1>')

send_mass_mailメソッドを使わなくても、send_mailメソッドを2回使えばいいのではないか?と思われると思います。

ですが、複数の異なる内容のメールを送信する場合は、send_mass_mailメソッドを使う方がいいです。

なぜならsend_mailメソッドの場合、send_mailメソッドを使用する毎にメールサーバーとのコネクションを確立するためです。

send_mass_mailメソッドであれば、コネクション確立は一回のみなのでこちらのほうが効率的です。

ファイル添付送信方法

send_mailメソッドやsend_mass_mailメソッドではファイルをメールに添付することはできません。

メールにファイル添付したい場合は、EmailMessageオブジェクトを使用します。

from django import EmailMessage

mail = EmailMessage(subject, body, from_email, to, bcc, connection, attachments, headers, cc, reply_to)

上記引数の詳しい内容は以下URLをご覧ください。
django Documentation(Email Message Object)

ファイルを添付するにはattachメソッドを使用します。
以下のようにしてファイルを添付します。

mail.attach(‘office54.png’, img_data, ‘image/png’)

mail.attach(‘office54.txt’, ‘contents’, ‘text/plain’)

メールを送信するのにはsendメソッドを使用します。

mail.send()

以下にこれらメソッドを使ったサンプルプログラムを記します。

from django.core.mail import EmailMessage
from django.http import HttpResponse

mail = EmailMessage(
    'subject',
    'Test mail',
    'office54@office54.net',
    ['fivefore@office54.net'],
)

mail.attach(‘office54.png’, ‘img_data’, ‘image/png’)

mail.send()

CC、BCCの指定方法

EmailMessageオブジェクトを使用することで、Toのみでなく、CCやBCCも指定することができます。

EmailMessage('subject', 'test mail', from_email='office54@office54.net', to=['fivefour@office54.net'], cc=['cc@office54.net '], bcc=['bcc@office54.net '])

まとめ

Djangoに用意されているメソッドを使うことで簡単にメール送信機能を実装することができます。

ぜひ作成しているWebアプリケーションに実装してみてください。