2012-01-16

Redmine + ActionmailerJaの修正

わたしの環境では、Redmineのメール送信をUTF-8からISO-2022-JPに変換するために、ActionMailerJaを利用させていただいてます。

しばらくは問題なく利用していたのですが、ある時、ユーザさんからこんな指摘を受けました。

『HTMLメールの一部が切れてしまって、文字化けを起こしているんですけど…』

指摘のチケットのメールを転送してもらうと、text/plainのほうは問題ないのですが、text/htmlで下記のようなケースで、文字化けが起きていました。

  • <pre></pre>で文章を挟む形でデータを登録する。
  • 上記のタグで挟んだ文章のうち、1行当たりの文字数が長い場合、800バイト付近で改行が挟まれるようになっている。(ActionMailerJaでの処理のため?)
  • この800バイト近辺に日本語が該当すると、文字化けが発生する。

@haru_iidaさんもActionMailerJa + Redmineについて書かれていましたが、どうもここには該当しないようでした。

プラグインを宛てたり外したりしてチェックしたところ、本来の動作のUTF-8の場合は、text/htmlでの文字化けは発生しませんでした。

レアなケースではあるけれど、どうしたものかな…と考えたのですが、text/html + text/plain のマルチパートでメールが送信されているので、text/plain だけISO-2022-JPであれば十分じゃないか?と考えました。

コードは良く分かっていないのですが、printデバッグ(お恥ずかしい…)しながら下記のように調整すると、なんとか text/plain –> JIS/7bit, text/html –> UTF-8/Quoted-printable になってくれました。

diff --git a/lib/actionmailer_ja/base.rb b/lib/actionmailer_ja/base.rb
index 0b01434..bb2b414 100644
--- a/lib/actionmailer_ja/base.rb
+++ b/lib/actionmailer_ja/base.rb
@@ -55,7 +55,7 @@ module ActionMailer
     def create_mail_with_ja #:nodoc:
       create_mail_without_ja
       (@mail.parts.empty? ? [@mail] : @mail.parts).each { |part|
-        if part.content_type == 'text/plain' || part.content_type == 'text/html'
+        if part.content_type == 'text/plain'
           if ((!gettext?) || (gettext? && Locale.get.language == "ja"))
             if mobile_address? && @mobile_address.softbank?
               part.charset = 'utf-8'
@@ -67,6 +67,8 @@ module ActionMailer
               part.transfer_encoding = '7bit'
             end
           end
+        elsif part.content_type == 'text/html'
+          part.charset = 'utf-8' 
         end
       }
       @mail

あまりメールの部分は手をいれたくないのが本音ですが、いまのところ、これで大丈夫のようです。

0 件のコメント:

コメントを投稿