質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

1784閲覧

Amazon SESでメール送信した際のエラー

deango

総合スコア161

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2022/07/30 05:33

編集2022/07/31 13:15

前提

djangoでSNSアプリを作成しています。
EC2にデプロイして動作確認してまして、
SESを利用してメールアドレスの認証を行っています。
アカウントログイン動作を行った際に、エラーになります。

・アカウントログイン
以下のページでログインボタンを押下

<form method="post" action="{% url 'account_login' %}"> {% csrf_token %} <table class="table"> {{ form.as_table }} {% if redirect_field_value %} <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}"/> {% endif %} </table> <button class="btn btn-primary" type="submit">ログイン</button> <p><a class="button secondaryAction" href="{% url 'account_reset_password' %}">パスワードを忘れましたか?</a></p> </form>

発生している問題・エラーメッセージ

EC2インスタンスと同じ、us-west-2のリージョンで、SESにメールアドレスや独自ドメインを登録・検証したのですが、
us-east-1でメールアドレスが検証されてないとのエラーが出ています。

An error occurred (MessageRejected) when calling the SendRawEmail operation: Email address is not verified. The following identities failed the check in region US-EAST-1: [Toメールアドレス]

試したこと

以下は対応済みです。

① SESでIAMユーザを作成し、アクセスID、認証キーをダウンロードし、django側で設定
以下はdjango側で設定しているコードです。
EC2の環境設定(~/.bash_profile)を読み込んでいます。

AWS_SES_ACCESS_KEY_ID = os.environ.get('AWS_SES_ACCESS_KEY_ID') AWS_SES_SECRET_ACCESS_KEY = os.environ.get('AWS_SES_SECRET_ACCESS_KEY') 

② ①で作成したIAMユーザのポリシー(AmazonSesSendingAccess)の編集
デフォルトの設定はActionがses:SendRawEmailのみでしたので、
ses:SendEmail、ses:GetSendQuotaを追加しました。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "ses:SendEmail", "ses:GetSendQuota", "ses:SendRawEmail" ], "Resource": "*" } ] }

③ サンドボックス外への移動、送信制限解除(リージョン:us-west-2)
対応済みで、認証していないメールアドレスにもメール送信可能なはずです。
送信制限は、1 日あたり 50,000 メッセージ、最大送信レートが毎秒 14 メッセージでこちらにも引っかからない認識です。

④送信元アドレスをSESに登録(リージョン:us-west-2)
作成しておいた独自のドメインと、個人のメールアドレスをこちらに登録し、検証完了しています。

※以前に発生したエラー
アカウントログインの動作を行った際、アクセスID・認証キーのエラーが出たため、
上記の①、②を再度行ったところ、エラー内容が今回のものに変わりました。

補足情報(FW/ツールのバージョンなど)

・django 3.2.14
・EC2 t2.micro (リージョン:us-west-2)

お力添えいただけますでしょうか。宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yu_1985

2022/07/30 05:45

どのようにプログラムからメールを送っているのかわからないので該当部分のソースを貼ってみてください。 また、必要な権限はどのように与えてますか。
deango

2022/07/31 07:47

該当コードの追加と本文修正しました。 権限設定は問題なさそうです。
yu_1985

2022/07/31 10:52

当初とメッセージ内容が変わっているのはなぜでしょう。 何かをした結果変わったのならそれがわかるように記載してください。 IAMポリシーだけ貼っても、そのポリシーを使っていることが記載内容だけではわかりません。 そもそも > SESのアクセスID、認証キーを発行し、アプリ側で設定 をしているならこのポリシーはどこで使うんでしょうか? SESを使うための設定をdjango上でどのように行ったかをより詳細に記載してください。 メッセージ内容を見るとfrom,toいずれかまたは両方のメールアドレスがus-east-1で未検証と言われていますが、今回使いたいSESのリージョンと該当のメールアドレスを検証済みにしたリージョンは一致していますか?
deango

2022/07/31 12:52

確認ありがとうございます。本文に詳細追記しました。 また、全てus-west-2のリージョンで設定しているのですが、us-east-1でエラーが出ていること気づきませんでした。ありがとうございます。ほかに原因がないか確認してみます。
deango

2022/07/31 13:05

④送信元アドレスをSESに登録(リージョン:us-west-2) 作成しておいた独自のドメインと、個人のメールアドレスをこちらに登録し、検証完了しています。 →検証成功となっていたのですが、SESに登録していないアドレスにテストメール送信したところ届きませんでした。この辺りも確認します。
deango

2022/07/31 13:10

こちらは届くのが遅いだけかもしれません、、、
guest

回答1

0

ベストアンサー

知りたかったのはdjangoでSMTP経由でメール送信しているのか、なんらかのライブラリを使用しているのか、というところでした。
設定内容的におそらくdjango-sesを使用しているということですか?
django-set

それであれば、django-sesのREADMEによるとリージョンを指定しない場合デフォルトではus-east-1が使用されると記載があるので明示的に設定してください。
今回の問題のほとんどはここが原因と思われます。
以下はREADMEからの抜粋です。

python

1# Additionally, if you are not using the default AWS region of us-east-1, 2# you need to specify a region, like so: 3AWS_SES_REGION_NAME = 'us-west-2' 4AWS_SES_REGION_ENDPOINT = 'email.us-west-2.amazonaws.com'

また、.bash_profileはシェル起動時に読み込まれるため、シェルを起動しないとそこで設定した環境変数は読み込まれません。
そのためdjangoの起動ユーザーや起動の仕方によってはきちんとキーを渡せていない可能性が高そうです。
グローバルに環境変数を設定したい場合は/etc/profileに設定をするといいです。

ただし、そもそもですが今回はEC2インスタンス上で動かしているので権限はアクセスキーではなくIAMロールで渡すことを推奨します
その場合アクセスキーとシークレットキーの設定はしないでください。何もクレデンシャル設定がない場合、インスタンスのIAMロールの権限を使用します。
セキュリティの観点から、アクセスキーは必要なければ発行しないようにしましょう。

参考
DjangoからAmazon SES経由でメール送信する

例えば、単にEC2インスタンス上でDjangoアプリケーションを起動してる場合であれば、Amazon SESへのアクセスを許可したIAMロールをインスタンスプロファイルとして付与するのが良いでしょう。

投稿2022/07/31 14:16

yu_1985

総合スコア7631

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

deango

2022/07/31 15:29

雑な質問内容から、汲み取っていだたきありがとうございます。 ご認識の通り、django-sesを使用してまして、リージョンを明示的に設定したところ、今回のエラーは出なくなり、正常にメール送信できるようになりました。 環境変数についても対応しておきます。 何から何までありがとうございます。
yu_1985

2022/07/31 16:15

IAMロールによる権限付与はAWS上でプログラムを動かす場合のデフォルトなので、そっちに寄せるような設定もやってみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問