読者です 読者をやめる 読者になる 読者になる

ActionMailerとERBを単体で使ってRailsみたいにメールを飛ばしたいんです

ruby

もうrails使えよみたいな。。

require 'yaml'
require 'action_mailer'
require 'erb'

conf = YAML.load_file('config.yml')
ActionMailer::Base.smtp_settings = {
  address: 'smtp.gmail.com',
  port: 587,
  domain: 'smtp.gmail.com',
  authentication: :plain,
  user_name: conf['mailer']['user_name'],
  password: conf['mailer']['password'],
  enable_starttls_auto: true
}
ActionMailer::Base.raise_delivery_errors = true
ActionMailer::Base.delivery_method = :smtp

class Mailer < ActionMailer::Base
  default from: aaaaaaaa@bbbbbbb.com

  def notice(to, subject, body)
    mail(to: to, subject: subject) do |format|
      format.text { render text: body }
    end
  end
end

Mailer.notice('xxxxxx@yyyyy.com', 'subject', ERB.new(DATA.read, nil, '-').result(binding)).deliver
__END__
本日 <%= Time.now.strftime('%F') %> の買い物リスト

<%- ['きのこの山', 'GTA5'].each do |item| -%>
・<%= item %>
<%- end -%>

前回のActionMailer使用例のuser/passをyamlから取ってくるように変えました。
yamlは単体で使うとシンボルでアクセスできないんですね。。

railsで.html.erbを書く時、<%- -%>と書けばその行の行頭空白・行末改行をトリムしてくれましたが、erbを単体で書く場合はERB.newの引数でtrim_modeに'-'を明示しなければいけません。

またActionMailerでメールを投げるメソッド名にはルールというか予約名があるかもしれません。ちゃんと調べていませんが、上記のMailer.noticeは最初Mailer.sendという名前にしていまして、このとき引数toに渡したメールアドレス文字列をなぜかメソッド名として解釈されてしまい何度もmethod missingエラーをもらいました。

D:/RailsInstaller/Ruby1.9.2/lib/ruby/gems/1.9.1/gems/actionmailer-3.1.0/lib/action_mailer/base.rb:455:in `method_missing': undefined method `xxxxx@yyyyyyy.com' for Mailer:Class (NoMethodError)

こんな調子のエラーです。メソッド名をsendddとかにしたらエラーが出なくなったので、メソッド名が悪いのかと。
2013/10/13訂正 これは単にObject#sendを呼んでしまっているんでしょうね。。オーバーライドできていないのは私が基本的なことをわかっていないからでしょう。うう。。

参考