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

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

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

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

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

解決済

【お名前.com】mb_language( "neutral" )でフォームから添付ファイルが送れない

manaeos
manaeos

総合スコア22

PHP

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

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

2回答

0評価

1クリップ

151閲覧

投稿2022/05/27 08:37

編集2022/06/13 17:53

数年前から使用しているメール送信用のPHPファイルがあるのですが、
今回、お名前.comのRSプランで使用しました。(SDプラン(旧プラン)からの変更です)
送信は問題なくできるのですが、
どういう訳か「目的」が文字化けします。「目」、「的」は平気です。

SDプランのPHPは5.6です。今回のRSプランは7.4
このメール送信用のPHPファイルは他のサーバーでも使用していて、PHP7~でも問題なく使用しています。
RSプランのPHPのバージョンを変更しても解決しませんでした。

調べてみて、以下のページを見つけたところ同じ状態でした。
「お名前.comでコンタクトフォームからのメールが文字化け」
https://akaryune-koho.com/2021/11/mojibake/
(試しに「本田」「本当」を入力して送信したら文字化けしました)

ここに記載している対策は、
mb_language("Japanese") を mb_language("neutral") に変更でした。

この対応で文字化けは解決できたのですが、
添付ファイルがあるとエンコードがおかしいのか本文が表示されません。
またmb_send_mailをmailに変更したりとか試したのですが、全く変化がないです。

どこを調べてもメールの送信ではmb_language("Japanese")とあるので、
お名前.comに問い合わせをしたのですが、返事は

「mb_send_mailのエンコードが原因で文字化けをしているので
mb_language("Japanese") を mb_language("neutral") に変更してください。」でした

だけど変更前のSDプランでは問題なく使用できたので、
変更したら使えなくなったというのは納得がいかず、再度問い合わせをしたところ
「もう少しお待ちください」の連絡後、翌日に「自力で解決してください」とのことでした。

以下はメール送信用のPHPの送信部分です。
(mb_languageは、//管理者宛送信メールヘッダ内にあります。)

PHP

$encode = "UTF-8"; //↓↓↓ 管理者と自動返信の送信 if(($confirmDsp == 0 || $sendmail == 1) && $empty_flag != 1){ //差出人に届くメールをセット if($remail == 1) { $userBody = mailToUser($_POST,$dsp_name,$remail_text,$mailFooterDsp,$mailSignature,$encode); $reheader = userHeader($refrom_name,$to,$encode); $re_subject = "=?iso-2022-jp?B?".base64_encode(mb_convert_encoding($re_subject,"JIS",$encode))."?="; } //管理者宛に届くメールをセット $adminBody = mailToAdmin($_POST,$subject,$mailFooterDsp,$mailSignature,$encode,$confirmDsp); $header = adminHeader($userMail,$post_mail,$BccMail,$to); //トラバーサルチェック if(isset($_POST['upfilePath'])){ traversalCheck($tmp_dir_name); } if(ini_get('safe_mode')) { $result = mb_send_mail($to,$subject,$adminBody,$header); }else{ $result = mb_send_mail($to,$subject,$adminBody,$header,'-f'. $to); } //サーバ上の一時ファイルを削除 $dir = rtrim($tmp_dir_name,'/'); deleteFile($dir,$tempFileDel); if($remail == 1 && !empty($post_mail)) mail($post_mail,$re_subject,$userBody,$reheader); //CSVバックアップ処理 if($csv_backup == 1){ csvBackup($csv_file_path,$csv_data_esc,$regData); } } //↑↑↑ 管理者と自動返信の送信 //管理者宛送信メールヘッダ function adminHeader($userMail,$post_mail,$BccMail,$to){ global $encode; $header = ''; //メールで日本語使用するための設定 //mb_language("Japanese") ; mb_language("neutral") ; mb_internal_encoding($encode); if($userMail == 1 && !empty($post_mail)) { $header="From: $post_mail\n"; if($BccMail != '') { $header.="Bcc: $BccMail\n"; } $header.="Reply-To: ".$post_mail."\n"; }else { if($BccMail != '') { $header="Bcc: $BccMail\n"; } $header.="Reply-To: ".$to."\n"; } //---------------------------------------------------------------------- // 添付ファイル処理(START) //---------------------------------------------------------------------- if(isset($_POST['upfilePath'])){ $header .= "MIME-Version: 1.0\n"; $header .= "Content-Type: multipart/mixed; boundary=\"__PHPFACTORY__\"\n"; }else{ $header.="Content-Type:text/plain;charset=iso-2022-jp\nX-Mailer: PHP/".phpversion(); } return $header; } //管理者宛送信メールボディ function mailToAdmin($arr,$subject,$mailFooterDsp,$mailSignature,$encode,$confirmDsp){ global $rename; $adminBody = ''; //---------------------------------------------------------------------- // 添付ファイル処理(START) //---------------------------------------------------------------------- if(isset($_POST['upfilePath'])){ $adminBody .= "--__PHPFACTORY__\n"; $adminBody .= "Content-Type: text/plain; charset=\"ISO-2022-JP\"\n"; //$adminBody .= "\n"; } //---------------------------------------------------------------------- // 添付ファイル処理(END) //---------------------------------------------------------------------- $adminBody .="「".$subject."」からメールが届きました\n\n"; $adminBody .="===========================\n\n"; $adminBody .= postToMail($arr);//POSTデータを関数からセット $adminBody .="\n===========================\n"; $adminBody .="送信された日時:".date( "Y/m/d (D) H:i:s", time() )."\n"; $adminBody .="送信者のIPアドレス:".@$_SERVER["REMOTE_ADDR"]."\n"; $adminBody .="送信者のホスト名:".getHostByAddr(getenv('REMOTE_ADDR'))."\n"; if($confirmDsp != 1){ $adminBody.="問い合わせのページURL:".@h($_SERVER['HTTP_REFERER'])."\n"; }else{ $adminBody.="問い合わせのページURL:".@$arr['httpReferer']."\n"; } if($mailFooterDsp == 1) $adminBody.= $mailSignature."\n"; //---------------------------------------------------------------------- // 添付ファイル処理(START) //---------------------------------------------------------------------- if(isset($_POST['upfilePath'])){ $default_internal_encode = mb_internal_encoding(); if($default_internal_encode != $encode){ mb_internal_encoding($encode); } $file_count = count($_POST['upfilePath']); for ($i=0;$i<$file_count;$i++) { if(isset($_POST['upfilePath'][$i])){ $adminBody .= "--__PHPFACTORY__\n"; $filePath = h(@$_POST['upfilePath'][$i]);//ファイルパスを指定 $fileName = h(mb_encode_mimeheader(@$_POST['upfileOriginName'][$i])); $imgType = h(@$_POST['upfileType'][$i]); //ファイル名が文字化けする場合には連番ファイル名とする if($rename == 1){ $fileNameArray = explode(".",$fileName); $fileName = $i.'.'.end($fileNameArray); } # 添付ファイルへの処理をします。 $handle = @fopen($filePath, 'r'); $attachFile = @fread($handle, filesize($filePath)); @fclose($handle); $attachEncode = base64_encode($attachFile); $adminBody .= "Content-Type: {$imgType}; name=\"$filePath\"\n"; $adminBody .= "Content-Transfer-Encoding: base64\n"; $adminBody .= "Content-Disposition: attachment; filename=\"$fileName\"\n"; $adminBody .= "\n"; $adminBody .= chunk_split($attachEncode) . "\n"; } } $adminBody .= "--__PHPFACTORY__--\n"; } //---------------------------------------------------------------------- // 添付ファイル処理(END) //---------------------------------------------------------------------- //return mb_convert_encoding($adminBody,"JIS",$encode); return $adminBody; } //ユーザ宛送信メールヘッダ function userHeader($refrom_name,$to,$encode){ $reheader = "From: "; if(!empty($refrom_name)){ $default_internal_encode = mb_internal_encoding(); if($default_internal_encode != $encode){ mb_internal_encoding($encode); } $reheader .= mb_encode_mimeheader($refrom_name)." <".$to.">\nReply-To: ".$to; }else{ $reheader .= "$to\nReply-To: ".$to; } $reheader .= "\nContent-Type: text/plain;charset=iso-2022-jp\nX-Mailer: PHP/".phpversion(); return $reheader; } //ユーザ宛送信メールボディ function mailToUser($arr,$dsp_name,$remail_text,$mailFooterDsp,$mailSignature,$encode){ $userBody = ''; if(isset($arr[$dsp_name])) $userBody = h($arr[$dsp_name]). " 様\n"; $userBody.= $remail_text; $userBody.="\n===========================\n\n"; $userBody.= postToMail($arr);//POSTデータを関数からセット $userBody.="\n===========================\n\n"; $userBody.="送信日時:".date( "Y/m/d (D) H:i:s", time() )."\n"; if($mailFooterDsp == 1) $userBody.= $mailSignature; return mb_convert_encoding($userBody,"JIS",$encode); }

サーバーのmbstring情報です。
イメージ説明

コード内の他の箇所でエンコードを試したりとかしてみたのですが、正直お手上げです。
どう変更すればいいのか、対応策がありましたら教えて頂きたいです。
何卒よろしくお願い致します。


追記
Japaneseとneutralとで、mb_send_mail()に与える直前の$adminBodyと$headerです。
bodyがエンコードされた長い文字列でここに記載ができないので、テキストファイルにしてfirestorageにUPしました。
こちらからダウンロードしてください。
■mb_language()でのheaderとadminBody

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

gU8C8Nud4E8p3uW

2022/05/27 09:29

Japaneseとneutralとで、mb_send_mail()に与える直前の$adminBodyと$headerがどうなっているか、ファイルに書き出すなどして確認できますか?
manaeos

2022/05/27 12:08

mb_send_mail()直前での内容を表示することができたので、テキストファイルで保存しました。 この内容で合っているのかが分からないので、すみませんがご確認をお願いします。
gU8C8Nud4E8p3uW

2022/05/30 00:15

テキストファイルで保存した、とのことですが、ヘッダーもボディーも改行(LF)を込めてますよね? ファイルを見ると1行に繋がっちゃっているのが気になるというか。添付ファイルにつけるファイル名には絶対パスも相対パスもつけずにファイル名のみにしたほうがいいのかな。Content-Type:でのファイル名とContent-Disposition:でのファイル名が違うのは、なにかこだわりが?

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

PHP

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

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。