Amazon SESとは
簡単に言うと、受信可能なメールアドレスがあれば、アプリケーションを通してメール送信を可能にするサービスです
メールサーバの構築や運用が必要ではなくなるという事ですね
価格も1,000 通あたり 0.10 USD、という事で、プロトタイプにもぴったりだと思います(多分)
東京リージョンでは使えないので、別リージョンを選ぶ必要がありますが、バージニア北部とかで問題ありません
今回はこのAWS SESとDjangoを組み合わせてメールを送信するサービスを作成する手順を紹介します
実装はとても簡単なので、ぜひ試してみてください
メールアドレス認証・テスト
メールアドレス登録
SESコンソールのIdentity Management
のEmail 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
で設定します(以下のものは最低限の設定です)
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などの使用とアクセスキーを使い分けたい時に使えるようです
INSTALLED_APPS = [
...
'django_ses',
]
INSTALLED_APPS
も書き加えました
テストメール
以下のようにテストしてみました(API開発していたのでDjango restframework使っています)
アクセスしてみましょう
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を使おうと思っていたのでセキュリティ的にも助かりました…