(最終更新月:2022年8月)
✔このような方へ向けて書かれた記事となります
「Djangoのsend_mailを使いたい!」
「Djangoでメール送信の実装がしたい!」
「メール送信実装について実例が見たい!」
✔当記事を通じてお伝えすること
- Djangoでメールを送信するための準備方法
- Djangoで使えるメール送信メソッド5選
- それぞれの実例
当記事を最後までお読みいただければ、Djangoのsend_mailメソッドの使い方がわかるのはもちろん、ほかにもメールを送る方法があり、それぞれの特徴も理解できます。
Djangoでメール送信実装の事前準備
Djangoでメール送信を実装するには事前に準備が必要です。
以下の3つがおおまかな流れになります。
- メール送信のための設定
- 送信ページの作成
- 送信のための関数作り
それぞれ見ていきましょう。
メール送信のための設定
メール送信の実装方法は2通りあります。
- 機能確認のためにローカルコンソールに表示する
- 実際にメールを送る設定をする
もし機能だけ確認したいなら、まずはコンソールに表示する方法で充分です。
settings.pyに、以下の通り記述します。
EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
詳しくはこちらでも解説しています。
実際にメールを送信したいなら、以下のようにします。
EMAIL_HOST = 'SMTPサーバー情報'
EMAIL_HOST_USER = 'デフォルトのEmailアドレス'
EMAIL_HOST_PASSWORD = 'メールサーバーのパスワード'
EMAIL_PORT = '465' #メールサーバーで指定されているポート
EMAIL_USE_SSL = True #メールサーバーで確認(TSLの場合もある)
DEFAULT_FROM_EMAIL = '任意のメールアドレス'
具体例を見てみたい方は、以下の記事を参考にして下さい。
送信ページの作成
送信ページは、主に以下の3つのファイルにコードを書きます。
- views.py
- urls.py
- テンプレートファイル
一例としてコンタクトフォームを実際に作ったので、コードも含めてご覧ください。
送信のための関数作り
送信のための関数は複数存在します。
それぞれ特徴が違いますので、使いやすいものを見つけられるよう次章で詳しくご紹介します。
Djangoで使えるメール送信メソッド5選
send_mailはもちろん、Djangoではよく使われるメール送信のためのメソッドが5つあります。
以下のとおりです。
- send_mail
- EmailMessage
- mail_admins
- EmailMultiAlternatives
- email_user
ひとつずつ見ていきましょう。
send_mail
send_mailメソッドは一番ベーシックなメール送信方法だといえるでしょう。
send_mailでは、引数として以下の4つが必要です。
- 題名(subject):文字列
- 本文(message):文字列
- 送信元アドレス(from_email):文字列
- 送信先アドレス(recipient_list):リスト
具体例を見ていただくと下記のとおりです。
from django.core.mail import send_mail
subject = "サンプルメールのタイトル"
message = "サンプルメールの本文です"
from_email = "admin@itc.tokyo"
recipient_list =["test@itc.tokyo"]
send_mail(subject, message, from_email, recipient_list)
EmailMessage
EmailMessageクラスは、send_mailの項目に加えて、bccが追加できるメリットがあります。
- 題名(subject):文字列
- 本文(message):文字列
- 送信元アドレス(from_email):文字列
- 送信先アドレス(recipient_list):リスト
- BCC送信先アドレス(bcc):リスト
具体例は以下のとおりです。
from django.core.mail import EmailMessage
subject = "サンプルメールのタイトル"
message = "サンプルメールの本文です"
from_email = "admin@itc.tokyo"
recipient_list =["test@itc.tokyo"]
bcc = ["test-bcc@itc.tokyo"]
msg = EmailMessage(subject, message, from_email, recipient_list, bcc)
msg.send()
EmailMessageはクラスなので、インスタンスを作る必要があります。
インスタンスのsendメソッドで送信できます。
mail_admins
mail_adminsメソッドは、送信先が管理者となっているメール送信メソッドです。
mail_adminsのメリットは、以下の2つだけあれば管理者宛にメールが送れること。
- 題名(subject):文字列
- 本文(message):文字列
ただし、管理者情報をsettings.pyで設定しておく必要があります。
#ADMINS = [(名前, Eメールアドレス)]
#例
ADMINS = [('admin', 'admin@itc.tokyo')]
設定が完了していれば、以下のコードでメール送信可能です。
from django.core.mail import mail_admins
subject = "サンプルメールのタイトル"
message = "サンプルメールの本文です"
mail_admins(subject, message)
メールの送信元は、「root@localhost」となります。
EmailMultiAlternatives
EmailAlternativesクラスは、テキストメールだけでなく、HTMLメールを送りたいときに使えるメソッドです。
本文をテキストメール用とHTMLメール用に分けて渡すことで、受け取り側の状況に合わせたメールとなります。
- 題名(subject):文字列
- テキストメール用本文(text_content):文字列
- HTMLメール用本文(html_content):文字列
- 送信元アドレス(from_email):文字列
- 送信先アドレス(recipient_list):リスト
- BCC送信先アドレス(bcc):リスト
具体例は以下のようになります。
from django.core.mail import EmailMultiAlternatives
subject = "サンプルメールのタイトル"
text_content = "サンプルメールの本文です"
html_content = "<h1>サンプルメールの本文です</h1>"
from_email = "admin@itc.tokyo"
recipient_list =["test@itc.tokyo"]
msg = EmailMultiAlternatives(subject, text_content, from_email, recipient_list)
msg.attach_alternative(html_content, "text/html")
msg.send()
一度インスタンスを作ってから、attach_alternativeメソッドで追加するのがポイントです。
詳しくは以下の記事でも解説していますので、ご覧ください。
email_user
email_userは、ユーザーインスタンスに備わっていて、ユーザーインスタンスに登録されているEメールアドレスに送信するメソッドです。
つまりadminユーザーで「email_user」メソッドを実行すれば、宛先を指定せずともadminユーザーにメールが送られるということになります。
指定すべき引数は以下の3つです。
- 題名(subject):文字列
- 本文(message):文字列
- 送信元アドレス(from_email):文字列
具体例は以下のとおりとなります。
subject = "サンプルメールのタイトル"
message = "サンプルメールの本文です"
from_email = "admin@itc.tokyo"
if request.user.is_authenticated:
request.user.email_user(subject, message, from_email)
else:
print("ログインユーザーでなければメールは送れません")
記載の通りログインユーザーでなければ送れないので、該当ページにはログイン制限などを設定しておく必要があるかもしれません。
【応用編】テキストファイル(テンプレート)を使った送信方法
Djangoのメール送信機能には、テキストファイルなどをテンプレートとした送信方法も存在します。
たとえば以下のようなテンプレートファイルを用意します。
{{ user.username }}様
氏名:{{ user.first_name }} {{ user.last_name }}
メールアドレス: {{ user.email }}
問い合わせ内容
{{ message }}
{% if user.is_superuser %}
>>> 管理者向けのメールです。<<<
{% endif %}
send_mailメソッドを使って、実装すると以下のようになります。
from django.core.mail import send_mail
from django.template.loader import render_to_string
from django.conf import settings
subject = "サンプルメールのタイトル"
message = "サンプルメールの本文です"
from_email = "admin@itc.tokyo"
recipient_list =["test@itc.tokyo"]
ctx = {
"user": request.user,
"message": message
}
msg = render_to_string(f"{settings.BASE_DIR}/アプリフォルダ/mail_templates/sample.txt", ctx, request)
send_mail(subject, msg, from_email, recipient_list)
メールのパターンをいくつか用意している場合はとても便利ですね!
まとめ:Djangoのメール送信メソッドを特徴で使いわけよう
当記事の内容をまとめます。
- Djangoでメールを送信するためにはsettings.pyなどで事前準備が必要
- Djangoには複数のメール送信メソッドが用意されている
- どんな機能が必要かで、好きなものを選ぼう
ご紹介したDjangoのメール送信メソッドは以下の5つでした。
- send_mail
- EmailMessage
- mail_admins
- EmailMultiAlternatives
- email_user
それぞれの特徴を理解すれば無駄なく、メール送信の実装が可能です。
今回はメール送信のためのメソッドに注目しましたが、実際にメールを送りたい方は以下の記事も参考にして下さい。