12
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DjangoとAmazon SESを使ってメールを送信する

Posted at

Amazon SESとは

簡単に言うと、受信可能なメールアドレスがあれば、アプリケーションを通してメール送信を可能にするサービスです
メールサーバの構築や運用が必要ではなくなるという事ですね
価格も1,000 通あたり 0.10 USD、という事で、プロトタイプにもぴったりだと思います(多分)
東京リージョンでは使えないので、別リージョンを選ぶ必要がありますが、バージニア北部とかで問題ありません

今回はこのAWS SESとDjangoを組み合わせてメールを送信するサービスを作成する手順を紹介します
実装はとても簡単なので、ぜひ試してみてください

メールアドレス認証・テスト

メールアドレス登録

SESコンソールのIdentity ManagementEmail Addressesからメールアドレスを登録します。
Veify a New Email Addressでメールアドレスを記入します

認証用メールが届くので、許可してください
今回はGmailアドレスを使用しました。テスト用にもう一つ個人的なアカウントを認証しておきました

テストメール送信

メールアドレスを選択すると、テストメールを送信する事ができます
ここでは認証したメールアドレスしか使用できません

SESのトークン発行

Djangoでメールを送信するためにトークンを発行します
トークンについてはAWSのSESを利用してメール送信で詳しく説明されているので、こちらを参考にしてみてください

Django-sesの導入

インストール

今回はDjango-sesを使用します
botoというかの有名なAWS APIラッパーを使って、メールバックエンドを提供してくれるライブラリです

pip install boto django-ses

django-sesを使うとDjangoの通常のメール機能と同じようにメールを送信することができます
なのでバックエンドなどの設定を行う必要があります
settings.pyで設定します(以下のものは最低限の設定です)

settings.py
AWS_SES_ACCESS_KEY_ID = 'your access key'
AWS_SES_SECRET_ACCESS_KEY = 'your secret key'
EMAIL_BACKEND = 'django_ses.SESBackend'

AWS_SES_ACCESS_KEY_IDと設定していますが、AWS_ACCESS_KEY_IDでも大丈夫です
S3などの使用とアクセスキーを使い分けたい時に使えるようです

settings.py
INSTALLED_APPS = [
	...
    'django_ses',
]

INSTALLED_APPSも書き加えました

テストメール

以下のようにテストしてみました(API開発していたのでDjango restframework使っています)
アクセスしてみましょう

views.py
from rest_framework.response import Response
from rest_framework.views import APIView
from django.core.mail import send_mail, EmailMessage

class MailTestView(APIView):
	def get(self, request, format=None):
        try:
            subject = 'タイトル'
            message = '本文'
            from_email = '送信元アドレス'
            recipient_list = ['送信先アドレス']
            email = EmailMessage(
                subject, 
                message, 
                from_email, 
                recipient_list
            )
            email.send()
        except KeyError:
            return Response("Error", status=400)
        return Response("Success", status=400)

※このとき、まだSandbox環境なので送信元アドレスも送信先アドレスも事前に認証したものだけしか使えません

送信制限引き上げ申請

まだSandboxです
コンソールのEmail Sending, Sending Statisticsを選び、Request a Sending Limit Increaseから申請します
Amazon SESサンドボックスの外への移動を参考にフォームを入力します

1~2日かかるようなので、他の機能を実装しながらのんびり待ちましょう
この申請が許可されたら認証されていないメールアドレスにもメールを送信できるようになるので、本格的に機能利用が始まります

まとめ

すごく簡単でした!
申請項目に少し悩んだくらいで実装面はまったく問題なく進める事ができました
Gmailを使おうと思っていたのでセキュリティ的にも助かりました…

参考

12
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?