だいぶ古い環境だけど。
- Rails 5.1.7
- dotenv 2.2.1
Variable Substitution
dotenv には Variable Substitution という仕組みがあって ${VAR} $VAR のようにして変数に変数を突っ込める。
で、以下のような記述をしていた。この状態で deliver_now など SMTP 認証してメール送信、としようとするとエラーとなる。
config/environments/production.rb
config.action_mailer.smtp_settings = {
:address => "smtp.example.com",
:port => 587,
:domain => ENV['SMTP_DOMAIN'],
:authentication => :login,
:user_name => ENV['SMTP_USER_NAME'],
:password => ENV['SMTP_PASSWORD']
}
.env
# smtp SMTP_DOMAIN="example.com" SMTP_USER_NAME="user@example.com" SMTP_PASSWORD="pas$word"
$ は変数として認識される
これ単純に気付いてなかったんだけど、以下のように記載がある。
If a value contains a $ and it is not intended to be a variable, wrap it in single quotes.
意訳: 値に $ が入っていて変数じゃない時は、シングルクォートで囲ってね
なるほどな、ということであった。 上記だと pas と変数 $word の組み合わせになってしまっているんですネー。
README はよく読もう! と言われてなるべく読んではいるんだけど、まあ忘れるよねってヤツであった。 今回は、変更後のパスワードに $ は含めないようにしていたので、結局 .env だけ書き換えて終了した。 SMTP_PASSWORD='pas$word' にすりゃいいんだろうか、試すのわすれちまったヨ。