ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

「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)で確認したところ、
無事メールが送信されました。

ちなみに、日本語が化けるという情報もあるようですが、
私が確認した限りでは問題ありませんでした。