Hatena::ブログ(Diary)

エンジニアの低脳っぷりを晒す戦記 このページをアンテナに追加 RSSフィード

2007-06-01 Rubyからメールを送信する方法

毎度Rubyネタでスミマセンが、丁度Rubyやってるもので・・・

Rubyからメールを送信する

| Rubyからメールを送信するを含むブックマーク Rubyからメールを送信するのブックマークコメント

メールを受信して何か自動化しようって話はあんまりないと思いますけど、メールを送信する状況は多いと思います・・・私自身はメールというメディアは嫌いなんですがw

はい!ということでまたまた苦労しました。また丸一日使ってしまいました うう・・・

どうやって送る?

Rubyプログラムから一番制御が簡単なのは、Rubyプログラムなので、Rubyメール送信を調べました。

なんかTMAILと呼ばれるモジュールが、よく紹介されていたので、TMAILに関してGoogle先生に問い合わせると、あっさり発見

インストールに関しては落としてsetup.rbを何回か叩けと書いてあったので、ガシガシやったんですけど、えーっとなんかsetupがうまく動かないのでマンドクセということで却下

恐らくTMAILはすばらしいとは思うんですけど・・・使うの簡単そうだし、でも何か作り上げるときに、こういう結構どうでもいい技術的以外のマンドクセで構成要素って選ばれるモンなんですなw

どうしようとおもいつつ、Rubyクックブック(おらいりー)をペラペラやってると、ズバリ載ってるじゃないですか!メールを送信する方法が!actionmailerというモジュールを使うようで、こいつでいってみよう

インストール

例により検索します

gem search --remote mail

あったあった

actionmailer (1.3.3, 1.3.2, 1.3.1, 1.3.0, 1.2.5, 1.2.4, 1.2.3,
 0.7.1, 0.7.0, 0.6.1, 0.6.0, 0.5.0, 0.4.0, 0.3.0)
    Service layer for easy email delivery and testing.

ドン

gem install actionmailer

終了

送ってみる

とりあえずクックブックのサンプルコードを参考にしつつ、適当(ホントはかなり試行錯誤)に作ってみた

まずこういうメソッドをもったクラスを作る

class HogeMailer < ActionMailer::Base
    def hogeMessage(toAddress, mySubject, myBody)
        from 'hoge@hoge.co.jp'
        recipients toAddress
        subject mySubject
        body myBody
    end
end

見たらわかると思いますが継承して勝手にメソッドを追加してます、引数とかも勝手に決めてます。あて先と、件名、本文を後で動的に変えたかったので、引数を3つとってます

そうすると不思議に内部で

#あて先、件名、本文
HogeMailer.deliver_hogeMessage('moge@moge.jp', "ほげほげです", "もげもげです")

こういう「deliver_宣言したメソッド」っていうメソッドが勝手にできあがるのでこいつに、自分で作ったメソッド(今ならhogeMessage)と同じように引数で与えると、送ってくれます

サンプルの通り、日本語であっても普通に送れました。嘘です。

遅れません・・・

メーラー依存します。ヘッダ見たらUTF8で送りつけてます

UTF8が解釈できるメーラーなら読めるでしょう

忘れてましたw

メールを送るにはSMTPサーバを経由しますね、その情報はdeliver_〜メソッドを呼び出す前にこういう風に設定すればOKです

ActionMailer::Base.smtp_settings = { :address => 'smtp.hoge.co.jp',
                                     :port => 25,
                                     :domain => 'hoge.co.jp',
                                     :user_name => 'sukottotaigaaa',
                                     :password => 'hogemogepyapypay',
                                     :authentication => :login}

完成版はこうなりますね

require 'rubygems'
require 'action_mailer'

#クラス定義
class HogeMailer < ActionMailer::Base
    def hogeMessage(toAddress, mySubject, myBody)
        from 'hoge@hoge.co.jp'
        recipients toAddress
        subject mySubject
        body myBody
    end
end

#認証とかの情報設定
ActionMailer::Base.smtp_settings = { :address => 'smtp.hoge.co.jp',
                                     :port => 25,
                                     :domain => 'hoge.co.jp',
                                     :user_name => 'sukottotaigaaa',
                                     :password => 'hogemogepyapypay',
                                     :authentication => :login}

#送信!
HogeMailer.deliver_hogeMessage('moge@moge.jp', "ほげほげです", "もげもげです")

ふー、今回はクックブックからパクったので比較的楽だったかな

あとクックブックの202ページサンプルコードで認証とかの情報設定に「ActionMailer::Base.server_settings」というメソッドが使われていて、それでやると警告がでて

「rails2.0ではsmtp_settingっていう名前だから名前変えろコノヤロウー」

と言われるので変えてみた

一応こんなメッセージが出ますので参考までに

DEPRECATION WARNING: server_settings has been renamed smtp_settings, this warning will be removed with rails 2.0  See http://www.rubyonrails.org/deprecation for
 details. (called from hoge.rb:14)

actionmailerってrails系のモジュールだったのね・・・毎度しょぼいサンプルコード書いてますけど参考になれば幸いです

メール送信の方法に関しては情報は極力シンクロさせていくつもりなんですが、このエントリー情報で満足できなければこちらもどうぞ

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