メール通知をどうにか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パートが添付扱いになる。
ただし。Gmailで思いっきり文字化け。

参考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にて運用中)
> http://blog.imishin.com/projects/ruby/actionmailerja/