質問: trim(mb_convert_encoding( $body, "UTF-8", 'ASCII, JIS, UTF-8, SJIS' )); //以下DBに保存する処理 ``` ▼文字化けしたメールの一部です ``` =E2=96=BC=E9=80=A3=E7=B5=A1=E5=B8=8C=E6=9C=9B= =E6=97=A5/=E6=99=82=E9=96=93=E5=B8=AF =E2=96=BC=E8=BB=8A=E6=A4= =9C=E6=BA=80=E4=BA=86=E6=97=A5 2018-10-17 ```
回答: コメントに書いた通りですが、Mail_mimeDecodeは`getSendArray()`を呼んでも、quoted-printableやbase64でエンコードされたメール本文をデコードしてくれません。正しくデコードさせてやるには`decode()`メソッドを呼ぶ必要があります。 `// PEAR を使った処理`以下の行を、次のように書き換えてください。 ``` // PEAR を使った処理 $decoder = & new Mail_mimeDecode( $line ); // MIMEを分解 $decoded = $decoder->decode( 'include_bodies' => true, 'decode_bodies' => true, 'decode_headers' => false, //<-(1) ]); $subject = mb_decode_mimeheader( $decoded->headers['subject'] ) ; //<-(2) $from = mb_decode_mimeheader( $decoded->headers['from'] ) ; //<-(2) $m_body = trim(mb_convert_encoding( $decoded->body, "UTF-8", 'ASCII, JIS, UTF-8, SJIS' )); //以下DBに保存する処理 ``` 最近のメールクライアントでは、UTF-8メールを送信するのにquoted-pritableもbase64も使わないものが多いので、文字化けするものの方が少なかったかもしれませんが、一般的には対応しておかないとまずいものです。 他の種類の文字化けまでは保証できませんが、少なくとも`=`がやたら出てくるquoted-printableの文字列がそのまま登録されることはなくなるはずです。コメントに書いたように一部修正していただかないといけないかもしれませんが、お試しください。 と言うわけで、質問者の @たーとるず さんのお力もお借りして上記のコードを修正しました。 (1) `'decode_headers' => true,`を指定した元のコードでは、ヘッダー内容のデコード処理がMail_mimeDecode側と、`mb_decode_mimeheader`によるものと二重に走っていました。Mail_mimeDecode側のデコード処理はいまいちあてにできなさそうなので、`mb_decode_mimeheader`だけで処理するよう、値を`false`に変更しました。 (2) MIMEのヘッダー名は大文字小文字無視が原則ですが、PHPの連想配列はそのような「大文字小文字無視」した検索ができないので、なんらかの方法で表記を統一してやる必要があります。Mail_mimeDecodeではMIMEの仕様にあるような「頭字大文字」ではなく「全部小文字」と言う動作になっていたので、キー文字列をそれに合わせて変更しました。