« ポートレイト: 糸井春香さん スタジオ撮り その3 | メイン | ポートレイト: 五十嵐ゆりえさん その2 »

2012年5月 9日

Roundcube webmailer 添付ファイルの文字化け対策 >>PHP 

Roundcube Webmailarで添付ファイルが文字化けする件。
どうもPEAR Mail::Mime の挙動ともあいまって微妙なのね・・・。

/program/steps/mail/sendmail.incに手を入れます。

line:554辺り

      // .eml attachments send inline
$MAIL_MIME->addAttachment($file,
$ctype,
$attachment['name'],
($attachment['data'] ? false : true),
($ctype == 'message/rfc822' ? '8bit' : 'base64'),
($ctype == 'message/rfc822' ? 'inline' : 'attachment'),
'', '', '',
$CONFIG['mime_param_folding'] ? 'quoted-printable' : NULL,
$CONFIG['mime_param_folding'] == 2 ? 'quoted-printable' : NULL,
'', RCMAIL_CHARSET
);

を、

      // .eml attachments send inline
$MAIL_MIME->addAttachment($file,
$ctype,
mb_convert_encoding($attachment['name'], $message_charset,RCMAIL_CHARSET),
($attachment['data'] ? false : true),
($ctype == 'message/rfc822' ? '8bit' : 'base64'),
($ctype == 'message/rfc822' ? 'inline' : 'attachment'),
'', '', '',
$CONFIG['mime_param_folding'] ? 'quoted-printable' : NULL,
$CONFIG['mime_param_folding'] == 2 ? 'quoted-printable' : NULL,
'', $message_charset
);

とします。

さらに、Mail:Mimeの1行をコメントアウトします。

addAttachmentの中の
$filename = $this->_basename($filename);を、コメントアウト。
※影響範囲を調べきれていませんので注意してください。
※文字が落ちてしまうので、こんな処理はダメです。SetLocaleが適切ならば大丈夫とかなんとかっていう話もありそうですが。 別途基底ディレクトリを渡すか取得した後 tr//するのが安全だと思いますけどねえ・・・。FileNameに¥/が入ってくることはないから、マルチバイトで一番右端のPath Separatorのpositionとってそこから先を抜き出すだけとも言う。

元はRoundcube 0.7.1のソースです。
メーラーはBecky2.60.01,EdMax 5.17で確認。

mb_encode_mimeheaderでエンコードしたものを渡す方法が書かれているサイト(公式ですか..?)もありましたが、Mail::Mimeそのものでヘッダ作っているようですから、条件が重なると壊れます。ですので、それは正しい対処ではなさそうです。
長いファイル名を渡してMimeが数行に渡る場合には、Mail::Mimeが分解して作ってしまうために結局文字化けします。なのでMail::Mimeを使うのであれば素のまま渡した方が無難だろうと思います。

・・・古いメーラーだとどうなんだろうなあっていう話もあり・・・。そこはまたそのうち調べる。。。

twitterこの記事をTwitterでみんなに教える。

投稿者 debizoh : 2012年5月 9日 02:55



トラックバック

現在、この記事はトラックバックを受け付けておりません。


コメント

現在、この記事はコメントを受け付けておりません。