前はずっとSendGrid経由でメール送信機能を使っていましたが、せっかくAWSでアプリケーションをデプロイするのでAWSのサービスを使いたかったです。その為メール送信機能をSendGridからAWS SESに移動しました。
では、簡単に言うと Amazon Simple Email Service (SES) は、デベロッパーが任意のアプリケーションでメールを送信できるようにする、費用対効果の高い、柔軟でスケーラブルなメールサービスです。
SES設定
sandboxから移動
新規AWSアカウントではSESの制御があるます、確認済みのアドレスしか送信できなくて、1日最大200メールや1秒にあたり1メールなどの制限があります。
なので本番で使用できるにはリクエストをしなければなりません。
リクエスト方法はまずこのリンクにアクセス:http://aws.amazon.com/ses/fullaccessrequest
自分の場合は画像のように入力したら半日後で承認されました。
承認成功通知メールが届いたらドメインの設定をします。
ドメイン設定
Amazon SESサービスのメニューから「Verified identities」に遷移して、「Create identity」をクリック
Identity typeは「Domain」を選択し、アプリケーションのURLだけ入力してから作成します。
作成したドメインをクリックして、「Authentication」タブにある「View DNS records」をクリックするとCNAMEの値が現れるはずです。それぞれの名と値をコピーします。
DNS設定
自分の場合はonamae.comでDNSレコードを追加します。先コピーしたCNAMEレコードをそれぞれ追加して保存します。
ドメイン確認
それからAWS SES側の「Verified identities」に遷移して、問題なければ少し待つとステータスが「Verified」になります。自分の場合は大体5分以内でステータスが変わりました。
ここまではSES側の設定が完了です!
IAMユーザ設定
アプリケーションからSES経由でメール送信するには「AmazonSESFullAccess」ポリシーを持つIAMユーザが必要です。そのポリシーをユーザまたはグループに添付します。
そして、そのIAMユーザのアクセスキーIDとシークレットアクセスキーが手に入ったら、AWSコンソール側の設定が完了です!
Rails アプリケーション設定
aws-sdk-railsというGemを導入
gem 'aws-sdk-rails'
production.rbでSESを使う設定
credentials = Aws::Credentials.new(ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY'])
Aws::Rails.add_action_mailer_delivery_method(
:ses,
credentials:, # Ruby 3.1の文法
region: 'ap-northeast-1'
)
config.action_mailer.default_url_options = { host: 'imeezi.com' }
config.action_mailer.delivery_method = :ses
config.action_mailer.perform_deliveries = true
config.action_mailer.perform_caching = false
config.action_mailer.raise_delivery_errors = true
ENV['AWS_REGION']環境変数設定
regionは「us-east-1」以外ならこの環境変数が必要です。
自分の場合はfigaroを使って環境変数を設定するので、EC2にアクセスしてapplication.ymlファイルを編集します。
AWS_REGION: 'ap-northeast-1'
以上です。やっと本番でメールが送信できました!