jpmobile/jpmobile — pull request #70 by mshibuya (2014-03-20 04:06:16+00:00)
Title: メール受信時に件名なしのメールが正しくパースされない問題修正

件名なしの日本語multipartメール（具体的には本コミットの`pc-mail-attached-without-subject.eml`になります）を受け取ってMail.newした際に正しく文字コード通りの解釈がされない（mail.parts.first.body.to_sが生jisコードのまま／mail.encodedするとEncoding::UndefinedConversionErrorになる）問題に遭遇しましたので、修正を試みました。

その際、multipartメールの際の[convert_encoding_jpmobile](https://github.com/jpmobile/jpmobile/blob/f6c4f1ee86f4596b3452d81889801ca7c15766f2/lib/jpmobile/mail.rb#L223)の実行の流れを追ったのですが、件名ありのメールの場合だと、例えばこのようなメールに対し
```
multipart/mixed (a)
├ text/plain; charset=ISO-2022-JP (b)
└ image/gif (c)
```
1. まず、multipartの外側(a)を処理。[Subjectに使われてるcharsetを抽出](https://github.com/jpmobile/jpmobile/blob/f6c4f1ee86f4596b3452d81889801ca7c15766f2/lib/jpmobile/mail.rb#L232)し、[`@charset`に入れる](https://github.com/jpmobile/jpmobile/blob/f6c4f1ee86f4596b3452d81889801ca7c15766f2/lib/jpmobile/mail.rb#L234)
2. 得られた`@charset`を用いて(b), (c)も含めた[全体をUTF-8に変換](https://github.com/jpmobile/jpmobile/blob/f6c4f1ee86f4596b3452d81889801ca7c15766f2/lib/jpmobile/mail.rb#L274)
3. 続いて(b), (c)についてもconvert_encoding_jpmobileが実行されるが、`@mobile`が空なので特に何もしない

といった形になっておりました。そのためSubjectが空の場合やSubjectと本文partのcharsetが異なる場合に正しくデコードが行われないことになります。

この問題を解決するため、partごとにcharsetに応じたデコード処理を行えるように処理の流れを見直しました。
変更箇所が思いのほか多くなってしまったのですが、ご意見など頂けますと幸いです。