Rails3で送信するメールの本文をbase64ではなく8bitにする方法

メモ。一つ謎が解けたので。

Rails3ではメールを扱うクラスがTMailからMailクラスに変わりました。そのせいか、素朴に日本語のメールを送る場合、文字コードISO-2022-JPではなく、UTF-8になります。まあUTF-8になるのはいいとして、問題はこれがbase64なのでした。ううむ。

この辺りはMail::Messageクラスの挙動になるっぽいのですが、メール送信時にContent-Transfer-Encodingヘッダを指定することはできます。

    # UserMailerクラスのメソッドの中の定義
    mail(:to => email,
         :content_transfer_encoding => '8bit',
         :subject => I18n.t("hoge"))

ところが、ここで設定しても、実際に送信される時にはbase64になってしまうのでした。うう。

というわけで困ってたんですが、さっきspecを見たりしながら調べたら、どうもMail::Message#transport_encodingを8bitに設定すればよいようです。

一般的にメールを送信する場合、

    UserMailer.foobar_email(@user).deliver

みたいな感じで送るところを、チェインをやめて、いったんmailに対してメソッドを適用させます。

    mail = UserMailer.foobar_email(@user)
    mail.transport_encoding = "8bit"
    mail.deliver

こんな風にすればよさそうです。

あとはSubjectをQ EncodingじゃなくてB Encodingにする方法だな……。