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
}
あまりメールの部分は手をいれたくないのが本音ですが、いまのところ、これで大丈夫のようです。
コメント
コメントを投稿