Rails
AWS
mail
route53
amazonses

【AWS】Amazon SES / Messaging・Route53を用いてドメインメールを送信する

TL;DR;

Railsアプリケーションから、noreply@my-domain.comのような形式でドメインメールを送りたい.

  • メールサーバーはAmazon SESを使用
  • RailsアプリケーションからAmazon SES APIを用いてメール送信リクエストを送る
  • DNSはRoute53を使用
  • ドメインはお名前ドットコムで取得

今回はRailsアプリケーションからSDK経由でメール送信するが,他のアプリケーションでもAWSの設定は同じ.DNSやドメイン取得も他のサービス使ってもよい.

(追記)2017年8月現在 Messaging に名前が変更されてる

image.png

image.png

Simple Email Service > US West(Oregon) と選択していくと,今まで通りのSES画面に遷移する.

検証環境

  • Rails 5.0.0.racecar1
  • Ruby 2.3.1

SES設定

image

リージョン

image

2016年7月現在,SESは下記3リージョンからしか選択できないので,Tokyoリージョンが使用できない.
今回は "US West (Oregon)" を使用する.

ドメイン検証

SESのメールアドレス検証では,認証した任意のメールアドレスから送信を許可することができるが,メアドが変わる毎に認証しないといけないのと,登録したメールアドレスにAWSからのメールを受信して認証する必要があるため,送信専用メアドなどは登録できない.
そのため今回は,特定のドメインからであればどのようなアドレスでも送信できるようにドメイン検証をする.

image

  • Identity Management > Domains > Verify a New Domain
  • ドメイン名に "my-domain.com" を入力し,Generate DKIM Settings にチェックを入れる.

image

image

既にRoute53を設定している場合

Use Route 53 ボタンが表示される.
このボタンをクリックすると,レコードの設定までを自動でやってくれる.

image.png
image.png

Identity Management > Domains > my-domain.com にアクセスすると,"Verification" と "DKIM" のStatusが "pending verification" になっている.

image

image

ドメイン取得

今回は,お名前ドットコムでドメインを取得した.(Route53でドメイン取得してもいい)

Route53設定

image

ドメイン設定

  • Hosted zones > Create Hosted Zone からドメインを設定する.
  • 作成すると,NSレコードとSOAレコードが作成される

image

NSレコード

NSレコードはお名前ドットコム側に設定する.

TXTレコード・DKIMレコード設定

Route53にSESに設定したドメインと同じドメインを設定すると,下記のボタンが表示される.
"Verification", "DKIM" それぞれで Use Route 53 > Create Record Sets をクリックすると,Route53にTXTレコードとDKIMレコードが自動的に設定される(手動で表示されているレコードを設定するのと同じ結果になる).

image

各レコードを設定後,最大72時間で "pending verification" -> "verified" に変わる.
(今回の検証だと1日かからなかった)

サンドボックス状態を解除 (2017年9月現在、サンドボックス解除をしなくても設定が完了できる模様)

ここまで登録した状態だと,送信制限が掛かっているサンドボックス状態になっている.

Email Sending > Sending Statistics > Request a Sending Limit Increase から制限解除の申請をする.

image

Regardingが "Service Limit Increase",Limit Type が "SES Sending Limits" の状態で,AWSのSupport Centerのページが表示される.
各項目適当な数値や説明文を追記して申請を完了する.

image

1日くらいするとAWSからメールが届いて,制限解除が完了する.

設定完了

最終的に下記のような状態になっていればおk.

image

Test Mail が送信できることを確認

  • Identiity Management > Domains > my-domain.com を選択 > Send a Test Email をクリック
  • 適当な送信アドレスでメールが正常に送られることを確認

AWS IAM 設定

image

AWS SDKで使用するアクセスキーを作成する.

新規ユーザー作成

IAM > Users > Create New Users から新規ユーザーを作成する.
作成後に生成される Access Key Id, Secret Access Key を後ほどSDKで使用する.
Secret Access Key 新規ユーザー作成時にしか作成されないので,値を無くしたり,また,流出しないように注意

なお,SES > Email Sending > SMTP Settings から SMTP Credentials も生成することができるが,credentialは今回は使わない.Note: にも記載があるように SMTP Credentialsは AWS access key とは別の識別子.

image

権限作成

作成したユーザーの詳細ページ > Permissions > Create User Policy > Policy Generator からSES用のPermissionをユーザーに割り当てる.

image

Add Statement > Next Step で下記が表示されるので Apply Policy で設定は完了.

image

Railsアプリケーション設定

SDK

aws-sesを使用する.
このgemでAWS SES API経由でメール送信する.

Gemfile
gem 'aws-ses', '~> 0.6'

設定ファイル

  • initializersにaws用のファイルを追加
  • AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEYは IAMユーザー作成時の値を使用
  • server は選択したリージョン毎に異なるので Regions and Amazon SES から API (HTTPS) endpoint を確認(SDKのデフォルトは email.us-east-1.amazonaws.com
config/initializers/aws.rb
ActionMailer::Base.add_delivery_method :ses,
                                       AWS::SES::Base,
                                       access_key_id: ENV['AWS_ACCESS_KEY_ID'],
                                       secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
                                       server: 'email.us-west-2.amazonaws.com'

ActionMailerのdelivery_methodに :ses を設定する.

config/environments/development.rb
config.action_mailer.delivery_method = :ses

メールクラス

RailsGeneratorで雛形を生成する.

$ rails g mailer custom test

default from を追加し, mail to: のメアドを受信可能なアドレスに変更する.

app/mailers/custom_mailer.rb
class CustomMailer < ApplicationMailer
  default from: 'MyDomain <noreply@my-domain.com>'

  # Subject can be set in your I18n file at config/locales/en.yml
  # with the following lookup:
  #
  #   en.custom_mailer.test.subject
  #
  def test
    @greeting = "Hi"

    mail to: "任意のメールアドレスに変更"
  end
end

送信確認

RailsConsoleからメール送信してメールを受信できれば完了
(迷惑メールBOXなどに入ってないことを確認)

$ rails c
irb(main):001:0> CustomMailer.test.deliver_now

参考資料