Railsで作ったアプリからメールを送信したい場合、外部のメールサーバーを利用してメールを送ることになります。
今回は、Railsのアプリ制作でよく取り上げられているメールサーバーのうち、SendGridとGmailの設定方法について解説しようと思います。
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
詳しくは下記記事を参照(説明は割愛させていただきます)。
メール差出人(送信元)情報の設定
差出人のメールアドレスを設定します。
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への登録について、
- SendGrid への登録(アカウント作成)
- メール差出人情報(送信元メールアドレスなど)の登録
- 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を利用したスパムメールの被害が多発したため、昨年くらいからアカウント登録の基準がかなり厳しくなったそうです。
(Heroku経由でSendGridに登録するとアカウント凍結されるのは、おそらくこういう背景があるものと推測されます)
もしこのようなメールが来た場合、なるべく早めに返信することをおすすめします。
返信しなかった場合、再び催促メールが来るのと、最悪の場合はアカウント凍結されてしまうかもしれません。
英語での返信方法については以下の記事を参考にしてみてください。
返信して問題なければ、そのまま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が良いかなと思います。
以上です。お疲れ様でした。
コメント