もし,mbstring.languageが指定されていない場合は,mb_language()も設定しないといけないようです.
mb_encode_mimeheader(arg1, arg2, arg3, arg4)の4つの引数のうち,必須はarg1で,これがエンコードしたい文字列です.オプションであるarg2は変換したい文字コード,arg3はBASE64などのテキスト化するエンコード形式,arg4は折り返し時の改行コード(だったと思います).
mb_encode_mimeheader()はarg1の文字列をphp.iniで指定されたmbstring.internal_encoding (UTF-8が望ましい)の文字コードあるいはmb_internalencoding()で指定された文字コードから,php.iniのmbstring.languageで指定された言語圏(japaneseなど)において適切な文字コード(japaneseならばISO-2022-JP)あるいはmb_language()で指定された言語圏(この場合は'ja'など)において適切な文字コードに変換します.arg1の文字コードを自動班別しません(そもそもファイル名程度の短い文字列の場合は誤認識することが多い).その後,ヘッダーとしての条件(79byte程度で改行でしたか?)を満たした上でBASE64などのASCIIキャラクタに変換します.
Moodleではファイル名などの情報はUTF-8で取り扱います.したがって,mbstring.internal_encodingはUTF-8が好ましいですが,レンタルサーバなどではこの設定が行われていない場合もあるのかも知れませんね.それに対応するために先のパッチではmb_internal_encoding('UTF-8')を追加しました.
同様にサーバによってはmbstring.languageがjapaneseに設定されていない場合もあるでしょう.(でも,その場合はmbstring系の関数が激しくワーニングを発生しますが...) それに対応するにはmb_language()を指定するか,あるいはarg2を指定する必要があります.ここで少し考えなくてはなりません.一つはメール送信先のユーザのメールの文字コード設定を調べてその文字コードにファイル名を変換する方法.もう一つはUTF-8のままとする方法.前者はコードが複雑になり,後者はメールクライアントがBASE64デコードして得られたファイル名の情報がUTF-8でも正しくファイル名として復元できるかどうか.前者はもしmb_language()を使用するならばその言語指定の文字列を取得する必要があります.(日本語圏ならばISO-2022-JPではなく,jaを)
もし,文字コードをUTF-8に変換してBASE64でエンコードするならばmb_mimeheader($name, 'UTF-8')とするのだが,UTF-8からUTF-8に変換するのは無駄のような気もする.base64_encode($name)で良いのかも知れない.でも,それはそれで少し不安なので,
$cur = count($this->attachment);
$this->attachment[$cur][0] = $path;
$this->attachment[$cur][1] = $filename;
// (Shirai010): ここからコメントアウト
// $this->attachment[$cur][2] = $name;
// (Shirai010): ここから追加
$oldcharset = mb_internal_encoding();
mb_internal_encoding('UTF-8');
$this->attachment[$cur][2] = mb_encode_mimeheader($name, 'UTF-8');
mb_internal_encoding($oldcharset);
// (Shirai010): ここまで追加
$this->attachment[$cur][3] = $encoding;
$this->attachment[$cur][4] = $type;
$this->attachment[$cur][5] = false; // isStringAttachment
$this->attachment[$cur][6] = "attachment";
$this->attachment[$cur][7] = 0;
return true;
}
これが無難でしょうか.まだ結論は出ません.ご意見お待ちしています.
湯川さんご指摘のinternal_encodingの設定を元に戻す処理も追加しました.
さらに私のケアレスミスを湯川さんが指摘してくれた命令の順番も訂正しました.