メールを送る

以下のサイトを参考に。

基本は

1. ActionMailerを継承してクラスを作る

require 'action_mailer'

class MyPluginMailer < ActionMailer::Base
end

2. 適当なメソッドを作る

require 'action_mailer'

class MyPluginMailer < ActionMailer::Base
  def remainder( user )
  end
end

3. メールを作る
from,recipients,subjectなどはそのまま設定
本文はテンプレートを使って作るので、そちらに引き渡したい情報を body に設定

require 'action_mailer'

class MyPluginMailer < ActionMailer::Base
  # リマインダメールを送る
  def remainder( user )
    subject     "リマインダのテスト"
    from        "couger@example.com"
    recipients  user.mail
    body        :user=>user
  end
end

4. 本文に利用するテンプレートを作る
上記の MyPluginMailer の場合 views/my_plugin_mailer/remainder.rhtml になる。
ここではまった…。

5. コントローラーから呼び出して、メールを送る
MyPluginMailer に作ったメソッド remainder の前に deliver_ を付けること。

class MyPluginController < ApplicationController
  # リマインダメールを送る
  def deliver_remainder()
    MyPluginMailer.deliver_remainder( user )
  end
end

以上。分かっていればとても簡単。メールサーバや認証の設定がこれに加わる。
家で使っているプロバイダは

  • POPbeforeSMTP を使っている
  • メール送るときにも認証が必要

だったので、

  • MyPluginMailer にSMTPの設定を追加
  • ActionMailerはPOPbeforeSMTPに対応していないっぽいので、remainder メソッドで無理やり?認証。
require 'action_mailer'
require 'net/pop'

ActionMailer::Base.delivery_method = :smtp # デフォルトSMTPらしいのでいらないかも。
ActionMailer::Base.smtp_settings = {
  :address => 'mail.example.com',
  :port => 587,
  :domain => 'localhost', # いるのだろうか?
  :authentication => 'login',
  :user_name => 'couger@example.com',
  :password => 'password'
}

class MyPluginMailer < ActionMailer::Base
  # リマインダメールを送る
  def remainder( user )
    # POPbeforeSMTPへの対応
    Net::POP3.auth_only('mail.example.com', 110, 'couger@example.com', 'password')

    subject     "リマインダのテスト"
    from        "couger@example.com"
    recipients  user.mail
    body        :user=>user
  end
end

以上。
POPbeforeSMTPだけ入れて、SMTPの認証を忘れてたせいでかなりはまってしまった…。
文字コードに関する問題があるみたいだけど、そっちは次の機会に。