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

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

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

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

メール

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

Q&A

解決済

2回答

791閲覧

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

manaeos

総合スコア32

PHP

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

メール

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

0グッド

1クリップ

投稿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

1$encode = "UTF-8"; 2 3//↓↓↓ 管理者と自動返信の送信 4if(($confirmDsp == 0 || $sendmail == 1) && $empty_flag != 1){ 5 6 //差出人に届くメールをセット 7 if($remail == 1) { 8 $userBody = mailToUser($_POST,$dsp_name,$remail_text,$mailFooterDsp,$mailSignature,$encode); 9 $reheader = userHeader($refrom_name,$to,$encode); 10 $re_subject = "=?iso-2022-jp?B?".base64_encode(mb_convert_encoding($re_subject,"JIS",$encode))."?="; 11 } 12 //管理者宛に届くメールをセット 13 $adminBody = mailToAdmin($_POST,$subject,$mailFooterDsp,$mailSignature,$encode,$confirmDsp); 14 $header = adminHeader($userMail,$post_mail,$BccMail,$to); 15 16 //トラバーサルチェック 17 if(isset($_POST['upfilePath'])){ 18 traversalCheck($tmp_dir_name); 19 } 20 if(ini_get('safe_mode')) { 21 $result = mb_send_mail($to,$subject,$adminBody,$header); 22 }else{ 23 $result = mb_send_mail($to,$subject,$adminBody,$header,'-f'. $to); 24 } 25 //サーバ上の一時ファイルを削除 26 $dir = rtrim($tmp_dir_name,'/'); 27 deleteFile($dir,$tempFileDel); 28 if($remail == 1 && !empty($post_mail)) mail($post_mail,$re_subject,$userBody,$reheader); 29 //CSVバックアップ処理 30 if($csv_backup == 1){ 31 csvBackup($csv_file_path,$csv_data_esc,$regData); 32 } 33 34} 35//↑↑↑ 管理者と自動返信の送信 36 37 38//管理者宛送信メールヘッダ 39function adminHeader($userMail,$post_mail,$BccMail,$to){ 40 global $encode; 41 $header = ''; 42 43 //メールで日本語使用するための設定 44 //mb_language("Japanese") ; 45 mb_language("neutral") ; 46 mb_internal_encoding($encode); 47 48 if($userMail == 1 && !empty($post_mail)) { 49 $header="From: $post_mail\n"; 50 if($BccMail != '') { 51 $header.="Bcc: $BccMail\n"; 52 } 53 $header.="Reply-To: ".$post_mail."\n"; 54 }else { 55 if($BccMail != '') { 56 $header="Bcc: $BccMail\n"; 57 } 58 $header.="Reply-To: ".$to."\n"; 59 } 60 61 //---------------------------------------------------------------------- 62 // 添付ファイル処理(START) 63 //---------------------------------------------------------------------- 64 if(isset($_POST['upfilePath'])){ 65 $header .= "MIME-Version: 1.0\n"; 66 $header .= "Content-Type: multipart/mixed; boundary=\"__PHPFACTORY__\"\n"; 67 }else{ 68 $header.="Content-Type:text/plain;charset=iso-2022-jp\nX-Mailer: PHP/".phpversion(); 69 } 70 71 return $header; 72} 73 74 75//管理者宛送信メールボディ 76function mailToAdmin($arr,$subject,$mailFooterDsp,$mailSignature,$encode,$confirmDsp){ 77 global $rename; 78 $adminBody = ''; 79 //---------------------------------------------------------------------- 80 // 添付ファイル処理(START) 81 //---------------------------------------------------------------------- 82 if(isset($_POST['upfilePath'])){ 83 $adminBody .= "--__PHPFACTORY__\n"; 84 $adminBody .= "Content-Type: text/plain; charset=\"ISO-2022-JP\"\n"; 85 //$adminBody .= "\n"; 86 } 87 //---------------------------------------------------------------------- 88 // 添付ファイル処理(END) 89 //---------------------------------------------------------------------- 90 91 $adminBody .="「".$subject."」からメールが届きました\n\n"; 92 $adminBody .="===========================\n\n"; 93 $adminBody .= postToMail($arr);//POSTデータを関数からセット 94 $adminBody .="\n===========================\n"; 95 $adminBody .="送信された日時:".date( "Y/m/d (D) H:i:s", time() )."\n"; 96 $adminBody .="送信者のIPアドレス:".@$_SERVER["REMOTE_ADDR"]."\n"; 97 $adminBody .="送信者のホスト名:".getHostByAddr(getenv('REMOTE_ADDR'))."\n"; 98 if($confirmDsp != 1){ 99 $adminBody.="問い合わせのページURL:".@h($_SERVER['HTTP_REFERER'])."\n"; 100 }else{ 101 $adminBody.="問い合わせのページURL:".@$arr['httpReferer']."\n"; 102 } 103 if($mailFooterDsp == 1) $adminBody.= $mailSignature."\n"; 104 105 106 107//---------------------------------------------------------------------- 108// 添付ファイル処理(START) 109//---------------------------------------------------------------------- 110 111if(isset($_POST['upfilePath'])){ 112 113 $default_internal_encode = mb_internal_encoding(); 114 if($default_internal_encode != $encode){ 115 mb_internal_encoding($encode); 116 } 117 118 $file_count = count($_POST['upfilePath']); 119 120 for ($i=0;$i<$file_count;$i++) { 121 122 if(isset($_POST['upfilePath'][$i])){ 123 124 $adminBody .= "--__PHPFACTORY__\n"; 125 $filePath = h(@$_POST['upfilePath'][$i]);//ファイルパスを指定 126 $fileName = h(mb_encode_mimeheader(@$_POST['upfileOriginName'][$i])); 127 $imgType = h(@$_POST['upfileType'][$i]); 128 129 //ファイル名が文字化けする場合には連番ファイル名とする 130 if($rename == 1){ 131 $fileNameArray = explode(".",$fileName); 132 $fileName = $i.'.'.end($fileNameArray); 133 } 134 135 136 # 添付ファイルへの処理をします。 137 $handle = @fopen($filePath, 'r'); 138 $attachFile = @fread($handle, filesize($filePath)); 139 @fclose($handle); 140 $attachEncode = base64_encode($attachFile); 141 142 $adminBody .= "Content-Type: {$imgType}; name=\"$filePath\"\n"; 143 $adminBody .= "Content-Transfer-Encoding: base64\n"; 144 $adminBody .= "Content-Disposition: attachment; filename=\"$fileName\"\n"; 145 $adminBody .= "\n"; 146 $adminBody .= chunk_split($attachEncode) . "\n"; 147 } 148 } 149 $adminBody .= "--__PHPFACTORY__--\n"; 150} 151//---------------------------------------------------------------------- 152// 添付ファイル処理(END) 153//---------------------------------------------------------------------- 154 155 //return mb_convert_encoding($adminBody,"JIS",$encode); 156 return $adminBody; 157} 158 159 160//ユーザ宛送信メールヘッダ 161function userHeader($refrom_name,$to,$encode){ 162 $reheader = "From: "; 163 if(!empty($refrom_name)){ 164 $default_internal_encode = mb_internal_encoding(); 165 if($default_internal_encode != $encode){ 166 mb_internal_encoding($encode); 167 } 168 $reheader .= mb_encode_mimeheader($refrom_name)." <".$to.">\nReply-To: ".$to; 169 }else{ 170 $reheader .= "$to\nReply-To: ".$to; 171 } 172 $reheader .= "\nContent-Type: text/plain;charset=iso-2022-jp\nX-Mailer: PHP/".phpversion(); 173 return $reheader; 174} 175 176 177//ユーザ宛送信メールボディ 178function mailToUser($arr,$dsp_name,$remail_text,$mailFooterDsp,$mailSignature,$encode){ 179 $userBody = ''; 180 if(isset($arr[$dsp_name])) $userBody = h($arr[$dsp_name]). " 様\n"; 181 $userBody.= $remail_text; 182 $userBody.="\n===========================\n\n"; 183 $userBody.= postToMail($arr);//POSTデータを関数からセット 184 $userBody.="\n===========================\n\n"; 185 $userBody.="送信日時:".date( "Y/m/d (D) H:i:s", time() )."\n"; 186 if($mailFooterDsp == 1) $userBody.= $mailSignature; 187 return mb_convert_encoding($userBody,"JIS",$encode); 188}

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

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


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

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/05/27 09:29

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

2022/05/27 12:08

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

退会済みユーザー

2022/05/30 00:15

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

回答2

0

mb_language("neutral") の状態のadminBodyについて、
ファイルをISO-2022JPとみなして開くと、文字化けが生じているので、
これでしくじっている気がします。

イメージ説明

原因がわかっても、具体的な対策についてはなんとも。
phpのコードの途中で、mb_language()をいじるメールサンプルが多いですが、
日本語文字列データの持ち方が変わる少し危険なものなので、
送信環境に合わせた何らかの工夫が必要なのかもしれません。
(当該サーバープラン利用者のリアクションがあると良いのですが。)

PHP: mb_language - Manual
neutral ではなく、uni をためすのはいかがでしょうか。
PHPによるUTF-8メール(多言語混在メール)の送信方法
PHP で UTF-8 なメールを送る - 電気ウナギ的○○

実際に自分でやってないので、あくまで参考情報として。

投稿2022/05/30 01:27

編集2022/05/30 01:35
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

manaeos

2022/05/30 07:19

調べていただき、ありがとうございます。 「uni」で試してみましたが変わりませんでした。 このファイルは送信以外のカスタマイズがしやすくて長いこと使っているのですが、 このようなトラブルは初めてです。 メールの送信でmb_language( 'neutral' )にするサーバは他にあるんでしょうか? > phpのコードの途中で、mb_language()をいじるメールサンプルが多いですが、 そうですね。 他のフリーのファイル等を見てもmb_language( 'Japanese' )とあり、 もうゼロから作ろうかと思って調べたのですが、どのサイトを見ても最初に mb_language( 'Japanese' ); mb_internal_encoding( 'UTF-8' ); の2行を記述とあり、 逆に入れるのはよくないというサイトもあったので、 少し混乱してますが、あれこれ試してみます。 > 当該サーバープラン利用者のリアクションがあると良いのですが そう思います。
退会済みユーザー

退会済みユーザー

2022/05/30 07:24

これだけのことでサーバー引っ越しするのもアレですし。お力になれず。
guest

0

自己解決

正確には全く解決していません。
サーバを変更しました。

自分の技術力の無さもあるのですが、どうにも前プラン時の状態にできませんでした。
実はWordpressを設置し、Contactform7を入れたところ、問題なく送信できました。
ですが確認画面のプラグインを追加や、バリデートのカスタマイズをしていたのですが、あるプラグインでは添付ファイルを送るのは有料プランに変更(それでも送れるのは5MBまで)や、別なプラグインではバリデートのカスタマイズをすると確認画面が開かなかったりと、なかなか前プランと同じ状態にできず時間ばかりが過ぎてしまうので、もう諦めてサーバを変更することにしました。
そもそも「RSプラン」は、Wordpress以外には向いていない感じがします。

ついでですが、無料SSLを使っていて、PHPで表示中のURLを取得するコードを入れていたのですが↓

(empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER["HTTP_HOST"]."/"

https://~」で表示されて、ブラウザも「安全なサイト」と認識されているのに、取得したURLは「http://~」になってしまいます。これも何やっても「https」になりません。

このお名前.COMの「RSプラン」は、Wordpressに特化したサーバと思います。
インストールやテスト環境の作成が管理画面で簡単にできますし、他社サーバのWordPressの引っ越しも、移行元のURLと管理画面のユーザー名とパスワードを入力するだけで、DB込みで引っ越しができます。これは便利なサーバだなと思ってたのですが、Wordpress以外ではどうも使いにくいようです。

他に利用されている方で回答があればと思ったのですが、もう別サーバに変更したのでここで締め切ります。

投稿2022/06/13 08:53

manaeos

総合スコア32

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問