2008-08-22
■[redMine][ruby on rails]メール通知をどうにかutf8をサポートしてないメーラーでも読めるようにする。
railsのActionMailerがデフォルトでutf8のメールをつくり、かつ勝手にmultipart/alternativeなメール(ぶっちゃけHTMLめーる)にしてしまうのでredMineのメール通知が読めない!って怒られてあちこち調べまくった結果。
1)iso-2022-jpなメールを作るクラスを作成。
require 'nkf'
class Iso2022jpMailer < ActionMailer::Base
@@default_charset = 'iso-2022-jp' # これがないと "Content-Type: charset=utf-8" になる
@@encode_subject = false # デフォルトのエンコード処理は行わない(自分でやる)
# 1) base64 の符号化 (http://wiki.fdiary.net/rails/?ActionMailer より)
def base64(text, charset="iso-2022-jp", convert=true)
if convert
if charset == "iso-2022-jp"
text = NKF.nkf('-j -m0', text)
end
end
text = [text].pack('m').delete("\r\n")
"=?#{charset}?B?#{text}?="
end
# 2) 本文を iso-2022-jp へ変換
# どこでやればいいのか迷ったので、とりあえず create! に被せています
def create! (*)
super
#ついでに件名もここで変換しちゃえ!(by ghostbass)
@mail.subject = base64(@mail.subject)
@mail.body = NKF::nkf('-j', @mail.body)
return @mail # メソッドチェインを期待した変更があったら怖いので
end
# 3) multipartの1個目のtransfer-encoding
alias :_create_mail :create_mail
def create_mail
@parts[0].transfer_encoding = @@default_charset
@parts[0].body = NKF::nkf('-j -m0 -x', @parts[0].body)
_create_mail
end
end
これをlib/iso2022jp_mailer.rbとして保存。
2)environment.rbにデフォルトのcontent-typeとマルチパートの順序を設定
config.action_mailer.default_content_type = "text/plain"
config.action_mailer.default_implicit_parts_order = ["text/html", "text/enriched", "text/plain"]
設定場所はsmtp接続設定付近。
redMineのメール処理クラスのベースをIso2022jpMailer に変更。
class Mailer <Iso2022jpMailer helper ApplicationHelper helper IssuesHelper helper CustomFieldsHelper ...
これで某サイボウズ、edmaxで普通にテキストメールっぽく読める。実際はやっぱりmultipartなのでhtmlパートが添付扱いになる。
参考URL
http://wota.jp/ac/?date=20050731#p06
http://d.hatena.ne.jp/urekat/20070323/1174634890
http://invisiblefulmoon.net/adiary/santama/20080107
やっとredMineを誰はばかることなく試せる。ふぅ。
(追記)
ActionMailerJa なんてプラグインがこの記事を書いた1年後ぐらいに出来てた。トラックバックからたどって存在は知ってたけど今まで試してなかった。
なかなか良いものです。(redMine0.8.3にて運用中)