自動化無しに生活無し

WEBとかAIとかLinux関係をひたすら書く備忘録系ブログ

【Django+Sendgrid】サーバー処理中(ビュー、独自コマンド)に通知メール(To,CC,BCC)を送信する

thumbnail

DjangoでSendgridを実装させる方法【APIキーと2段階認証を利用する】で解説したとおり、SendgridのAPIキーをsettings.pyに書けばallauthでメール送信ができる。

だが、サーバーの処理中(ビューやmanage.py系の独自コマンド)でメールを送信するにはsettings.pyのメール設定を読み込む必要がある。

ソースコード

まず、前回と同様にsettings.pyにてAPIキーを入力

from .local_settings import *

EMAIL_BACKEND       = "sendgrid_backend.SendgridBackend"
#SENDGRID_API_KEY    = "local_settings.pyにて"

#サンドボックスを無効化
SENDGRID_SANDBOX_MODE_IN_DEBUG = False

#DEBUGがTrueのとき、メールの内容は全て端末に表示させる
"""
if DEBUG:
    EMAIL_BACKEND   = "django.core.mail.backends.console.EmailBackend"
"""

その設定を各所で読み込みをする。SendgridのAPIキーから読み込みを始める必要はない。EmailMessageを使用する。

下記は簡易掲示板にアクセスしたら指定した箇所にメールを送信する。

from django.shortcuts import render,redirect

from django.views import View
from .models import Topic

from django.core.mail import EmailMessage

class BbsView(View):

    def get(self, request, *args, **kwargs):

        msg = EmailMessage(
          from_email="ここに送信元",
          to=["ここに送信先"],
          cc=["ここにカーボンコピー"],
          bcc=["ここにブラインドカーボンコピー"],
          subject="テストテスト",
          body="これは本文",
        )
        msg.send(fail_silently=False)

        print(Topic.objects.all().query)

        topics  = Topic.objects.all()
        context = { "topics":topics }

        return render(request,"bbs/index.html",context)

    def post(self, request, *args, **kwargs):

        posted  = Topic( comment = request.POST["comment"] )
        posted.save()

        return redirect("bbs:index")

index   = BbsView.as_view()

後はこれに倣って、EmailMessageをインポートした上で送信を行う。

ちなみに、from_emailtosubjectは入力必須。さらに、メール送信時にはSendgridのサーバーにアクセスしているため、やや処理に時間がかかる(宛先2つで3秒ほど)。このようにビューの中にメール送信の処理を実装するのはできれば避けておきたいところだ。

できれば、独自にコマンドを作って常駐化させ、送信したほうがリクエストがタイムアウトしてしまうことも無い。

実際に送信するとこうなる。

送信するとこうなる。BCCの内容はメールのヘッダに思いっきりBCCと書かれてあるので、実践でBCCを指定するのは避けたほうが良いかも知れない。画像には無いが、CCを使うとリスト型に指定した送信先メールアドレスの文字列全部が書かれるので、個人情報保護の観点から厳禁。

BCCで送信するとヘッダに表示されてしまう。

実践では、forループで回して、toを個別に指定するのが妥当かと思われる。

ちなみにリスト型のtoに複数指定しても、送信先に併記されてしまうためCCと変わらない。メールアドレスを1つずつtoに仕込んでオブジェクトを作り、送信する必要がある。

ToはCCと変わらない。
スポンサーリンク

シェアボタン

Twitter LINEで送る Facebook はてなブログ