いろいろなブログやサイトを調べているのですが、日本語ファイル名がどうしても文字化けしてしまっています。下記のサイトさんの情報がとても役に立ちました。しかし、このまま使ってもやっぱり文字化けになりました。 PEAR::Mail_mimeで日本語ファイル名の添付ファイルを送る方法

メール送信時のお作法が分かっていれば良かったのですが。。全く知識がないので、総当たりで全てのパターンや可能性を試した結果、以下のソースでどのメールアドレスに送っても日本語ファイル名が文字化けしなくなりました。

とにかくちゃんとやっているつもりでも受信側で文字化けが発生している場合、大抵はエンコードの指定の方法が間違っている可能性が高いです。

                        $crlf = "\r";

                        $o_mime = new Mail_mime($crlf);

                        $o_mime->setParam('text_charset', 'ISO-2022-JP');
                        $o_mime->setParam('text_encoding', '7bit');

                        mb_convert_variables("JIS", "EUC-JP", $changed_honbun);

                        $o_mime->setTXTBody(addslashes($changed_honbun));

            if ($attach_flg) {
                     mb_convert_variables("ISO-2022-JP", "EUC-JP", $actual_attach_name);

                $o_mime->addAttachment($attach_path // data
                     //,'application/octet-stream'  // content-type
                     ,$content_type  // content-type
                     ,$actual_attach_name // attached file name
                     ,true // isfile
                     ,'base64' // encoding
                     ,'attachment' // disposition attachment
                     ,'ISO-2022-JP' // charset
                     ,'' // language
                     ,'' // location
                     ,'base64' // n_encoding
                     ,'base64' // f_encoding Encoding of the attachment's filename in Content-Disposition header.
                     ,'' // description
                     ,'ISO-2022-JP' // h_charset
                );

上のソースファイルでポイントは、,’ISO-2022-JP’ // f_encoding の箇所です。PEAR::Mail_mimeで日本語ファイル名の添付ファイルを送る方法のサイト様では、base64となっておりました。こちらをISO-2022-JPに変更した所、添付ファイルの日本語ファイル名称が文字化けしなくなりました。
—> 2016/1/19 : 私が間違えておりました。こちら、ISO-2022-JPではなく、base64でOKでした。大変失礼いたしました。m(__)m 。既存システムでやはり文字化けが発生し、原因を調べたところ、f_encodingがISO-2022-JPになっていたのが原因です。encodingですから、base64なわけです。charsetなら、ISO-2022-JPでいいのですが。。。我ながら自分の馬鹿さ加減に腹が立ちました。こちら、ご覧の方大変失礼いたしました。

とにかく何でもかんでも、ISO-2022-JPで送りなさいとありますので、おやって思って変更してみたらビンゴでした。本当はちゃんと理解した上で設定しないといけないのですが。。すいません。。。PEAR: Mail_Mimeのaddattachmentの関数詳細説明を見てみますと何やらこんな事が書いてあります。

boolean addAttachment ( string $file ,
 string $c_type = 'application/octet-stream' , 
string $name = '' , 
boolean $isfile = true , 
string $encoding = 'base64' ,
 string $disposition = 'attachment' ,
 string $charset = '' , 
string $language = '' , 
string $location = '' , 
string $n_encoding = null , 
string $f_encoding = null , 
string $description = '' , 
string $h_charset = null )

string $n_encoding

  • Encoding of the attachment’s name in Content-Type By default filenames are encoded using RFC2231 method Here you can set RFC2047 encoding (quoted-printable or base64) instead.

string $f_encoding

  • Encoding of the attachment’s filename in Content-Disposition header.

つまり、$f_encodingの方は、ファイル名のencodingを指定すべき場所です。ここにbase64と書いてはいけないです。ファイル名はmb_convert_variablesで、ISO-2022-JPに変換済みです。なので、ここにISO-2022-JPを入れましたら、ちゃんと文字化けせずにメールを送る事が出来ました。

同じ所で詰まっている方、たくさんいらっしゃるんじゃないかなーと思いましてここに記録として書いておきたいのと、自分でまた似たような事、つまりMail_Mimeでメール送信という事をしたい際に絶対に同じ落とし穴に落ちる事が容易に想定出来るので、すぐに検索して見つかる場所、つまりこのブログに書いておこうと思いました。

皆さんのお役に立てれば幸いです。