
数年前から使用しているメール送信用の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


回答2件
あなたの回答
tips
プレビュー