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 で保存。


テスト中なんだけど、まとめ。