LoginSignup
9
8

More than 1 year has passed since last update.

【Rails】AWSのSESを使って本番環境でメールを送信する(aws-sdk-rails)

Posted at

前提条件

macOS: Big Sur Ver11.2.3
Rails: 6.1.1
Ruby: 2.6.5
AWS: EC2(デプロイ),Route53(ドメイン取得),ACM(証明書取得)

前提条件に至るまで

固定IPアドレスに紐付いたドメインを取得し、取得したドメインにアクセスするとページが表示されるまで持っていくには、以下の記事のとおりでOK!
【初心者向け】AWSのサービスを使ってWebサーバーをHTTPS化する

やりたいこと

EC2上にデプロイしたRailsアプリケーションの本番環境で自由にメールを送信できるようにすること(Deviseのパスワード設定とか etc...)。
そのためにAWSのサービスのうち、SESを利用することにします。

手順(概要)

①AWS SESの設定
②AWSのCSに制限解除のメールを送る(sandboxによる送信制限の解除)
③IAMユーザーの設定
④Railsの設定

そして、上記の③までの設定については以下の方の記事が大変参考になりました。ありがとうございます!
【AWS】Amazon SESを用いてRuby on Railsのdeviseでメールを送信する

※なお、自分はすでにIAMユーザーを作成していたため、既存のIAMユーザーに「AmazonSESFullAccess」というインラインポリシーを後から追加する、といった方法で実装しました。まだIAMユーザーを作成していない方は上記のQiita記事の通りで良いのかと思います。

④以降については、今回はAmazonが提供する正式なGemを使用したため、上記記事とは方法が少し異なります。
それでは、手順④以降について以下で具体的に見ていきます。

手順(詳細:Railsの設定)

①Gemのインストール

Gemfileに以下を記述

# AWSのSESを使ってメールを送信するためにインストール
gem 'aws-sdk-rails', '~> 3.6', '>= 3.6.1'

そして、ターミナルで「bundle install」します。

②AWSの初期設定ファイルを作成

以下のディレクトリにファイルを新規に作成します。
「aws.rb」としておきます。

config/initializers/aws.rb
creds = Aws::Credentials.new(
  ENV['AWS_ACCESS_KEY_ID'],
  ENV['AWS_SECRET_ACCESS_KEY']
)
Aws::Rails.add_action_mailer_delivery_method(:aws_sdk, credentials: creds, region: 'ap-northeast-1')

config.action_mailer.delivery_method = :aws_sdk

2〜3行目は環境変数になっているので、ターミナル上で設定されているか確認しておくこと。
(私の場合はS3に画像を保存していたため、すでに設定済みでした。)
ちなみに、後でEC2上でも別途設定する必要があるので、忘れないよう注意!

③環境設定用ファイルを編集

開発環境と本番環境の設定を変更します。

config/environments/development.rb
(中略)
  config.action_mailer.default_url_options = { host: '取得したドメインのフルURL' }
  config.action_mailer.delivery_method = :aws_sdk
(中略)
config/environments/production.rb
  config.action_mailer.default_url_options = { host: 'https://www.takeoutgohan.net/' }
  config.action_mailer.delivery_method = :aws_sdk

④Deviseの初期設定ファイルを編集(導入していなければとばしてOK)

config/initializers/devise.rb
(中略)
 # Configure the e-mail address which will be shown in Devise::Mailer,
  # note that it will be overwritten if you use your own mailer class
  # with default "from" parameter.
  config.mailer_sender = 'noreply@あなたのドメイン(hoge.netなど)'
(中略)

⑤メールの送信元ドメインの変更

Deviseの設定に合わせ、送信元アドレスのドメインを書き換えます。

app/mailer/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
  default from: 'noreply@あなたのドメイン(hoge.netなど)'
  layout 'mailer'
end

⑥AWSのSESコンソール上の設定を行う

⑤までを行ったところ、メールは送れているものの受信ボックスに届いていないという状態になりました。
調べたところ、メールの信頼性を確保するため追加の設定をすれば良さそう!
ということでSESコンソール上で以下の設定を行いました。

DKIMの設定

AWSにルートユーザーでログインし、SESのコンソールに移動。
左メニューの「Domains」から該当のドメインを選び、DKIMの設定を行う。

MAIL FROM Domainの設定

AWSにルートユーザーでログインし、SESのコンソールに移動。
左メニューの「Domains」から該当のドメインを選び、一番下の「MAIL FROM Domain」の設定を行う。
今回は、「mail」とだけ入力して作成しました。

最後に

以上で設定は完了になります。お疲れさまでした。開発環境でメールが実際に届くか確認しましょう(私は自分のGmailアドレスに送りました)。
また、本番環境にデプロイしたあとはEC2上でAWSの環境変数が設定されているか確認し、Webサーバー(Unicorn)を再起動してからサイトに再度アクセスすると良いと思います。

9
8
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
9
8