delhi09の勉強日記

技術トピック専用のブログです。自分用のメモ書きの投稿が多いです。あくまで「勉強日記」なので記事の内容は鵜呑みにしないでください。

DjangoでAmazon SESを使ってメール送信する。(2020/6/9時点)

概要

DjangoAmazon SESを使ってメール送信する方法を検証したので、手順を残しておく。
※ あくまで検証用の手順です。I AMの設定やメール送信時のエラーハンドリングは考慮していません。

前提

django-ses」というパッケージを使用する。
github.com

環境

AWS側の設定

1.ドメインを認証する。

以下のようにドメインを認証しておく。

f:id:kamatimaru:20200609152303p:plain

私の場合は「Route 53」で取得したメールアドレスを使用している。
ドメインの認証に関する説明は省略

2.テスト配信用のメールアドレスを認証する。

SESをサンドボックス内で使用している場合は、テスト配信用のメールアドレスを認証しておく必要がある。

・手順

Email Address > Verify a New Email Address

※ 初期状態では、サンドボックス内での利用になっている。
サンドボックスを削除する場合はAWSに申請を出す必要がある。
詳細は以下の公式ドキュメントを参照
docs.aws.amazon.com

3.テストメールを送信してみる。

コンソール上から、テスト配信用のメールアドレスにメールを送信できることを確認しておく。

・手順

Email Address > 対象のメールアドレスを選択 > Send a Test Email

4.専用のユーザーを作成する。

DjangoからSESにアクセスする専用のユーザーを作成する。

①「I AM」のトップページにアクセスする。

②「ユーザー」 > 「ユーザーの追加」を選択する。
f:id:kamatimaru:20200609160419p:plain

③任意のユーザー名を入力して、「プログラムによるアクセス」をチェックして「次のステップ: アクセス制限」を押す。
f:id:kamatimaru:20200609160950p:plain

④「既存のポリシーを直接アタッチ」を選択して、「AdministratorAccess」をチェックして、「次のステップ: タグ」を押す。
f:id:kamatimaru:20200609161555p:plain

⑤何も入力せずに「次のステップ: 確認」を押す。
f:id:kamatimaru:20200609162738p:plain

⑥「ユーザーの作成」を押す。
f:id:kamatimaru:20200609163126p:plain

⑦「アクセスキー ID」と「シークレットアクセスキー」を控える。
成功画面が表示される。
「アクセスキー ID」と「シークレットアクセスキー」はDjango側の設定で必要になるので、ブラウザを閉じないようにしておくか、CSVファイルをダウンロードする。
※ 一度ブラウザを閉じてしまうと再確認する方法がないので注意。

Django側の設定

1.「django-ses」をインストールする。

以下のコマンドで「django-ses」をインストールする。

$ pip install django-ses

2. 「settings.py」のINSTALLED_APPSに「django_ses」を追加する。

INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "django_ses" #追加
]

3.「settings.py」に以下の定数を追加する。

AWS_ACCESS_KEY_ID = "${アクセスキー ID}"

AWS_SECRET_ACCESS_KEY = "${シークレットアクセスキー}"

AWS_SES_REGION_NAME="us-west-2" #SESのリージョンにオレゴン以外を使用している場合は読み替える。

AWS_SES_REGION_ENDPOINT="email.us-west-2.amazonaws.com" #SESのリージョンにオレゴン以外を使用している場合は読み替える。

EMAIL_BACKEND = "django_ses.SESBackend"

4. メール送信処理

例えば、「views.py」に以下のように記載する。

from django.http import HttpResponse
from django.core.mail import send_mail, EmailMessage

def index(request):
    subject = "テストメール"
    message = "テストメールです。"
    from_email = "no-reply <no-reply@example.com>"
    recipient_list = ["fizz@example.com", "buzz@example.com"]
    email = EmailMessage(subject, message, from_email, recipient_list)
    email.send()
    return HttpResponse("Email sent.")

→ 該当のURLにリクエストすると、メールが送信されるはず。

※ 以下の公式のgithubリポジトリの「example」というディレクトリ配下にサンプルコードが存在するので、これを参考にするのがよい。
github.com


以上