日本語のメールを送信する
代々、Railsでの日本語メールはパッチを当てるか処理を書かないと、普段日本で流通しているメールの形式にはならない。
ようするに、エンコーディングが違うのである。
RailsでActiveMailを使って普通に送信すると、エンコーディングをUTF-8で送信してしまう。
ThunderBirdとかGMailとかだと、その辺を勝手に解釈して正常に表示されてしまうが
日本にはいまだにエンコードがUTF-8では正しく表示されないメーラーがあったりする。
これに対応するには、エンコーディングをUTF-8ではなく、ISO-2022-JPでメールを送る必要がある。
ということで、さっそく変換するためのパッチを入れる
http://d.hatena.ne.jp/hichiriki/20101026/1288107706
で公開されているコードを参考にmail_fix.rbファイルをconfig/initializersに入れる
#config/initializers/mail_fix.rb
require 'mail'
module Mail
class UnstructuredField
def encode_with_fix(value)
encode_without_fix(value.encode(charset))
end
alias_method_chain :encode, :fix
end
class Message
def charset=(value)
@defaulted_charset = false
@charset = value
@header.charset = value
@body.charset = value
end
end
class Body
def encoded_with_fix(transfer_encoding = '8bit')
if multipart?
encoded_without_fix(transfer_encoding)
else
be = get_best_encoding(transfer_encoding)
dec = Mail::Encodings::get_encoding(encoding)
enc = Mail::Encodings::get_encoding(be)
if transfer_encoding == encoding and dec.nil?
# Cannot decode, so skip normalization
raw_source
else
# Decode then encode to normalize and allow transforming
# from base64 to Q-P and vice versa
enc.encode(dec.decode(raw_source).encode(charset))
end
end
end
alias_method_chain :encoded, :fix
end
end
メール送信用のコードを作成する
rails g BuyListMailer
app/mailerディレクトリにbuy_list_mailer.rbファイルが作成される
このファイルを編集
# -*- coding:utf-8 -*-
class BuyListMailer < ActionMailer::Base
default :from => "bousai@gendosu.jp", :charset => 'iso-2022-jp'
def send_buy_list(user, buys)
@buys = buys
mail(:to => user.email, :subject => '買い物リスト')
end
end
メールを送信するときは
コントローラなどで
BuyListMailer.send_buy_list(buys).deliver
とすれば、メールを送信できる。

