ActionMailerとERBを単体で使ってRailsみたいにメールを飛ばしたいんです
もう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を呼んでしまっているんでしょうね。。オーバーライドできていないのは私が基本的なことをわかっていないからでしょう。うう。。