【具体例付き】Djangoでフォーム送信内容をメール送信

プログラミング
Masa
Masa

こんにちは!Masaです。

今日はDjangoでメールを送信する方法を解説します!

この記事でわかること
  • Djangoでメールを送信する方法
  • send_mail()メソッドの実装方法

Djangoでメールを送信する場面

今回は自分自身がDjangoにてメールを送信する機能を実装する必要があったため、備忘録的に解説します。

メールを送信する場面として以下を想定し作成していきます。

  • アプリの機能:在庫管理システム
  • 新しい在庫が登録されると、指定のメールアドレスに通知が行く
  • メールの内容は、登録された商品の詳細

今回は書籍の在庫管理システムとし、新しい書籍が登録された際に管理者にメールします。
それではやっていきましょう!

Djangoでメール機能を実装

Djangoでメールを送信する際に一番標準的な機能として、“django.core.mail”モジュールがあります。
今回はこの中で“send_mail()”メソッドを使用します。
“send_mail()”メソッドより機能が多いものがEmailMessageクラスとなります。

アプリケーション名は”book_management”としています。

順に設定していきましょう。

settings.pyの設定

最初にsettings.pyにメール送信の設定を行いましょう。

以下のコードをsettings.pyの任意の場所に記述してください。
なお、今回は送信元、送信先にgmailを使用していきます。

# Mail送信設定
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com' #gmailの場合
EMAIL_PORT = 587
EMAIL_HOST_USER = 'aaaa@gmail.com' #送信元メールアドレス
EMAIL_HOST_PASSWORD = 'lmjysemapeqeerqq'
EMAIL_USE_TLS = True

パスワードに関しては以下の方法で生成してください。

  • Googleアカウント管理のページを開きます。
  • 左側のタブから「セキュリティ」を選択します。
  • ページの真ん中らへんに「アプリパスワード」という項目があるので、選択します。
  • 「アプリを選択」で「その他(名前を入力)」で適当な名前を付け、「生成」をクリック
  • パスワードが生成されます

models.pyを作成

models.pyは以下の通りとします。
今回はサンプルなので、簡易的にしています。

from django.db import models
from django.utils import timezone

# 登録書籍
class Book(models.Model):
    date = models.DateTimeField(default=timezone.now()) #登録日
    inventory = models.IntegerField(default=1) #在庫数
    name = models.CharField(max_length=30) #書籍の名前
    genre = models.CharField(max_length=30) #ジャンル
    author = models.CharField(max_length=30) #著者
    publisher = models.CharField(max_length=30) #出版社

    def __str__(self):
        return self.name + '_' + self.author

forms.pyを作成

次にforms.pyを作成します。
フォームに関しても簡易的なフォームとしています。

from django import forms

from .models import(
    Book,
)

#書籍登録のフォーム
class BookRegForm(forms.ModelForm):
    class Meta:
        model = Book
        fields = ('name', 'genre', 'author', 'publisher')
        labels = {
            'name': '書籍名',
            'genre': 'ジャンル',
            'author': '著者',
            'publisher': '出版社'
        }

views.pyを作成

views.pyを作成します。
今回はフォームで書籍を登録した際にメールを送信する機能とします。

from django.shortcuts import render, redirect
from django.views import View
from django.core.mail import send_mail
from django.template.loader import render_to_string

from .forms import BookRegForm
from .models import Book

# トップページのビュー
class IndexView(View):
    def get(self, request):

        book_reg_form = BookRegForm()
        
        params = {
            'book_reg_form': book_reg_form,

        }

        return render(request, 'book_management/index.html', params)

    def post(self, request):
        book = Book()
        book_reg_form = BookRegForm(request.POST, instance=book)
        book_reg_form.save()

        params = {
            'book': book,
        }

        subject = "在庫追加通知"
        message = message = render_to_string('book_management/mail/mail_text.txt', params, request)
        from_email = "aaa@gmail.com" #送信元メールアドレス
        to = ["bbb@gmail.com"] #送信先メールアドレス
        send_mail(subject, message, from_email, to)

        return redirect(to='/')

getメソッドではフォームを表示するだけとなっています。

postメソッドでは以下のポイントが重要となります。

  • 32行目:23行目で書籍情報をテンプレートファイル内のmailフォルダのmail_text.textに渡しています(mail_text.textは後述します)
  • 35行目にsend_mail(件名、本文、送信元メールアドレス、送信先メールアドレス)とし、メールを送信します。

ただのテキストを送るだけの場合、35行目は message = ” 内容”として大丈夫です。
今回は書籍情報を入れて送りたかったため、このような形にしています。

テンプレートファイルを作成(mail_text.text)

最後にテンプレートファイルのmail_text.textを作成しましょう。

以下の在庫が追加されました

書籍名: {{ book.name }}
ジャンル:{{ book.genre }}
著者:  {{ book.author }}
出版社: {{ book.publisher }}

これでフォーム送信時にメールが送信されるようになります。

まとめ

今回は在庫登録時に登録した内容がメールで送られるという内容の機能を実装しました。

ポイントは以下の通りです。

ポイント
  • django.core.mail“モジュール、”send_mail()“メソッドを使用
  • settings.pyで送信先や送信元、ポート番号やプロトコルを指定
  • render_to_stringを使用することで、登録した書籍内容もメールで送信可能

コメント

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