deviseでサインアップした時にメールを送れるようにする

引き続き devise の話。confirmation 用のメールを送る設定。
config/environments/development.rb に次の設定を追加する。

config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  :address        => 'smtp.gmail.com',
  :port           => 587,
  :authentication => :plain,
  :user_name      => 'メールアドレス',
  :password       => 'パスワード'
}

とはいえ、メールアドレスやパスワードをハードコーディングするのは良くないよなあ。どうやるのがいいんだろ。

追記

メールアドレスやパスワードの設定場所は、以下のページによると config フォルダ以下に .yml ファイルを作って、config/initializers フォルダにおいたスクリプトで読み込むのがいいらしい。

 cf. Railsの設定情報 – Build INSIDER
 cf. Rails でアプリ固有の設定情報や定数を定義する – EasyRamble

そこで、次のように config/app_config.yaml と config/initializers/app_config.rb を作った。

---
development:
  email: メールアドレス
  email_password: パスワード
test:
  email: メールアドレス
  email_password: パスワード
production:
  email: メールアドレス
  email_password: パスワード
APP_CONFIG = YAML.load_file("#{Rails.root}/config/app_config.yml")[Rails.env]

ところが、これで Rails コンソールを立ち上げようとするとエラーになる。

takatoh@nightschool:~/w/lathercraft$ rails console
/home/takatoh/w/lathercraft/config/environments/development.rb:44:in block in ': uninitialized constant APP_CONFIG (NameError)
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/railtie.rb:210:in instance_eval'
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/railtie.rb:210:in configure'
	from /home/takatoh/w/lathercraft/config/environments/development.rb:1:in '
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/engine.rb:594:in block (2 levels) in '
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/engine.rb:593:in each'
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/engine.rb:593:in block in '
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/initializable.rb:30:in instance_exec'
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/initializable.rb:30:in run'
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/initializable.rb:55:in block in run_initializers'
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/tsort.rb:226:in block in tsort_each'
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/tsort.rb:348:in block (2 levels) in each_strongly_connected_component'
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/tsort.rb:418:in block (2 levels) in each_strongly_connected_component_from'
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/tsort.rb:427:in each_strongly_connected_component_from'
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/tsort.rb:417:in block in each_strongly_connected_component_from'
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/initializable.rb:44:in each'
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/initializable.rb:44:in tsort_each_child'
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/tsort.rb:411:in call'
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/tsort.rb:411:in each_strongly_connected_component_from'
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/tsort.rb:347:in block in each_strongly_connected_component'
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/tsort.rb:345:in each'
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/tsort.rb:345:in call'
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/tsort.rb:345:in each_strongly_connected_component'
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/tsort.rb:224:in tsort_each'
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/tsort.rb:205:in tsort_each'
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/initializable.rb:54:in run_initializers'
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/application.rb:300:in initialize!'
	from /home/takatoh/w/lathercraft/config/environment.rb:5:in '
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/spring-1.1.3/lib/spring/application.rb:92:in preload'
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/spring-1.1.3/lib/spring/application.rb:140:in serve'
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/spring-1.1.3/lib/spring/application.rb:128:in block in run'
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/spring-1.1.3/lib/spring/application.rb:122:in loop'
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/spring-1.1.3/lib/spring/application.rb:122:in run'
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/spring-1.1.3/lib/spring/application/boot.rb:18:in '
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in require'
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in require'
	from -e:1:in main'

最初の方に書いてあるけど、APP_CONFIG 定数が初期化されていない、と出てる。推測するに、config/initializers/app_config.rb よりも config/environments/development.rb (ここで APP_CONFIG を参照している)のほうが先に読み込まれるんではなかろうか。
結局、他に方法が思いつかなかったので、config/app_config.yml を config/envronments/development.rb の中で読み込むように変更した。

APP_CONFIG = YAML.load_file("#{Rails.root}/config/app_config.yml")[Rails.env]

config.action_mailer.default_url_options = { :host => 'localhost:3000' }
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  :address        => 'smtp.gmail.com',
  :port           => 587,
  :authentication => :plain,
  :user_name      => APP_CONFIG["email"],
  :password       => APP_CONFIG["email_password"]
}

これでうまく動いた。

「deviseでサインアップした時にメールを送れるようにする」への2件のフィードバック

  1. こんにちは、EasyRamble を運営してます Taka と申します。文中でリンク紹介頂きありがとうございました。

    1点ご注意としてのコメントなのですが、Rails4.1からデフォルトで config/secrets.yml というファイルが用意されており、メアドやパスワードなどの固有定数はそちらで定義したほうが良いかと思います。詳しくは以下のページなど。
    http://edgeguides.rubyonrails.org/4_1_release_notes.html#config/secrets.yml
    https://blog.panicblanket.com/archives/2016

    以上ですが、よろしくお願いいたします!

    1. Takaさん、こんにちは。
      有用な情報をありがとうございます。さっそく試してみます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください