Rails で日本語メール&折り返し
lib/iso2022jp_mailer.rb
class Iso2022JpMailer < ActionMailer::Base @@default_charset = 'iso-2022-jp' @@encode_subject = false def base64(text, charset='iso-2022-jp', convert=true) if convert && charset == "iso-2022-jp" text = NKF.nkf("-j -m0", text) end text = TMail::Base64.folding_encode(text) "=?#{charset}?B?#{text}?=" end def create!(*) super @mail.subject = base64(@mail.subject) part = @mail.parts.empty? ? @mail : @mail.parts.first if part.content_type = "text/plain" part.charset = "iso-2022-jp" part.body = NKF.nkf("-j", part.body) end return @mail end end
ISO-2022-JP 変換はくまくまーさんのと ruby-gettext-package からぱくった。
app/models/notify_mailer.rb
require 'iso2022jp_mailer' class NotifyMailer < Iso2022JpMailer helper ApplicationHelper ... def foo(to, ...) recipients to ... end end
次の折り返しヘルパーメソッドが使えるように。
module ApplicationHelper def fold(str, length=60) if str.size > length NKF.nkf("-F#{length} -Ww", str).gsub(/\r?\n/){"\r\n"} else str.gsub(/\r?\n/){"\r\n"} end end end
- F が設定文字数以下のときも改行をつけるのが嫌だったので場合分け。あと、-Ww つけないと文字化けする場合があった。gsub は、RFC2822 では、改行は LF だけじゃだめで、CRLF じゃないといけないっぽいので。でもこれはヘッダの話な気がする。ボディはどうでも良いかもという適当な。賢く読めなかった。まー、テンプレートとあわせといた方がいいだろ的な。
app/views/notify_mailer/foo.rhtml
<%= fold("#{@hoge}さん〜〜の依頼です。") %> ------------------------------------------------------------ <%= fold("「#{@fuga}」") %> <%= fold(truncate(@moe, 128)) %> ------------------------------------------------------------ よろしくお願いします。
テンプレートは UTF-8 の 改行 CRLF で保存。
テスト中なんだけど、まとめ。