2013年11月30日土曜日

rubyでHTML mail送信してみる

タイトルの通り、mail送信する事がでてきたので準備してみました。
ポイントは下記
  • 全体的にシンプルに
  • HTML部分はERBを使用
  • 全てを1fileで、見通しよく


mail送信ライブラリを選ぶ

mail送信ライブラリですが、ruby toolboxをみると、Action MailerとMailの2つが主なライブラリのようです。
さらにこちらをみると、Action MailerもMailも書き方はあまり変わらないようです。今回はRubyでMailを送信するだけなので、Mailを使うことにします。


ERBを使う

ERBはHTMLなどの文章の中にRubyスクリプトを埋め込むためのライブラリです。
Railsで、erb fileで馴染みがあったので、今回同じように使いたいなと思った次第です。 ERBについては、るびまの説明が参考になりました。標準添付なのであらためてのinstall不要です。


DATAと__END__を使う

Perlの__DATA__と同様に、RubyではDATAと__END__で、スクリプトファイルにDATAを埋め込むことができます。 DATA部分の読み込みは上述のるびまのサンプルを参考にしました。


サンプル

以上よりサンプルを作ってみました。
事前にMailライブラリはgem install mailなどでinstallしてください。 下記は、smtpサーバを指定していますが、スクリプト動かしているマシンのsendmailに渡せるのであれば、sendmailを使った方が簡単です。
#! /usr/bin/env ruby
# -*- coding: utf-8 -*-
require 'mail'
require 'erb'

user = 'あああ'
name = 'いいい '

mail = Mail.new do
  from    'aaa@aaa.com'
  to      'bbb@bbb.com'
  subject 'sample_subject'
  html_part do
    content_type 'text/html; charset=UTF-8'
    body ERB.new(DATA.read).result(binding)
  end
end

# sendmailに渡すだけでよければ、こちらをコメントイン
=begin
mail.delivery_method :sendmail
mail.deliver
=end

# sendmailに渡すだけでよければ、こちらをコメントアウト
mail.delivery_method :smtp, {
  address: 'smtp.aaa.com',
  port:    587,
  domain:  'aaa.com',
  user_name:    'aaa@aaa.com',
  password:     'xxxxxxxxxxxxxxx',
}
mail.deliver

__END__
<!DOCTYPE html>
<html>
  <body>
    <h1>こんにちは、<%= user %>さん!</h1>
    <p>
      あなたの名前は<%= name %>さんです。よろしくね!
    </p>
  </body>
</html>


まとめ

  • 書いてみるとこんだけなんですが、調べるとそのものずばりの情報がなかったので、忘備録として書いてみました。
  • 「こんな方法があるよ」的な話があると教えてもらえると幸いです。
このエントリーをはてなブックマークに追加