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

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

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

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

PEAR

PEAR (PHP Extension and Application Repository)はPHPで利用する事ができるライブラリです。

Q&A

2回答

11709閲覧

添付ファイル名が文字化けします。

falco

総合スコア7

PHP

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

PEAR

PEAR (PHP Extension and Application Repository)はPHPで利用する事ができるライブラリです。

0グッド

1クリップ

投稿2016/10/07 12:39

編集2022/01/12 10:55

メールに添付ファイルをつけて配信したいのですが
届いたメールの添付ファイル名が文字化けしています。
どうすれば文字化けが直るのでしょうか?
よろしくお願いいたします。

// 文字コードを ISO-2022-JP に変える mb_convert_variables('ISO-2022-JP', 'UTF-8', $body, $filename); // 各 mime パートの構築 $mime = new Mail_mime; $mime->setParam('text_charset', 'ISO-2022-JP'); $mime->setParam('text_encoding', '8bit'); $mime->setTxtBody($body); $mime->addAttachment($file_path // data ,'application/octet-stream' // content-type ,$filename // attached file name ,false // isfile ,'base64' // encoding ,'attachment' // disposition ,'' // charset ,'' // language ,'' // location ,'base64' // n_encoding ,'base64' // f_encoding ,'' // description ,'ISO-2022-JP' // h_charset ); $subject = "メール:"; $jis = mb_convert_encoding($subject, 'ISO-2022-JP', 'UTF-8'); $encsubj = mb_encode_mimeheader($jis, 'ISO-2022-JP', 'B'); $headers = array( 'From' => 'hoge@hogehoge.net', 'To' => $recpts, 'Subject' => $encsubj ); $headers = $mime->headers($headers); $body = $mime->get(); // メール送信には SMTP を直接使うのが好き $mail = Mail::factory('smtp', array('host' => 'localhost')); $mail->send($recpts, $headers, $body);

ファイル名は正しいがファイルが壊れている

ファイルは届くがファイル名が文字化けしている

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

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

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

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

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

guest

回答2

0

「文字化け」の質問では、実際にどんなふうに化けて見えているのかをわかるようにしていただきたいです。お使いのメールソフトのスクリーンキャプチャを貼り付けるなどするといいと思います。

それはともかく、回答します。

php

1$mime->setParam('text_charset', 'ISO-2022-JP'); 2$mime->setParam('text_encoding', '8bit'); 3$mime->setTxtBody($body); 4

ISO-2022-JPは7ビット符号です[注1]ので、text_encodingは'7bit'であるべきです。

php

1$mime->addAttachment($file_path // data 2 ,'application/octet-stream' // content-type 3 ,$filename // attached file name 4 ,false // isfile 5 ,'base64' // encoding 6 ,'attachment' // disposition 7 ,'' // charset 8 ,'' // language 9 ,'' // location 10 ,'base64' // n_encoding 11 ,'base64' // f_encoding 12 ,'' // description 13 ,'ISO-2022-JP' // h_charset 14 ); 15

Mail_MIMEのマニュアルのaddAttachment()の項に基づき、引数についてコメントします。

  • __charset__は「The character set of attachment's content」です。これはファイル名の符号化には関係ありません。設定するとファイルの内容が文字コード変換されてしまいます。ですから''にします。
  • encoding、__disposition__もファイルの内容の設定です。'base64''attachment'で問題ないです。
  • n_encoding、__f_encoding__はファイル名の符号化に関係があります。それぞれ「Encoding of the attachment's name in Content-Type」、「Encoding of the attachment's filename in Content-Disposition header」です。
    ファイル名の符号化については間違った仕様がなかば一般化してしまっているという事情があり[注2]、それに合わせた設定をしなければなりません。__n_encoding__は'base64' (RFC 2047のB符号化――間違った仕様)、__f_encoding__はnull (RFC 2231符号化) とします。
    補足: RFC2047符号化を設定すると、Mail_mimeは正しく符号化してくれません (マルチバイト文字の途中で折り返されたりします)。でも、もともと間違った仕様なのですから、符号化自体の間違いには目をつぶることにします。
  • __h_charset__は「The character set of the headers」です。ファイル名の符号化に使われるのは__charset__ではなくこちらです。'ISO-2022-JP'のままでよいです。

php

1$subject = "メール:"; 2$jis = mb_convert_encoding($subject, 'ISO-2022-JP', 'UTF-8'); 3$encsubj = mb_encode_mimeheader($jis, 'ISO-2022-JP', 'B'); 4

事前にISO-2022-JPに変換すると正しく符号化できません (マルチバイト文字の途中で折り返されたりする)。次のようにUTF-8の文字列を直接mb_encode_mimeheader()に与えて符号化します[注3]。

php

1$subject = "メール:"; 2$encsubj = mb_encode_mimeheader($subject, 'ISO-2022-JP', 'B', "\n"); 3

ちなみに、第4引数の"\n"は下記と同じで、Mailを使う場合に必要です。既定値の"\r\n"では、ヘッダの途中に余分な改行が入るなどのトラブルに見舞われることがあります。

マニュアルのParameterの項の「Note」では「(...) if you want to send the generated MIME message using Mail then you have to set eol to "\n"」と書かれています。ですので、Mail_mimeのインスタンス化の際に次のパラメタ設定も行う必要があります。

php

1$mime->setParam('eol', "\n");

投稿2016/10/09 03:00

ikedas

総合スコア4227

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

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

falco

2016/10/09 04:26 編集

大変細かいご指摘ありがとうございます! まったく理解していない部分が多くありました。 ただ、ご指摘いただいた修正をしても直りません。 修正をして ''' $mime->addAttachment($file_path // data ,'application/octet-stream' // content-type ,$filename // attached file name ,false // isfile ,'base64' // encoding ,'attachment' // disposition ,'' // charset ,'' // language ,'' // location ,'base64' // n_encoding ,null // f_encoding // 修正 ,'' // description ,'ISO-2022-JP' // h_charset ''' をいれるとファイルが壊れます。 ファイル名は正しく送られます。 ''' $mime->addAttachment($file_path ,$filename ); // data ''' にすると ファイル名は文字化けしますが 添付ファイルは正しく送られてきます。 申し訳ありませんが、御教授よろしくお願いいたします。
ikedas

2016/10/09 05:00

Mail_mimeとMailのバージョンはなんでしょうか。私はMail_mime 1.8.4とMail1.2.0で動作を確認しました。
guest

0

以下を参考にされてはどうでしょうか。
http://hideohideo.com/archives/916

charsetの指定が必要かもしれません。

投稿2016/10/07 13:36

goute

総合スコア216

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

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

falco

2016/10/07 16:11

ありがとうございます! chersetを ,'ISO-2022-JP' // charset にすると ファイル名は文字化けせず届くのですが、 ファイルが壊れて開きません。 chersetを 指定しなければファイル名は文字化けしますが 添付ファイルはちゃんと開きます 申し訳ありませんが、お力添えください。
falco

2016/10/20 02:02

やはりだめです。 ご提案いただいた方法だと ファイル名は正常に文字化けせず添付ファイルがきますが ファイルが空です(0kb)となります。 大変困っています。 よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問