«S-Fマガジン 2011年 08月号(初音ミク特集) 最新 RubyからGMailにメールを送る html編»

発狂する近況


2011/08/30 [Ruby] RubyからGMailにメールを送る テキスト編

ふと思い立って、Ruby経由でGMailにメールを送ってみることにした。 普通にsmtp経由でメールを送るには、net/smtpを使えばいいはずだが、GMailを直接利用するには、TLS経由でなおかつ認証を通さなければならない。 まあ、ちょっといじれば実現でっきるっぽいが、今回はActionMailer経由で送ってみることにする。

ActionMailerはRailsのコア・ライブラリのひとつで、当然ながらRails上からの送信を想定した作りになっている。例えば、Railsのディレクトリ上で、 $ rails generate mailer UserMailer みたいな感じで実行すると、ActionMailer::Baseを継承したUserMailerクラスを app/mailers/user_mailer.rb 上に生成してくれる。

参考:
http://edgeguides.rubyonrails.org/action_mailer_basics.html

が、別に単独でも動作させることができるようになっているので、今回はクラスの作成から全部手作業で行っていくことにする。 (もちろん、事前に gem 等でactionmailerを入れておく必要がある)

参考:
http://yakinikunotare.boo.jp/orebase/index.php?Ruby%2F%A5%E1%A1%BC%A5%EB%A4%F2%C1%F7%BF%AE%A4%B9%A4%EB

http://d.hatena.ne.jp/shunsuk/20110110/1294657636

以下は、Ruby 1.9.2で書いた例。

#! /usr/bin/env ruby
# -*- coding: utf-8 -*-

require 'rubygems'
require 'action_mailer'

class UserMailer < ActionMailer::Base
   def createMail(toAddress, subject, message)
      mail(:to => toAddress,
           :subject => subject,
            :from => 'fuga@example.com',
           :body => message
           )
   end
end

#ActionMailerの設定
ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.perform_deliveries = true
ActionMailer::Base.raise_delivery_errors = true
ActionMailer::Base.smtp_settings = {
  :enable_starttls_auto => true,
  :address            => 'smtp.gmail.com',
  :port               => 587,
  :domain             => 'gmail.com',
  :authentication     => :plain,
  :user_name          => 'ログイン名',
  :password           => 'パスワード'
}

#メールの送信
UserMailer.createMail('hoge@example.com', "テストメールSubject", "テストメール本文").deliver

こんな感じで普通のテキストメールを送ることができる。最初はファイルの文字コードをeuc-jpにして実行したら、Subjectが文字化けしてしまった。utf-8に変えると「GMail上では」問題なく表示される。まあ、本当はISO-2022-JPに変換した上で送信すべきなんだけど、めんどくさいのでutf-8のままとした。 ちなみに、htmlメールはどうするかというと、それはまた改めて。


編集