こんにちは!Masaです。
今日はDjangoでメールを送信する方法を解説します!
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 }}
これでフォーム送信時にメールが送信されるようになります。
まとめ
今回は在庫登録時に登録した内容がメールで送られるという内容の機能を実装しました。
ポイントは以下の通りです。
コメント