質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

8541閲覧

PHPのmb_send_mail()でファイル名が文字化けしてしまう

Dekusia

総合スコア13

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2018/09/13 05:59

編集2018/09/13 07:32

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 Supportenabledenabled
Multibyte string enginelibmbfl
HTTP input encoding translationdisabled
libmbfl version1.3.2
oniguruma version5.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 supportenabled
Multibyte regex (oniguruma) backtrack checkOn
Multibyte regex (oniguruma) version5.9.6
DirectiveLocal ValueMaster Value
mbstring.detect_orderno valueno value
mbstring.encoding_translationOffOff
mbstring.func_overload00
mbstring.http_inputno valueno value
mbstring.http_outputno valueno value
mbstring.http_output_conv_mimetypes^(text/application/xhtml+xml)
mbstring.internal_encodingno valueno value
mbstring.languagejaneutral
mbstring.strict_detectionOffOff
mbstring.substitute_characterno valueno value

DirectiveLocal ValueMaster Value
default_charsetUTF-8UTF-8
internal_encodingno valueno value
iconv.internal_encodingno valueno value
mbstring.internal_encodingno valueno value

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/09/13 06:13

phpのmbstring拡張まわりの設定値を掲載してください。またdefault_charsetやinternal_encodingもあればそれも。
CHERRY

2018/09/14 02:52

おそらく $file_name の部分だけ文字コードが違うのだと思いますが、「元の文字列」と「文字化けした文字」を画像等で質問に追記することは可能ですか?
guest

回答3

0

こういうときは実際に世の中で使われているメールアプリがどうしているかを調査して、それを真似たり、そこを出発点にして規格を調べるのがいいです。

実際にgmailとmacのメール.appで日本語のファイル名の添付を行って、ファイル名がどうなっているのか調べて見ました。

gmail:

text

1Content-Type: image/png; 2 name="=?UTF-8?B?44K544Kv44Oq44O844Oz44K344On44OD44OIIDIwMTgtMDUtMTYgMTQuNTYuMzcucG5n?=" 3Content-Disposition: attachment; 4 filename="=?UTF-8?B?44K544Kv44Oq44O844Oz44K344On44OD44OIIDIwMTgtMDUtMTYgMTQuNTYuMzcucG5n?="

メール.app:

text

1Content-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 3Content-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についてはそれぞれで異なり、

  • gmailはBエンコーディングしたものをfilenameパラメタに含めている

  • メール.appはfilename*パラメタを用いている

RFC6266的にはfilename*を使うべきだとは思いますが、gmailのやり方でもメール.appはちゃんと解釈するようなので、どちらを使うかはお好みでいいかと思います。

投稿2018/09/14 03:00

crhg

総合スコア1175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

これはどうでしょう?

PHP

1$file_name = mb_encode_mimeheader( $_FILES['file']['name'], "ISO-2022-JP", "UTF-8" );

投稿2018/09/14 02:50

mayoi_maimai

総合スコア1583

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Dekusia

2018/09/14 03:07 編集

ありがとうございます。こちらで解決いたしました! これは単純にファイル名がエンコードできていなかったという感じでしょうか?
mayoi_maimai

2018/09/14 03:08

そうですね、ISO-2022-JP,Base64に変換すればクライアント側のメーラーで添付ファイル名を元に戻せたと思います^^;
Hi6o

2018/09/14 03:10

おお、そうでしたか
guest

0

$headers = '';
の前に以下を記述してみて下さい

//日本語の使用宣言 mb_language("ja"); mb_internal_encoding("UTF-8"); $headers = '';

投稿2018/09/13 08:09

Hi6o

総合スコア37

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Dekusia

2018/09/14 01:44

ありがとうございます。 こちら記述を追加いたしましたが、文字化けしたままでした。
Hi6o

2018/09/14 02:03

試しに一番先頭に記述してみて下さい
Dekusia

2018/09/14 02:14

一番先頭に記述しても同じでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問