Techioz Blog

Rubyで「=?UTF-8?B?…」文字列をデコードする方法

概要

Mandrill Inbound Email API を使用していますが、電子メールのファイル名に 1 つ以上のスペースが含まれる添付ファイルがある場合、ファイル名はデコード方法がわからない形式でエンコードされます。

ファイル名として受け取った文字列の例は次のとおりです: Missionary Faith Promise and Cash Receipts YTD 253599 April-2015.csv

Base64.decode64(#{encoded_value}) を試しましたが、読み取り可能なテキストは返されませんでした。

その値を読み取り可能な文字列にデコードするにはどうすればよいですか?

解決策

これは、RFC-2822 で定義されている MIME エンコードされた単語の構文です。ウィキペディアより:

幸いなことに、このためにデコーダを作成する必要はありません。 Mail gem には、完全に動作し、十分にテストされた Mail::Encodings.value_decode メソッドが付属しています。

subject = "Missionary Faith Promise and Cash Receipts YTD 253599 July-2015.csv"
Mail::Encodings.value_decode(subject)
# => "Missionary Faith Promise and Cash Receipts YTD 253599 July-2015.csv"

おそらく思いつかないような多くのエッジケースを適切に処理します (アプリがそれらを処理しようとして失敗するまで)。

subject = "Re:[グルーポン・ジャパン株式会\n 社] 返信:\n  【グルーポン】お問い合わせ\n の件について(リクエスト#1056273\n )"
Mail::Encodings.value_decode(subject)
# => "Re:[グルーポン・ジャパン株式会社] 返信:【グルーポン】お問い合わせの件について(リクエスト#1056273\n )"

Rails を使用している場合は、Mail gem がすでにあります。それ以外の場合は、Gemfile に gem “mail” を追加してからバンドルインストールし、スクリプト内で “mail” を要求します。