\r\n\r\n \r\n\r\n```\r\n\r\n### 追記\r\nmbstring\r\n|||\r\n|:--|:--:|\r\n|Multibyte Supportenabled|enabled|\r\n|Multibyte string engine|libmbfl|\r\n|HTTP input encoding translation|disabled|\r\n|libmbfl version|1.3.2|\r\n|oniguruma version|5.9.6|\r\n\r\nmbstring extension makes use of \"streamable kanji code filter and converter\", which is distributed under the GNU Lesser General Public License version 2.1.\r\n\r\n\r\n|||\r\n|:--|:--:|\r\n|Multibyte (japanese) regex support|enabled|\r\n|Multibyte regex (oniguruma) backtrack check|On|\r\n|Multibyte regex (oniguruma) version|5.9.6|\r\n\r\n\r\n|Directive|Local Value|Master Value|\r\n|:--|:--:|--:|\r\n|mbstring.detect_order|no value|no value\r\n|mbstring.encoding_translation|Off|Off\r\n|mbstring.func_overload|0|0\r\n|mbstring.http_input|no value|no value\r\n|mbstring.http_output|no value|no value\r\n|mbstring.http_output_conv_mimetypes|^(text/|application/xhtml+xml)|^(text/|application/xhtml+xml)\r\n|mbstring.internal_encoding|no value|no value\r\n|mbstring.language|ja|neutral\r\n|mbstring.strict_detection|Off|Off\r\n|mbstring.substitute_character|no value|no value\r\n\r\n---\r\n\r\n|Directive|Local Value|Master Value|\r\n|:--|:--:|--:|\r\n|default_charset|UTF-8|UTF-8|\r\n|internal_encoding|no value|no value|\r\n|iconv.internal_encoding|no value|no value|\r\n|mbstring.internal_encoding|no value|no value|","answerCount":3,"upvoteCount":0,"datePublished":"2018-09-13T05:59:07.129Z","dateModified":"2018-09-13T07:32:08.842Z","acceptedAnswer":{"@type":"Answer","text":"これはどうでしょう?\r\n```PHP\r\n$file_name = mb_encode_mimeheader( $_FILES['file']['name'], \"ISO-2022-JP\", \"UTF-8\" );\r\n```","dateModified":"2018-09-14T02:50:38.486Z","datePublished":"2018-09-14T02:50:38.486Z","upvoteCount":1,"url":"https://teratail.com/questions/146373#reply-220916"},"suggestedAnswer":[{"@type":"Answer","text":"こういうときは実際に世の中で使われているメールアプリがどうしているかを調査して、それを真似たり、そこを出発点にして規格を調べるのがいいです。\r\n\r\n実際にgmailとmacのメール.appで日本語のファイル名の添付を行って、ファイル名がどうなっているのか調べて見ました。\r\n\r\ngmail:\r\n\r\n```text\r\nContent-Type: image/png; \r\n\tname=\"=?UTF-8?B?44K544Kv44Oq44O844Oz44K344On44OD44OIIDIwMTgtMDUtMTYgMTQuNTYuMzcucG5n?=\"\r\nContent-Disposition: attachment; \r\n\tfilename=\"=?UTF-8?B?44K544Kv44Oq44O844Oz44K344On44OD44OIIDIwMTgtMDUtMTYgMTQuNTYuMzcucG5n?=\"\r\n```\r\n\r\nメール.app:\r\n\r\n```text\r\nContent-Disposition: inline;\r\n\tfilename*=utf-8''%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202018%2D04%2D19%2015.35.24.png\r\nContent-Type: image/png;\r\n\tx-unix-mode=0644;\r\n\tname=\"=?utf-8?B?44K544Kv44Oq44O844Oz44K344On44OD44OIIDIwMTgtMDQtMTkgMTUuMzUu?=\r\n =?utf-8?B?MjQucG5n?=\"\r\n```\r\n\r\ncontent-typeのnameについてはどちらもBエンコーディングしたものを含めています。(Bエンコーディングは[`mb_encode_mimeheader`](http://php.net/manual/ja/function.mb-encode-mimeheader.php)でできます)\r\n\r\ncontent-dispositionについてはそれぞれで異なり、\r\n\r\n* gmailはBエンコーディングしたものをfilenameパラメタに含めている\r\n\r\n* メール.appはfilename*パラメタを用いている\r\n\r\nRFC6266的にはfilename*を使うべきだとは思いますが、gmailのやり方でもメール.appはちゃんと解釈するようなので、どちらを使うかはお好みでいいかと思います。","dateModified":"2018-09-14T03:00:25.650Z","datePublished":"2018-09-14T03:00:25.650Z","upvoteCount":1,"url":"https://teratail.com/questions/146373#reply-220923","comment":[]},{"@type":"Answer","text":"$headers = '';\r\nの前に以下を記述してみて下さい\r\n```ここに言語を入力\r\n//日本語の使用宣言\t\r\nmb_language(\"ja\");\t\r\nmb_internal_encoding(\"UTF-8\");\r\n$headers = '';\r\n```","dateModified":"2018-09-13T08:09:29.813Z","datePublished":"2018-09-13T08:09:29.813Z","upvoteCount":0,"url":"https://teratail.com/questions/146373#reply-220730","comment":[{"@type":"Comment","text":"ありがとうございます。\r\nこちら記述を追加いたしましたが、文字化けしたままでした。","datePublished":"2018-09-14T01:44:40.898Z","dateModified":"2018-09-14T01:44:40.898Z"},{"@type":"Comment","text":"試しに一番先頭に記述してみて下さい","datePublished":"2018-09-14T02:03:46.955Z","dateModified":"2018-09-14T02:03:46.955Z"},{"@type":"Comment","text":"一番先頭に記述しても同じでした。","datePublished":"2018-09-14T02:14:13.113Z","dateModified":"2018-09-14T02:14:13.113Z"}]}],"breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"トップ","url":"https://teratail.com"},{"@type":"ListItem","position":2,"name":"PHPに関する質問","url":"https://teratail.com/tags/PHP"},{"@type":"ListItem","position":3,"name":"PHP","url":"https://teratail.com/tags/PHP"}]}}}
PHP初心者です。
現在、添付ファイルありのメールフォームを作成しているのですが、日本語のファイルを送信すると、ファイル名が文字化けしてしまいます。
ファイル自体は問題なく開けており、ファイル名だけがおかしいという感じです。Subjectや本文は問題なく表示されております。
こちら原因と対策について、ご教示いただけると幸いです。
<?php
$field_email = $_POST['email'];
$file_name = $_FILES['file']['name'];
$file_path = $_FILES['file']['tmp_name'];
$headers = '';
$headers .= "Content-Type: multipart/mixed;boundary=\"__BOUNDARY__\"\n";
$headers .= 'From: '.$field_email."\r\n";
$headers .= 'Reply-To: '.$field_email."\r\n";
$subject = 'タイトル';
$body_message = "--__BOUNDARY__\n";
$body_message .= "Content-Type: text/plain; charset=\"ISO-2022-JP\"\n\n";
$body_message .= "本文"
$body_message .= "--__BOUNDARY__\n";
$body_message .= "Content-Type: application/octet-stream; name=\"{$file_name}\"\n";
$body_message .= "Content-Disposition: attachment; filename=\"{$file_name}\"\n";
$body_message .= "Content-Transfer-Encoding: base64\n";
$body_message .= "\n";
$body_message .= chunk_split(base64_encode(file_get_contents($file_path)));
$body_message .= "--__BOUNDARY__--";
$mail_status = mb_send_mail($mail_to, $subject, $body_message, $headers);
if ($mail_status) { ?>
<script type="text/javascript">
alert('メッセージを送信しました。');
window.location = '/';
</script>
<?php
}
else { ?>
<script type="text/javascript">
alert('メッセージ送信に失敗しました。');
window.location = '/';
</script>
<?php
}
?>
追記
mbstring
Multibyte Supportenabled enabled Multibyte string engine libmbfl HTTP input encoding translation disabled libmbfl version 1.3.2 oniguruma version 5.9.6
mbstring extension makes use of "streamable kanji code filter and converter", which is distributed under the GNU Lesser General Public License version 2.1.
Multibyte (japanese) regex support enabled Multibyte regex (oniguruma) backtrack check On Multibyte regex (oniguruma) version 5.9.6
Directive Local Value Master Value mbstring.detect_order no value no value mbstring.encoding_translation Off Off mbstring.func_overload 0 0 mbstring.http_input no value no value mbstring.http_output no value no value mbstring.http_output_conv_mimetypes ^(text/ application/xhtml+xml) mbstring.internal_encoding no value no value mbstring.language ja neutral mbstring.strict_detection Off Off mbstring.substitute_character no value no value
Directive Local Value Master Value default_charset UTF-8 UTF-8 internal_encoding no value no value iconv.internal_encoding no value no value mbstring.internal_encoding no value no value
こういうときは実際に世の中で使われているメールアプリがどうしているかを調査して、それを真似たり、そこを出発点にして規格を調べるのがいいです。
実際にgmailとmacのメール.appで日本語のファイル名の添付を行って、ファイル名がどうなっているのか調べて見ました。
gmail:
text
1 Content-Type: image/png;
2 name="=?UTF-8?B?44K544Kv44Oq44O844Oz44K344On44OD44OIIDIwMTgtMDUtMTYgMTQuNTYuMzcucG5n?="
3 Content-Disposition: attachment;
4 filename="=?UTF-8?B?44K544Kv44Oq44O844Oz44K344On44OD44OIIDIwMTgtMDUtMTYgMTQuNTYuMzcucG5n?="
メール.app:
text
1 Content-Disposition: inline;
2 filename*=utf-8''%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202018%2D04%2D19%2015.35.24.png
3 Content-Type: image/png;
4 x-unix-mode=0644;
5 name="=?utf-8?B?44K544Kv44Oq44O844Oz44K344On44OD44OIIDIwMTgtMDQtMTkgMTUuMzUu?=
6 =?utf-8?B?MjQucG5n?="
content-typeのnameについてはどちらもBエンコーディングしたものを含めています。(Bエンコーディングはmb_encode_mimeheader でできます)
content-dispositionについてはそれぞれで異なり、
RFC6266的にはfilename*を使うべきだとは思いますが、gmailのやり方でもメール.appはちゃんと解釈するようなので、どちらを使うかはお好みでいいかと思います。
ベストアンサー
これはどうでしょう?
PHP
1 $file_name = mb_encode_mimeheader ( $_FILES [ 'file' ] [ 'name' ] , "ISO-2022-JP" , "UTF-8" ) ;
$headers = '';
の前に以下を記述してみて下さい
//日本語の使用宣言
mb_language("ja");
mb_internal_encoding("UTF-8");
$headers = '';
15分調べてもわからないことは teratailで質問しよう!
ただいまの回答率 85.29%
質問をまとめることで 思考を整理して素早く解決
テンプレート機能で 簡単に質問をまとめる
質問する