「RailsによるアジャイルWebアプリケーション開発」24章読了
Action Mailerのお話し。
とりあえずメールを送ってみる。
サンプルとして、SMTPによるメール送信を試みる。
サーバはこういう時に僕がいつも使っているJamesを利用。(Jamesの設定は割愛します。どこかに載ってますので。)
まずは、SMTPの設定。
config/environments/developement.rbを編集する。
# Don't care if the mailer can't send #config.action_mailer.raise_delivery_errors = false config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { :address => "localhost", :port => 25, :domain => "localhost", :authentication => :plain } config.action_mailer.perform_deliveries = true config.action_mailer.raise_delivery_errors = true config.action_mailer.default_charset = "utf-8"
元々の
config.action_mailer.raise_delivery_errors = false
は、エラーが起きてもシカトする設定なので、これをコメントアウトして、各行追記する。
4行目のところ、server_settingsではなく、smtp_settingsにしないと、mailerをgenerateするときに、
taka@taka-desktop:~/test$ ruby script/generate mailer OrderMailer confirm sent /usr/lib/ruby/gems/1.8/gems/actionmailer-2.1.0/lib/action_mailer/base.rb:385:in `method_missing': undefined method `server_settings=' for ActionMailer::Base:Class (NoMethodError) from /usr/lib/ruby/gems/1.8/gems/rails-2.1.0/lib/initializer.rb:455:in `send' from /usr/lib/ruby/gems/1.8/gems/rails-2.1.0/lib/initializer.rb:455:in `initialize_framework_settings' from /usr/lib/ruby/gems/1.8/gems/rails-2.1.0/lib/initializer.rb:454:in `each' from /usr/lib/ruby/gems/1.8/gems/rails-2.1.0/lib/initializer.rb:454:in `initialize_framework_settings' from /usr/lib/ruby/gems/1.8/gems/rails-2.1.0/lib/initializer.rb:451:in `each' from /usr/lib/ruby/gems/1.8/gems/rails-2.1.0/lib/initializer.rb:451:in `initialize_framework_settings' from /usr/lib/ruby/gems/1.8/gems/rails-2.1.0/lib/initializer.rb:133:in `process' from /usr/lib/ruby/gems/1.8/gems/rails-2.1.0/lib/initializer.rb:93:in `send' from /usr/lib/ruby/gems/1.8/gems/rails-2.1.0/lib/initializer.rb:93:in `run' from /home/taka/test/config/environment.rb:13 from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require' from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:27:in `require' from /usr/lib/ruby/gems/1.8/gems/rails-2.1.0/lib/commands/generate.rb:1 from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require' from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:27:in `require' from script/generate:3
のようなエラーが出てハマるので注意。
うまく実行されるとこんな感じ。
taka@taka-desktop:~/test$ ruby script/generate mailer OrderMailer confirm sent exists app/models/ create app/views/order_mailer exists test/unit/ create test/fixtures/order_mailer create app/models/order_mailer.rb create test/unit/order_mailer_test.rb create app/views/order_mailer/confirm.erb create test/fixtures/order_mailer/confirm create app/views/order_mailer/sent.erb create test/fixtures/order_mailer/sent
とりあえず送信できるかどうか試したいので、宛先とFromを設定する。
app/models/order_mailer.rb
def confirm(sent_at = Time.now) subject 'OrderMailer#confirm' recipients 'taka@localhost' from 'taka@localhost' sent_on sent_at body :greeting => 'Hi,' end
recipientsとfromをtaka@localhostに設定しました。
メールを送信するアクションをコントローラに定義する。
app/controllers/products_controller.rb
def send_mail OrderMailer.deliver_confirm redirect_to :action => :index end
メールを送信して、インデックスページにリダイレクトするだけのシンプルなアクションです。
ちなみに、create_confirmだと、作成したメールの内容が返されるだけで、メールは送信されません。(10分くらいハマった。。)
で、
http://localhost:3000/products/send_mail/1
にアクセス。
メーラ(Evolution)で確認したところ、
無事メールが送信されました。
ちなみに、日本語が化けるという情報もあるようですが、
私が確認した限りでは問題ありませんでした。