Hatena::ブログ(Diary)

Rubyとか Illustratorとか SFとか折紙とか このページをアンテナに追加 RSSフィード

2010-12-02

Mail(gem) で送信するメールの本文を UTF-8 ではなく ISO-2022-JP にする方法

| 19:35 | Mail(gem) で送信するメールの本文を UTF-8 ではなく ISO-2022-JP にする方法を含むブックマーク Mail(gem) で送信するメールの本文を UTF-8 ではなく ISO-2022-JP にする方法のブックマークコメント

メモ。

Gem の Mailライブラリ(mail | RubyGems.org | your community gem host)で素朴に日本語のメールを送る場合、文字コードISO-2022-JPではなく、UTF-8になります( Rails3で送信するメールの本文をbase64ではなく8bitにする方法 - 思っているよりもずっとずっと人生は短い。)。

ISO-2022-JP で送るようにするには、Mail::Message で charset を設定してやればいいみたい

mail = Mail.new <メールアドレスとか題名とかの設定>
mail.body = NKF.nkf '-j', <日本語の本文>
mail.charset = 'ISO-2022-JP'
mail.deliver

ただ、このままだと添付ファイルを付けたりしたときにおかしくなります。mail.charset はメール全体のコード設定で、先に設定しておいた本文テキストから作られる本文パートのコード設定はまた UTF-8 になるからです(本文テキストに日本語入ってなかったら無設定になるかも)。

本文パートの文字コード設定もすればいいみたい

mail = Mail.new <メールアドレスとか題名とかの設定>
mail.body = NKF.nkf '-j', <日本語の本文>
mail.add_file <添付ファイルのパス名>
mail.parts[0].charset = 'ISO-2022-JP'
mail.deliver

Mail::Message#parts配列の中での本文パートの位置は本文テキストの代入とファイル添付の順番に依存するので注意すること。

本文パート、 Mail::Message#attachmennts からは取れなかったのでちょっと(随分)悩んだ。

(翌日追記、「(mail.parts - mail.attachments)[0]」とすれば順番関係なく本文パート取れる)

添付ファイルパートの charset設定とか、全体の charset設定とかも注意した方が良いかも知れない。

あと、日本語の題名(サブジェクト)は取敢えずこうしてるけどなんかもうちょっとないのかな

mail.subject = NKF.nkf '-M', <日本語交じりの題名>

(翌日追記)

バージョンは ruby 1.8.7, mail (2.2.11) になります。

takahashimtakahashim 2010/12/02 20:35 おお、なるほど。これってRuby 1.9でもいけます?

hs9587hs9587 2010/12/03 11:32 1.9 つらいかも。手元の 1.9.1 ではエラーになります。Encoding::CompatibilityError: incompatible encoding regexp match (UTF-8 regexp with ISO-2022-JP string)

hs9587hs9587 2010/12/03 14:47 1.9.2 でも同じエラーになりますね ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-linux]

hs9587hs9587 2010/12/03 15:43 mail.body = "こんにちは\nISO2022JPです\n".encode('iso-2022-jp').force_encoding('binary'); mail.charset = 'ISO-2022-JP'; mail.deliver #としたらいけました、1.9.2

hs9587hs9587 2010/12/03 15:44 本文テキストの確認に簡単な正規表現(「/\S/」とか)とのマッチをしてるところでのエラー。もう ISO-2022-JP の7bitコードには変換してるのでその後はバイナリ扱いでいいじゃんということで

hs9587hs9587 2010/12/03 18:41 ちなみに Subject の方は、1.9.2で、日本語そのまま渡せば何とかしてくれる、自分で MIMEエンコードしておくと Encoding::CompatibilityError。1.8.7 で日本語そのままわたしたら文字化け、自分で MIMEエンコードすると何とかなったのとは対照的

agilekawabataagilekawabata 2010/12/15 02:08 Ruby1.9ならyalabさんがパッチ書いてくれてますよ。
https://github.com/yalab/mail

リンク元