【Rails7】開発環境、本番環境でメール送信できるようにする(SendGrid, Gmail)

Railsで作ったアプリからメールを送信したい場合、外部のメールサーバーを利用してメールを送ることになります。

今回は、Railsのアプリ制作でよく取り上げられているメールサーバーのうち、SendGridGmailの設定方法について解説しようと思います。

SendGridについてはいくつか注意点があるので、順を追って説明していきますね。

目次

開発環境

  • Ruby 3.1.2
  • Ruby on Rails 7.0.3
  • M1 Macbook Air 2020
  • mac OS Monterey (ver. 12.4)
  • ターミナル bash (Rosetta 2 使用)

環境変数(.env)設定の準備

まずは、環境変数を設定するための準備をします。

Gemfileに下記のように記述します。

gem 'dotenv-rails'

$bundle installでgemをインストールしたら、アプリのディレクトリ直下に.envファイルを新規作成します。

ここに、メールサーバー設定に必要となるメールアドレスやAPIキーなどの情報を書き込んでいきます(書き方など詳しくは後ほど)。

ただし、このままだと$git pushした時に.envファイルの中身もそのままリモートリポジトリ上にアップロードされてしまうので、.gitignoreに以下のように記述します。(最下部に記述)

・・・

/.env

これで、$git pushしても.envファイルは無視されるのでリモートリポジトリに公開されることはありません。

ところで、なぜ環境変数を設定しなければならないのか。

理由は、開発環境のメールサーバーの設定において、メールアドレスやAPIキーなど個人情報をコードに書くことになりますが、そのまま書いてしまうとGitのリモートリポジトリに公開した時にコードと共に個人情報が外部に漏れてしまいます。

それはセキュリティ的に大変よろしくないですし、今回使用するSendGridというメールサーバーは、APIキーを環境変数化しないまま使用するとサポート側から警告を受ける(最悪アカウント凍結される)場合があるので注意が必要。

なので、環境変数を設定することで、これら個人情報を隠蔽する必要があります。

メイラー(mailer)の準備

Rails でメールを送信するためには、メイラーを追加する必要があります。

ただし、Deviseをインストール済みの方はメイラー追加する必要はありません。

メイラーの生成

例として、アカウント有効化用のメール送信に必要なコードを追加する場合、

RailsのAction Mailerライブラリを使ってUserメイラーを追加します。

$ rails generate mailer UserMailer account_activation

詳しくは下記記事を参照(説明は割愛させていただきます)。

スライド付き解説動画で、早く学ぼ...
スライド付き解説動画で、早く学ぼう - Railsチュートリアル 図やイラストを使ってコーディングしながら解説する動画です。早く効率的に学びたい、しっかり理解したい、といった方々にオススメです。

メール差出人(送信元)情報の設定

差出人のメールアドレスを設定します。

app/mailers/application_mailer.rbに以下のように記述します。

class ApplicationMailer < ActionMailer::Base
  default from: ENV['SENDER_ADDRESS']
  layout "mailer"
end

デフォルトでは”from@example.com”となっていると思うので、ここをご自身の好きなメールアドレスに置き換えます。

ただ、メールアドレスをそのまま記述してしまうのはセキュリティ上よろしくありません(Gitのリモートリポジトリに上げた場合、メールアドレスがそのまま公開されてしまう)。

ここでは、環境変数ENV['SENDER_ADDRESS']を用いて生のメールアドレスを隠蔽します。

中身(生のメールアドレス)については後ほど設定していきます。

メール送信用サーバーへの登録とAPIキーの発行

ここでは、メール送信用サーバーへの登録と、メール送信時に必要となるAPIキーの発行手順について解説します。

SendGridへの登録(アカウント作成、送信元情報の登録)とAPIキーの発行方法

SendGridへの登録について、

  1. SendGrid への登録(アカウント作成)
  2. メール差出人情報(送信元メールアドレスなど)の登録
  3. APIキーの発行

の3ステップに分けて解説していきます。

SendGridの登録方法は2パターンあり、1つ目はHerokuのアドオン経由で登録する方法、そしてもう1つは公式サイトから直接登録する方法です。

ただ、Herokuのアドオン経由で登録するとアカウントが凍結される可能性が高いとの報告が多い(実際に僕も凍結されました)ので、個人的にはSendGrid公式サイトから直接登録することをお勧めします。

①SendGridへの会員登録

SendGridにアクセスし、「Start for free」ボタンからアカウント登録を進めます。

アカウント登録は下記記事を参考に進めてください。

②SendGridへのメール差出人(送信元)情報登録

SendGridはメール差出人(送信元)情報をあらかじめ登録しておく必要があります。

登録方法は、まずSendGridのマイページの「Settings」→「Sender Authentication」をクリックして進みます。

次に、Sender Authentication ページの「Verify a Single Sender」ボタンをクリックします。

Create a Senderのページに、登録したい差出人情報を入力していきます。

「Create」を押すと、登録したメールアドレス宛に確認メールが届くので、表示されたリンクをクリックするとメールアドレスが有効化されます。

有効化されると以下のようにSTATUSが「Verified」と表示されます。

差出人情報の登録は以上です。

③APIキーの発行

続いては、メール送信に必須となるAPIキーを発行します。

SendGridマイページの「Settings」→「API Keys」をクリックして進みます。

「Create API Key」をクリックします。

作成するAPIキーの名前を入力し、「Create & View」をクリックします。

(その下の「API Key Permissions」はデフォルトのままでOKです。)

すると、APIキーが生成されるのでコピーして安全な場所に保存しておきましょう。

一度「Done」をクリックしてしまうと再表示されなくなるので注意です。

【重要】もしSendGridから催促メールが来た場合

SendGridに新規登録してからしばらくすると以下のような催促メールが来る場合があります。

要約すると、「あなたのアカウント登録を確実なものにするため、もっとあなたの情報(主に会社やビジネスについて)をください」ということです。

というのも、過去にSendGridを利用したスパムメールの被害が多発したため、昨年くらいからアカウント登録の基準がかなり厳しくなったそうです。

Twilio
Twilio SendGrid Email Policy | Twilio With Twilio, unite communications and strengthen customer relationships across your business – from marketing and sales to customer service and operations.

(Heroku経由でSendGridに登録するとアカウント凍結されるのは、おそらくこういう背景があるものと推測されます)

もしこのようなメールが来た場合、なるべく早めに返信することをおすすめします。

返信しなかった場合、再び催促メールが来るのと、最悪の場合はアカウント凍結されてしまうかもしれません。

英語での返信方法については以下の記事を参考にしてみてください。

Qiita
Heroku Add-onのSendGridにログインできないトラブル - Qiita #SendGridにログインできないHerokuのAdd-onで入れたSendGridにHeroku管理画面から飛ぶと「アクセスが拒否されました」と出てダッシュボードが見られない状態になりました...

返信して問題なければ、そのままSendGridアカウントを使用し続けることができるはずです。

Gmailでのアプリパスワード発行方法(2段階認証プロセス設定済みの場合)

メール送信用サーバーとしてGmailを利用する場合は、アプリパスワードというものを取得する必要があります。

おそらく、ほとんどの人はGmailを利用していると思うので、ここではアプリパスワードを発行する方法のみについて解説します。

ちなみに、Googleの2段階認証プロセスを有効化しているという前提で話を進めていきます。(まだの場合は、有効化しておいてください)

まずはご自身のGoogleアカウントページにアクセスし、「セキュリティ」タブのアプリパスワードをクリックして進みます。

パスワードを入力して入ったら、「アプリを選択」のドロップダウンメニューから「その他(名前を入力)」を選択。

名前(アプリ名など)を入力したら「生成」をクリック。

すると、アプリパスワードが生成されるので、すぐにコピーして安全な場所に保存しておくか、環境変数化しておきます。

(「完了」を押して閉じるとパスワードは再表示されないので注意)

メール送信用サーバー(開発環境)の設定

APIキーやアプリパスワードの生成など準備が終わったら、いよいよメール送信用サーバーの設定です。

まずは、開発環境における設定方法を見ていきます。

開発環境用のメール送信サーバー設定development.rb

SendGrid用の設定

config/environments/development.rbに下記のように記述します。

  config.action_mailer.perform_caching = false
  host = 'localhost:3000'
  config.action_mailer.default_url_options = { host: host, protocol: 'http' }
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  # SendGrid の場合
  config.action_mailer.smtp_settings = {
    :address => 'smtp.sendgrid.net',
    :port => 587,
    :domain => 'localhost',
    :user_name => 'apikey',
    :password => ENV['SENDGRID_API_KEY'],
    :authentication => :plain,
    :enable_starttls_auto => true
  }

:user_nameは文字列'apikey'をそのまま入力し、:passwordは環境変数ENV['SENDGRID_API_KEY']を設定ます。

環境変数の中身はこのあと設定します。

Gmail用の設定

config/environments/development.rbに下記のように記述します。

  config.action_mailer.perform_caching = false
  host = 'localhost:3000'
  config.action_mailer.default_url_options = { host: host, protocol: 'http' }
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  # Gmail の場合
  config.action_mailer.smtp_settings = {
  :enable_starttls_auto => true,
  :address => "smtp.gmail.com",
  :port => 587,
  :domain => 'smtp.gmail.com',
  :user_name => ENV['GMAIL_ADDRESS'],
  :password => ENV['GMAIL_PASSWORD'],
  :authentication => 'login'
}

Gmail の場合は:user_nameにGmailアドレスENV['GMAIL_ADDRESS']を、:passwordにアプリパスワードENV['GMAIL_PASSWORD']をそれぞれ設定します。

環境変数の設定(.envに記述)

環境変数化した値は、.envに以下のように記述します。

# SendGrid
SENDGRID_API_KEY = "SendGridのAPIキー"

# Gmail
GMAIL_ADDRESS = "Gmailのメールアドレス"
GMAIL_PASSWORD = "Gmailのアプリパスワード"

# 送信元のメールアドレス
SENDER_ADDRESS = "送信元のメールアドレス"

ここで、今一度.gitignore/.envが追記されているかどうか確認しておきましょう。

メール送信用サーバー(本番環境)の設定

続いて、本番環境(Heroku)におけるメール送信用サーバーの設定についてみていきます。

本番環境用のメール送信サーバー設定production.rb

SendGrid用の設定

config/environments/production.rbに下記のように記述します。

  config.action_mailer.default_url_options = { host: 'https://Herokuのアプリ名.herokuapp.com' }
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.perform_deliveries = true
  config.action_mailer.default :charset => "utf-8"
  # SendGrid の場合
  config.action_mailer.smtp_settings = {
    :address => 'smtp.sendgrid.net',
    :port => 587,
    :domain => 'heroku.com',
    :user_name => 'apikey',
    :password => ENV['SENDGRID_API_KEY'],
    :authentication => :plain,
    :enable_starttls_auto => true
  }

上記の{ host: 'https://Herokuのアプリ名.herokuapp.com' }の部分は、ご自身が作成したHerokuのアプリ名に置き換えてください。

Gmail用の設定

config/environments/production.rbに下記のように記述します。

  config.action_mailer.default_url_options = { host: 'https://Herokuのアプリ名.herokuapp.com' }
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.perform_deliveries = true
  config.action_mailer.default :charset => "utf-8"
  # Gmail の場合
  config.action_mailer.smtp_settings = {
  :enable_starttls_auto => true,
  :address => "smtp.gmail.com",
  :port => 587,
  :domain => 'smtp.gmail.com',
  :user_name => ENV['GMAIL_ADDRESS'],
  :password => ENV['GMAIL_PASSWORD'],
  :authentication => 'login'
}

こちらも同様に{ host: 'https://Herokuのアプリ名.herokuapp.com' }の部分は、ご自身が作成したHerokuのアプリ名に置き換えてください。

環境変数の設定(Herokuの設定で記述)

開発環境用の環境変数はローカル上の.envに記述しましたが、本番環境用の環境変数はHeroku上に記述します。

まずは、アプリの「Setting」タブ中の「Reveal Config Vars」をクリックします。

Config Varsの一覧に、今回設定したい環境変数名と値を以下のように追加していきます。

追加したい環境変数名は下記を参考にしてください。

SENDER_ADDRESS (送信元のメールアドレス)
SENDGRID_API_KEY (SendGridのAPIキー)
GMAIL_ADDRESS (Gmailのメールアドレス)
GMAIL_PASSWORD (Gmailのアプリパスワード)

設定が全て完了したら、変更したコードをアプリに反映させ(デプロイ)、実際にメールの送信ができるか試してみましょう。

メール送信テスト

以下、アカウント有効化用のメールを送信し、登録したアドレス宛に届いたもののスクショです。(SendGridで送信)

差出人の横をよく見ると、「sendgrid.net経由」と表示されています。

このようなメールが届いたら送信成功です。

今回はSendGridとGmailの2パターンで試してみましたが、個人的にはSendGridの方がメール送信のレスポンスが早いなと感じました。

今後、不特定多数のユーザーに自分の作ったサービスを利用してもらう場合、やはり全てにおいて「早い(速い)」に越したことはありません。

SendGridは少々セキュリティ的に厳しい面々(アカウント凍結されるリスク)もありますが、今後末長く使うなら僕はSendGridが良いかなと思います。

以上です。お疲れ様でした。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

愛知の34歳。無職で暇になり始めたプログラミング(Ruby on Rails)の忘備録をまとめたブログです。最近は別にやりたいことができたのでプログラミングほぼやっていません。気が向いたらまた再開するかも。僕の日常はメインブログの方で更新しています。

コメント

コメントする

目次