【Django】簡単にメール送信機能を追加する方法(単一送信・複数送信・ファイル添付)
2020.09.22 /
本記事ではDjangoにメール送信機能を追加する方法を解説します。
Webアプリケーションには多くの場合、メール送信機能を持たせることが多いと思います。様々なDjangoによるWebアプリケーションやブログなどにメール機能は使用されております。
ping死活監視システムでサーバーが機能停止したことを感知した際に特定のメールアドレス宛にメールを送信して担当者に知らせるようにしています
Djangoでは、非常に簡単にこのメール送信機能を追加することができます。
メールをただ送信するだけでなく、複数のメールを同時に送信する方法や、ファイル添付してメール送信する方法についても解説しています。
DjangoではなくPythonスクリプトでメールを送信したい場合は、以下記事でsmtplibモジュールを利用した方法を解説しています。
【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アプリケーションに実装してみてください。