Nasuta<http://www.nasuta.jp/>

2006年05月01日

メール配信の実装

Iso2022jpMailerを参考にメール送信の実装をやってみました。

Railsのメール配信コンポーネットであるActionMailerはUTF-8によるメール送信を前提としているのでISO-2022-JPで配送できるように工夫する必要があります。

電子メールの設定

config/environment.rb に電子メール送信の設定を行います。SMTPプロトコルを使うことを前提にしています。

Rails::Initializer.run do |config|
ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.server_settings = {
:address => 'SMTPホスト名',
:port => 25,
:domain => '使用しているドメイン名'
}
ActionMailer::Base.default_charset = 'iso-2022-jp'


Iso2022jpMailer
ISO-2022-JP でメールを送信するために ActionMailer::Base を継承したクラス Iso2022jpMailerクラスを lib/iso2022jp_mailer.rbに作成します。
require 'nkf'
class Iso2022jpMailer < ActionMailer::Base
def base64(text)
if default_charset == 'iso-2022-jp'
text = NKF.nkf('-j -m0',text)
end
text = [text].pack('m').delete("\r\n")
"=?#{default_charset}?B?#{text}?="
end
def create!(*)
super
@mail.body = NKF::nkf('-j',@mail.body)
@mail
end
end


これで前準備は完了です。ユーザ登録の確認メールを行うメーラークラスを生成します。

script/generate mailer AccountMailer confirm

app/models/account_mailer.rb が作成されますので、user クラスのオブジェクトを受け取ってメールを送信するクラスconfirmを実装します。

class AccountMailer < Iso2022jpMailer

def confirm(user,sent_at = Time.now)
@subject = 'タイトル'
@body["user"] = user
@recipients = user.email
@from = "#{base64('2バイトのテキスト')}<メールアドレス>"
@sent_on = sent_at
@headers = {}
end


サブジェクトは自動でエンコードされますが、fromは明示的にエンコードしないといけないようです。

メールボディのテンプレート

メールの本文のテンプレートはHTMLと同様にapp/viewsディレクトリに出来ます。confirm メソッドのテンプレートは app/views/account_mailer/confirm.rhtml として作成します。
<%= @user.name %>様


メールの本文
ほげほげ
ほげほげ


ユニットテスト
test/unit/account_mailer.rb にtest_confirmメソッドを追加します。
class AccountMailerTest < Test::Unit::TestCase
FIXTURES_PATH = File.dirname(__FILE__) + '/../fixtures'
CHARSET = "iso-2022-jp"

include ActionMailer::Quoting

def setup
ActionMailer::Base.delivery_method = :test
ActionMailer::Base.perform_deliveries = true
ActionMailer::Base.deliveries = []

@expected = TMail::Mail.new
@expected.set_content_type "text", "plain", { "charset" => CHARSET }

@user = User.new
@user.email = "hogehoge@hogehoge.hoge"
@user.name = "hoge_name"
end

def test_confirm
AccountMailer.deliver_confirm(@user,@expected.date)
end


colinux:~/work/test/test/unit# ruby account_mailer_test.rb  --name=test_confirm
Loaded suite account_mailer_test
Started

.
Finished in 4.624275 seconds.

1 tests, 0 assertions, 0 failures, 0 errors
colinux:~/work/test/test/unit#


エラーは出てないんですが、分かりにくいので実際に開発環境でコントローラを使ってメールを配信してみることにします。

メールの送信
deliver_メソッド名というメソッドを呼ぶとメールが送信されます。confirmメソッドのメールを配信したいときは次のようにします。

@user = User.new
@user.email = hogehoge@hogehoe.jp
@user.password = hoge_password
@user.name = hoge_name
if @user.save
  AccountMailer.deliver_confirm(@user)
end


適当な場所にこのコード埋め込んで試したところ問題なくメールが送信されていました。簡単!


posted by ふんじ at 01:20| Comment(0) | TrackBack(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。