production.log

株式会社リブセンスでエンジニアをやっている星直史のブログです。

【Rails】deviseが送信するメールをAWS SESから配信する方法

概要

個人開発において、Railsのdeviseから配信されるメールは、これまでGmailを使用していたのですが、せっかくドメインを取得したので、AWS SESからメールを送信することにしました。
今回はRailsにおいて、deviseが送信するメールをAWS SESから配信する方法について書きます。

前提

  • Rails 5.2.0
  • Route53でドメインを取得済みである
  • PublicIPでアクセスできるサービスが存在する

手順

SESの設定

SESはデフォルトでは特定のメールアドレスには設定さえすれば、送信することができます。
しかし、多くのWebサービスは不特定多数のユーザーにメールを送信するため、その設定を行います。

ドメイン設定

f:id:watasihasitujidesu:20180716090617p:plain
Identity Management > Domains > Verify a New Domain
Verify a New Domain を押下すると、ポップアップが出てドメインの入力を求められます。
取得したドメインを入力し、Generate DKIM Settingsもチェックします。*1

f:id:watasihasitujidesu:20180716091130p:plain
f:id:watasihasitujidesu:20180716091521p:plainf:id:watasihasitujidesu:20180716091534p:plain

Route53でドメインを取得している場合は、Use Route53ボタンを押下すれば、AWSの方で自動でRecord Setを設定してくれます。

f:id:watasihasitujidesu:20180716091941p:plain
しばらく時間をあけると
Identity Management > Domains > 登録したドメイン にアクセスするとVerificationとDKIMのステータスがverifiedになっています。

サンドボックス状態の解除

f:id:watasihasitujidesu:20180716092315p:plain
Email Sending > Sending Statisticsにアクセスすると、上記のような警告がでます。
現状、特定のメールアドレスにしか送信できない送信制限がかかっているので、サポート制限緩和申請をする必要があります。

f:id:watasihasitujidesu:20180716092940p:plainf:id:watasihasitujidesu:20180716092942p:plainf:id:watasihasitujidesu:20180716092945p:plain

上記の通り、各種項目を入力します。
1日くらいすると、AWSの審査の末、SESからメール送信が可能になります。

メール送信テスト

f:id:watasihasitujidesu:20180716093542p:plain

Identity Management > Domains > Send a Test Email から、任意のメールアドレスにメール配信が可能になります。
Send Test Mailボタンを押し、メールが受信できれば成功です。

Rails(devise)の設定

SES自体が使えるようになったので、今度はRails側の設定をしていきます。

AWS SDKをinstall

Railsでaws sdkを使用するためにGemfileに下記を追記します。

gem 'aws-ses'

ActionMailerの設定

config/initializers/aws.rbを新規で作成し、下記の通り、SESを使用するように変更します。

ActionMailer::Base.add_delivery_method(
  :ses,
  AWS::SES::Base,
  access_key_id: Rails.application.credentials.dig(:aws, :access_key_id),
  secret_access_key: Rails.application.credentials.dig(:aws, :secret_access_key),
  server: 'email.us-west-2.amazonaws.com'
)

server はSESで選択したリージョンによって異なるので 公式ドキュメントのリージョンと Amazon SES から API (HTTPS) エンドポイントを確認してください。

次に、config/environments/production.rbの設定をSESを使用するように変更します。

config.action_mailer.default_url_options = { host: 'testrooper.com' }
config.action_mailer.delivery_method = :ses

deviseの設定変更

config/initializers/devise.rbのconfig.mailer_senderを修正します。

# config.mailer_sender = 'please-change-me-at-config-initializers-devise@example.com'
config.mailer_sender = 'Testrooper <noreply@testrooper.com>'

Mailerクラスの修正

最後にMailerクラスのfromの設定を変更して終わりです。

# frozen_string_literal: true
 
 class ApplicationMailer < ActionMailer::Base
#  default from: "from@example.com"
   default from: "Testrooper <noreply@testrooper.com>"

まとめ

これまで説明した通り、SESの設定自体はとても簡単です。
送信制限緩和申請のために、1日程度かかってしまうのですが、特に審査に落ちることもなく使えるようになりました。
また、Railsの方の設定も、難しいことはなく、設定ファイルの修正だけでした。

これまでGmailしか使っていなかったのですが、ドメインがあるのであれば、初手でSESを選択した方が良いかもしれませんね。

*1:DKIM とは DomainKeys Identified Mail の略で、受信した電子メールが「正当な送信者から送信された改ざんされていないメール」かどうかを調べることができる電子署名方式の送信ドメイン認証技術