【Ruby on Rails】Action Mailer設定
送信元としてgmail を使ってメール送信する際に、Mailerの設定(下記の手順3.)でつまづいたので、設定について調べてみました。
設定について公式ドキュメントを読んで理解を深めることに。(日本語の公式ドキュメントには翻訳されていない部分があったので、英語バージョンを参考にしました)
今回確認するのは下記の設定(config/environments/production.rbに設定を記載)
config.action_mailer.default_url_options = { host: example.comなど,appのホスト名)}
config.action_mailer.perform_deliveries = true
config.action_mailer.raise_delivery_errors = true
config.action_mailer.asset_host = example.comなど,appのホスト名
ActionMailer::Base.smtp_settings = {
:user_name => ENV['SENDGRID_USERNAME'],
:password => ENV['SENDGRID_PASSWORD'],
:domain => 'gmail.com',
:address => 'smtp.sendgrid.net',
:port => 587,
:authentication => :plain,
:enable_starttls_auto => true,
:openssl_verify_mode => 'none',
:ssl => true,:tls => true
}
1. default_url_options
参考:
https://guides.rubyonrails.org/action_mailer_basics.html#generating-urls-in-action-mailer-views
mailer の実態は、app/mailers/application_mailer.rbで定義されている、class ApplicationMailer < ActionMailer::Base。
「これは、app/controllersで定義されているコントローラと違い、入ってきたリクエストの情報を持たないので、host を定義しないとURLを作成できない」
とのこと。必ず設定しないとメール用のview内でパスを記載できないっぽいです。
また、普段はviewの中では*_pathを使いますが、メール用のview内では下記のように、*_urlを使うことに注意です。
<%= link_to 'welcome', welcome_url %>
私はconfig/environments/production.rbにdefault_url_optionsを記載したのですが、公式ではconfig/application.rbに記載できるよ!と書いてありました。
(host情報は一般的にアプリケーション内で変わらない定数なため)
ただ、テスト環境と本番環境でhostが変わるので、production.rbとdevelopment.rbで別々のhostを指定するのが良いと思います。
2. perform_deliveries
参考:
https://guides.rubyonrails.org/action_mailer_basics.html#action-mailer-configuration
実際にメール送信するかを設定できるようです。
デフォルトではtrueなので、本番環境では設定必要ないですね。
テスト環境ではfalse にしたり、ユーザの権限が管理者ならthanksメールを送らないようにfalseにしたりなどで使えそうです。
3. raise_delivery_errors
参考:
https://guides.rubyonrails.org/action_mailer_basics.html#action-mailer-configuration
メール送信に失敗した時に、エラーを発生させる場合はtrue。
メルマガのように、複数人に一斉送信のような場合は、falseにした方が良いと思います。
true の場合も、mailerを実行しているコントローラ上で、エラー処理を書く必要があるかな。
テスト環境の場合は常にtrueで良さそうです。
4. asset_host
参考:
https://guides.rubyonrails.org/action_mailer_basics.html#adding-images-in-action-mailer-views
1.と似ていますが、これはimage_tag、javascript_tag, stylesheet_tag をメール用のview内で使うために設定します。これを設定すると、下記のようにいつもの*_tagが使用できるようになります。
<%= image_tag 'image.jpg' %>
5. smtp_settings
参考:
https://guides.rubyonrails.org/action_mailer_basics.html#action-mailer-configuration
*user_name
gmailなど、リモートのメールサーバを使う際に、Basic認証が必要場合は、そのユーザ名を設定する。ENV['SENDGRID_USERNAME']のように、環境変数を使用した方がいいですね。
*password
gmailなど、リモートのメールサーバを使う際に、Basic認証が必要場合は、そのパスワード設定する。
*domain
SMTPクライアントのHELOドメインを記載。gmailを使う場合は、”gmail.com” を設定。
gmailの場合の設定値は下記参照
*address
リモートのメールサーバを使用する時に、アドレスを設定。
HerokuでSendgridを使う場合は、”smtp.sendgrid.net”を設定する。
参考:
https://devcenter.heroku.com/articles/sendgrid#configure-actionmailer-to-use-sendgrid
*port
SMTPのポートを指定。
gmail でSSLなら465、TLSなら587。TLS推奨( SSL の後継バージョンが TLSのため)
STARTTLS とは。SSL と TLS と STARTTLS の違い - wjmax blog
*authentication
:plain(パスワード暗号化なし), :login(Base64でエンコードしたパスワード送信), :cram_md5(パスワード暗号化あり) が選べる。
gmailがこれらの認証に対応しているか不明だったのですが、cram_md5 に対応しているメールサーバを使用する場合は、cram_md5 にしておいた方が無難かと思います。
*enable_starttls_auto
メールサーバがSTARTTLSに対応しているか検知した場合に、自動でSTARTTLSを使用する場合はTrue
*openssl_verify_mode
TLSを使用する場合、OpenSSLが証明書をチェックする方法を設定できます。
'none', 'peer', 定数(OpenSSL :: SSL :: VERIFY_NONEまたはOpenSSL :: SSL :: VERIFY_PEER)を直接使用できます。
OpenSSLの証明書について
sslを使用する場合、ssl=true,tlsを使用する場合はtls=trueなのかな?と思いましたが、とりあえずどちらもtrueにしておきました、、、
以上ですーーーー!!
今回色々と設定について調べていくうちに、サーバや、ネットワーク、SMTPの仕組みなど自分の知識不足が分かりました、、、
下記サイトを先輩にお勧めされたので、ちょっとずつ読んでいこうと思います
おやすみなさいいいぃぃぃ