【徹底解説】Django send_mailの使い方|初心者向け

Django

(最終更新月:2022年8月)

✔このような方へ向けて書かれた記事となります

「Djangoのsend_mailを使いたい!」

「Djangoでメール送信の実装がしたい!」

「メール送信実装について実例が見たい!」

✔当記事を通じてお伝えすること

  • Djangoでメールを送信するための準備方法
  • Djangoで使えるメール送信メソッド5選
  • それぞれの実例

当記事を最後までお読みいただければ、Djangoのsend_mailメソッドの使い方がわかるのはもちろん、ほかにもメールを送る方法があり、それぞれの特徴も理解できます

【著者プロフィール】

profile_icon
【Python歴】11年 x 【Django歴】10年
HP作成、社内システムの構築、コンサルティング

当ブログを通じて、Webアプリの書き方やアプリの公開方法までを解説しています。

☆日報アプリ「D-Repo」(デモ版)→こちら

※Djangoをベースに作成したアプリです。

☆便利ツールアプリ「Tool Station」→こちら

※Django REST frameworkとReactで作成しているアプリです。

月9,800円でWebデザインが学べる

デザナルは、Webデザインに苦手意識がある方におすすめのサブスク型スクールです。

なぜなら安い以外にも以下のような特徴があるからです。

  • 初期費用不要
  • 教材が使い放題
  • 案件で収入も得られる

デザナルは稼ぎながら学べる、格安のWebデザインスクールです。

>>デザナルの詳細はこちら<<

利用者の声など、詳しくはこちらでご覧ください↓

Djangoでメール送信実装の事前準備

Djangoでメール送信を実装するには事前に準備が必要です。

以下の3つがおおまかな流れになります。

  • メール送信のための設定
  • 送信ページの作成
  • 送信のための関数作り

それぞれ見ていきましょう。

メール送信のための設定

メール送信の実装方法は2通りあります。

  1. 機能確認のためにローカルコンソールに表示する
  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のメール送信機能には、テキストファイルなどをテンプレートとした送信方法も存在します。

たとえば以下のようなテンプレートファイルを用意します。

プロジェクトフォルダ > アプリフォルダ > mail_templates > sample.txt

{{ 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つでした。

  1. send_mail
  2. EmailMessage
  3. mail_admins
  4. EmailMultiAlternatives
  5. email_user

それぞれの特徴を理解すれば無駄なく、メール送信の実装が可能です。

今回はメール送信のためのメソッドに注目しましたが、実際にメールを送りたい方は以下の記事も参考にして下さい。

当ブログでは、日報アプリ開発を通じて、Webアプリを一から開発し公開するまでを初学者の方でもわかるようにと記事を連載しています

「Djangoでのアプリ開発を学びたい!」
「Djangoで開発したアプリをWebで公開するにはどうするの?」

という方は必見です!

【Django】チュートリアル|日報アプリの開発から公開まで
Djangoのチュートリアルをお探しですか?具体的に「手を動かして作ってみたい!」という方へ向けて、誰でもできる簡易的な日報アプリの開発を通じて、Djangoの様々な機能に触れていくシリーズとなっています。PythonでWebアプリを作りたい方、必見の記事となります!

タイトルとURLをコピーしました