概要
RailsのWebアプリケーション開発において、メールの送信サーバの設定などを外部のファイルに分けておいて、その情報を定数として読み込んで利用したいと思っている人は、多いのではないでしょうか。
そこで、メールの情報をファイルとして分けておいて実行時に読み込む方法を紹介します。
環境
- Rails 5.1
- Ruby 2.4
失敗した方法
当初は、configなどのような定数管理用のGemを使って設定をしようとしました。実際に、使ってみたのですが、なんと、それらの情報はメールの設定の時には設定が読み込まれておらず、うまく設定できないという問題に直面しました。
なので、今回はそれらのGemとは別のものを使って、実現しました。
方法
実現の方法として、figaroというGemを使用しました。
figaroは、YAML形式で定数を記述し、その情報をENVから読み取ることができるGemです。
インストールのために、Gemfileに下記のものを追記します。
gem 'figaro'
そして、bundle install を実行して、インストールを完了させます。
figaroの設定ファイルは、下記のコマンドを実行して作成します。
bundle exec figaro install
設定ファイルは、config/application.ymlとして作成されます。
今回は、メールアドレスの情報を登録するので、config/application.ymlに下記の情報を書いておきます。
# メール送信サーバの設定(gmailの場合)
delivery_method: # smtp
smtp_enable_starttls_auto: # true
smtp_address: # smtp.gmail.com
smtp_port: # 587
smtp_domain: # smtp.gmail.com
smtp_authentication: # plain
smtp_user_name: # [email protected]
smtp_password: # password
中身は、適当に変更してください。
次に、メールの情報を読み込むようにRailsの設定ファイルを書き換えます。
今回は、開発用で使うことを想定しているので、config/environments/development.rbの末尾に設定を追加します。
Rails.application.configure do
# 省略
config.action_mailer.delivery_method = ENV['delivery_method'].to_sym
config.action_mailer.smtp_settings = {
enable_starttls_auto: ENV['smtp_enable_starttls_auto'],
address: ENV['smtp_address'],
port: ENV['smtp_port'],
domain: ENV['smtp_domain'],
authentication: ENV['smtp_authentication'],
user_name: ENV['smtp_user_name'],
password: ENV['smtp_password']
}
end
application.ymlで設定した設定は、ENVから参照できます。
これで、メールを送れるようになりました。
この設定のコツとして、development.rbのdelivery_methodの設定値をシンボルに変換しなければならないというものがあります。シンボル以外の情報を渡すと、うまく設定できません。
さいごに
Gitでバージョン管理をしている場合において、application.ymlはGitの管理に含まれません。なので、application.ymlの雛形を作ったらapplication.yml.sampleなどの名前でファイルをコピーしてそれをGitで管理するということをお勧めします。