#はじめに
某プログラミングスクールでのチーム開発振り返り編。
どうせなら、ちゃんとメール送信できる環境にしたいな…と、考えました。
が、メールサーバたてるの?!どうすりゃいっけ?!って思っていたら、gmailが使えるようなので、お試しでgmailアカウントからメール送信してみました。
間違っている点などあれば、ご指摘・指南いただけると嬉しいです!
#実現したいこと
開発環境および、本番環境でgmailを使ったメール送信
#全体の流れ
今回はこんな感じの流れです。
[gmailアカウントで2段階認証用のパスワード取得]
↓
[Railsのconfig設定変更]
#設定手順
それでは、コチラもちゃきちゃき行きましょう。
##gmailアカウント/2段階認証用のパスワード取得
gmailのアカウント取得が必要です。
今回は、gmailアカウントの2段階認証をオンにして、専用の認証パスワードを取得した上で設定を行いました。
※通常の認証パスワードを使用するとエラーとなります。(Net::SMTPAuthenticationErrorとか出ちゃいます)
① 送信用に利用するgmailのアカウントでログイン
googleアカウント画面を表示してください。
② [セキュリティ]設定
画面左のメニューから[セキュリティ]を選択し、セキュリティの設定画面を開きます。
③ 2段階認証を有効化
[Googleへのログイン]にある[2段階認証プロセス]を選択し、画面に沿って設定を完了させてください。
※既に有効な場合は、手順をスキップしてください
④ アプリで利用するためのパスワードを取得します。
[Googleへのログイン]にある[アプリパスワード]を選択し、パスワードを発行してください。
⑤ パスワード取得完了
発行完了すると、下図の用に16桁の番号が払い出されます。
この番号をメールアカウントの認証パスワードとして、利用してください。
##Railsのconfigファイル編集
メール送信設定はconfig/environment
配下にある各環境ごとの設定ファイルに定義すればOKです。
開発環境と本番環境の違いはdefault_url_options
くらいかなと思います。
ほぼ一緒ですが、とりあえず羅列^^;
【フォルダ構成】
config
∟environments
∟development.rb ・・・ 開発環境
∟test.rb ・・・ テスト環境(今回は対象外)
∟product.rb ・・・ 本番環境
###①開発環境
Rails.application.configure do
#中略#
#deviseが認証用のURLなどを生成するのに必要になる(らしい)
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
#送信方法を指定(この他に:sendmail/:file/:testなどがあります)
config.action_mailer.delivery_method = :smtp
#送信方法として:smtpを指定した場合は、このconfigを使って送信詳細の設定を行います
config.action_mailer.smtp_settings = {
#gmail利用時はaddress,domain,portは下記で固定
address:"smtp.gmail.com",
domain: 'gmail.com',
port:587,
#gmailのユーザアカウント(xxxx@gmail.com)※念のため、credentials.yml.enc行き
user_name: Rails.application.credentials.gmail[:user_name],
#gmail2段階認証回避のためにアプリケーションでの利用パスワードを取得、必ずcredentials.yml.endに設定を!!
password: Rails.application.credentials.gmail[:password],
#パスワードをBase64でエンコード
authentication: :login
}
#中略#
end
###②本番環境
Rails.application.configure do
#中略#
#deviseが認証用のURLなどを生成するのに必要になる(らしい)
config.action_mailer.default_url_options = { :host => 'http://ipアドレス'or'ドメイン名' }
#送信方法を指定(この他に:sendmail/:file/:testなどがあります)
config.action_mailer.delivery_method = :smtp
#送信方法として:smtpを指定した場合は、このconfigを使って送信詳細の設定を行います
config.action_mailer.smtp_settings = {
#gmail利用時はaddress,domain,portは下記で固定
address:"smtp.gmail.com",
domain: 'gmail.com',
port:587,
#gmailのユーザアカウント(xxxx@gmail.com)※念のため、credentials.yml.enc行き
user_name: Rails.application.credentials.gmail[:user_name],
#gmail2段階認証回避のためにアプリケーションでの利用パスワードを取得、必ずcredentials.yml.endに設定を!!
password: Rails.application.credentials.gmail[:password],
#パスワードをBase64でエンコード
authentication: :login
}
#中略#
end
###smtp送信の設定項目
以下のような設定項目が用意されているようです。
色々試してみると楽しいです。
項目名 | 概要 | 設定値 |
---|---|---|
:address | リモートメールサーバーの利用を許可する。 | デフォルト:localhost 異なる場合は適宜設定を行う |
:port | smtp(メール)サーバのポート番号 | デフォルト:25 異なる場合は適宜設定を行う |
:domain | リモートメールサーバーのドメインの指定 | デフォルt指定なし 必要に応じHELOドメインを指定 |
:user_name | smtp(メール)サーバのユーザ認証アカウント | デフォルト:指定なし 必要な場合は設定する |
:password | smtp(メール)サーバのユーザ認証パスワード | デフォルト:指定なし 必要な場合は設定する |
:authentication | 認証パスワードのやりとり方法 | 認証アカウントの設定がある場合は、下記のいずれかを選択 :plain/平文 :login/Base64でエンコード :cram_md5/チャレンジ/レスポンスによる情報交換と、MD5アルゴリズムによる重要情報のハッシュ化の組み合わせ(gmailはこの設定だとエラー) |
:enable_starttls_auto | SMTPサーバーでSTARTTLSが有効かどうかを検出して有効にする | デフォルト:true gmailではfalseにするとエラーになりました |
:openssl_verify_mode | TLSを利用する場合にOpenSSLが認証をチェックする方法を指定 | OpenSSL検証定数の名前('none'、'peer'、'client_once'、'fail_if_no_peer_cert') |
###その他のオプション | ||
raise_delivery_errors | ||
メール配信に失敗した場合にエラーを発生するかどうかを指定します。このオプションは、外部のメールサーバーが即時配信を行っている場合にのみ機能します。 | ||
trueにしておくことで、送信元のメールboxに送信エラーとなったメールがそのまま届きます! |
##補足説明
gmailアカウントの秘匿
credential.yml.enc
に追加することをお勧めします。(Rails5.2以上)
具体的な設定方法はコチラを参照ください。
#まとめ
AWSでお試し環境動かす方が苦労して、あまり感想が・・・と言う^^;
メールには様々なセキュリティ対策のための仕組みがあると思うので、その実現のための方法を模索したりするのも楽しそうです。AWSのメールサービスとか使うとフィルタ機能も使えるみたいなんで、少し心が動く所。。
#参考
Action Mailer の基礎
→ 殆どがこちらの記載内容を参考に書いたものです^^;