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” を要求します。