SendGridを使ってSMTPでメールを送信する方法

Railsを使ってSendGridのSMTPでメールを送ってみました。

このような手順で進めます。

  • 1. ドメインの認証をする
  • 2. メール送信専用のAPIキーを作る
  • 3. Railsの設定

1. ドメインの認証をする

SMTPの接続情報を教えてください。によると

SMTPでメールを送信する場合、SMTP認証が必須となります。

とのことなのでまずはドメインの認証を行います。

Settings > Sender Authentication > Domain Authentication

と進み、Authenticate Your Domainを押します。

SendGrid Domain Authentication

今回はAWSのRoute53を使用しているのでRoute53を選択します。

SendGrid Domain Authentication

使用するドメインを入力してNextを押します。

SendGrid Domain Authentication

次の画面でRoute53に入力する情報が表示されるのでこれをRoute53に入力していきます。

SendGrid Domain Authentication

AWS側の設定

AWSのRoute53の画面の対象のドメインで、Create Record Setを押します。

SendGrid Domain Authentication

そうすると、このような画面が右側に開くと思うのでName、Type、Valueをそれぞれ入力します。

この場合だと3行あったので3回繰り返して3つレコードを作ります。

SendGrid Domain Authentication

Verify

最後にSendGridに戻り、②のOnce added, press Verifyにチェックを入れてVerifyを押してSuccessが出れば認証は完了です。

2. メール送信専用のAPIキーを作る

アカウント作成時のログイン情報でもメールを送ることはできますが、全権限を持ったユーザーをデプロイするのは万が一漏れた時のことを考えると危険なのでメール送信しかできないように権限を制限したキーを作成します。

Settings > API Keys

からCreate API Keyを押します。

API Key Nameを入力して、Restricted Accessを選択します。

SendGrid API Key

選択すると権限一覧が開くのでMail SendをFullAccessに変更します。

SendGrid API Key

変更したらCreate & Viewを押します。

するとキーが表示されるのでメモっておきます。

SendGrid API Key

3. Railsの設定

RailsへのMailの設定はこんな感じで設定します。

config/initializers/mailer.rb

if Rails.env.test?
  ActionMailer::Base.smtp_settings = {
    address: 'localhost',
    port:    587,
  }
else
  ActionMailer::Base.smtp_settings = {
    user_name:             ENV['SMTP_USER'],
    password:              ENV['SMTP_PASS'],
    domain:                ENV['SMTP_DOMAIN'],
    address:               'smtp.sendgrid.net',
    port:                  587,
    authentication:        :plain,
    enable_starttls_auto:  true
  }
end

smtp_settingsのオプション

キー名
user_name apikey
password 先ほどメモしたAPIキー
domain 認証したドメイン
address smtp.sendgrid.net
port 25、465、587、2525が設定できるが、587が推奨
authentication 認証の種類、今回は:plainを設定します
enable_starttls_auto SendGridはSTARTTLSに対応しているためtrueにします

ENVの設定

APIキーで送信するときにハマったのですが、APIキーを使って送信する場合にはユーザー名にapikeyを指定しないとSMTPAuthenticationErrorのような認証エラーがでます。

.envなど環境変数を管理しているファイルに書き込みます

SMTP_USER="apikey"
SMTP_PASS="xxxxxxxxxxxx"
SMTP_DOMAIN="example.com"

参照