AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

dotenv で $ を含む文字列が渡せなかった

だいぶ古い環境だけど。

  • Rails 5.1.7
  • dotenv 2.2.1

Variable Substitution

dotenv には Variable Substitution という仕組みがあって ${VAR} $VAR のようにして変数に変数を突っ込める。

github.com

で、以下のような記述をしていた。この状態で 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' にすりゃいいんだろうか、試すのわすれちまったヨ。