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

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

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

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

Q&A

解決済

2回答

5816閲覧

PHPMailerの文字化け

manaw

総合スコア7

PHP

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

0グッド

1クリップ

投稿2020/02/04 01:09

Webサイトの問い合わせフォームにPHPmailerを導入したのですが、返信のメールが文字化けしてしまいます。
いろいろと試しましたがうまくいかないので、お知恵を貸してください!

発生している問題・エラーメッセージ

送信される日本語が文字化けしています。

該当のソースコード

index.php

1<form action="mail.php" method="post"> 2 <input type="text" name="email" placeholder="email" value="<?php if(!empty($_POST['email'])) echo $_POST['email']; ?>"> 3 <input type="text" name="subject" placeholder="subject" value="<?php if(!empty($_POST['subject'])) echo $_POST['subject']; ?>"> 4 <textarea name="comment" cols="50" rows="10"><?php if(!empty($_POST['comment'])) echo $_POST['comment']; ?></textarea> 5 <input type="submit" value="SUBMIT"> 6</form>

mail.php

1<?php 2 3mb_language("ja"); 4mb_internal_encoding("UTF-8"); 5 6use PHPMailer\PHPMailer\PHPMailer; 7use PHPMailer\PHPMailer\SMTP; 8use PHPMailer\PHPMailer\Exception; 9 10require 'vendor/autoload.php'; 11 12if(!empty($_POST)){ 13 $msg = ''; 14 if(empty($_POST['email'])){ 15 $msg = 'Emial required'; 16 } 17 if(empty($_POST['subject'])){ 18 $msg = 'Subject required'; 19 } 20 if(empty($_POST['comment'])){ 21 $msg = 'Comment required'; 22 } 23 if(empty($msg)){ 24 $to = $_POST['email']; 25 $subject = mb_encode_mimeheader($_POST['subject']); 26 $comment = mb_convert_encoding($_POST['comment'], "JIS", "UTF=8"); 27 if(!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9?*[|]%'=~^\{\}/+!#&$._-])*@([a-zA-Z0-9_-])+.([a-zA-Z0-9._-]+)+$/", $to)){ 28 $msg = 'Please input correct Email'; 29 }else{ 30 $mail = new PHPMailer(true); 31 try { 32// $mail->SMTPDebug = SMTP::DEBUG_SERVER; 33 $mail->isSMTP(); 34 $mail->Host = 'example.jp'; 35 $mail->SMTPAuth = true; 36 $mail->Username = 'example.mixh.jp'; 37 $mail->Password = 'password'; 38 $mail->SMTPSecure = 'ssl'; 39 $mail->Port = 465; 40 41 $mail->setFrom('admin@email', 'something'); 42 $mail->addAddress($to); 43 $mail->addAddress('admin@email'); 44 $mail->addReplyTo('admin@email'); 45// $mail->addCC('cc@example.com'); 46// $mail->addBCC('bcc@example.com'); 47 48 $mail->CharSet='UTF-8'; 49 $mail->isHTML(false); 50 $mail->Subject = 'お問い合わせありがとうございます'; 51// $mail->Body = 'This is the HTML message body <b>in bold!</b>'; 52 $mail->Body = <<< EOM 53 54Your Email: 55$to 56 57Subject: 58$subject 59 60Comment: 61$comment 62 63.............................. 64 65.............................. 66 67EOM; 68 69 $mail->send(); 70 echo 'Message has been sent'; 71 } catch (Exception $e) { 72 echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}"; 73 } 74 75 } 76 } 77}

試したこと


mb_language("ja");
mb_internal_encoding("UTF-8");
上記をmail.phpの上部に追加

$mail->CharSet='UTF-8';
上記を追加

$subjet = ($_POST['subject'];から
$subject = mb_encode_mimeheader($_POST['subject']);に変更
$comment = ($_POST['comment'];から
$comment = mb_convert_encoding($_POST['comment'], "JIS", "UTF=8");に変更

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

m.ts10806

2020/02/04 01:17

>$mail->CharSet='UTF-8'; メール送信先のメーラーはUTF8で合ってますか?
manaw

2020/02/04 01:54

解決しました!ありがとうございました。
m.ts10806

2020/02/04 01:58

どのように? このコメントだけでは質問者さんの理解度や、なぜ解決できたかが他者には伝わりません
manaw

2020/02/04 02:10

すみません。"UTF=8"となっていた箇所をご提示いただいた通り"UTF-8"へと修正しました。 メーラーはUTF-8でした。
m.ts10806

2020/02/04 02:12

ベストアンサーにした回答につけてあげてください。 既に指摘があって認識されているかもしれませんが、当面の問題より大きな問題をこのコードは抱えています。
manaw

2020/02/04 02:14

はい。ありがとうございます。
guest

回答2

0

ベストアンサー

何処がどのように文字化けしているか質問に記載がなくわからないので
ぱっと見気付いたところです。

変数名が適切で無いので混乱するのだと思います。 (本文(Body)の一部になる文字列に$subjectとか。。。)
mb_encode_mimeheader()$mail->Subjectに設定する場合に必要
$mail->CharSet='UTF-8'としているなら、$mail->Bodyに設定する値はconvert_encoding()する必要なし。

"UTF=8""UTF-8"

php

1// $mail->CharSet='UTF-8' なら bodyはJISにする必要なし。 2// $comment = mb_convert_encoding($_POST['comment'], "JIS", "UTF=8"); 3 $comment = $_POST['comment']; 4// ・・・略・・・ 5 6// この$subjectはメールのSubjectではないのでmb_encode_mimeheader()する必要なし 7// $subject = mb_encode_mimeheader($_POST['subject']); 8 $subject = $_POST['subject']; 9 10// こっちはmb_encode_mimeheader()するひつようあり。 11// $mail->Subject = 'お問い合わせありがとうございます'; 12 $mail->Subject = mb_encode_mimeheader('お問い合わせありがとうございます'); 13// ・・・略・・・

投稿2020/02/04 01:29

編集2020/02/04 01:52
Y.H.

総合スコア7918

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

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

manaw

2020/02/04 01:56

解決しました!ありがとうございました。
Y.H.

2020/02/04 02:01

te2jiさんの回答にあるとおり 最高に危険なXSSとmail header injectinの脆弱性が在るコードなのできちんと対応してから公開してください。
manaw

2020/02/04 02:15

はい!勉強不足で恥ずかしいかぎりです。公開はまだまだなので、それまでに対応を行います。ありがとうございました!
guest

0

回答ではありません
お問合せフォームに、XSS 可能な投稿フォームを置かないでください。
非常に危険です。

投稿2020/02/04 01:38

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

manaw

2020/02/04 01:55

コメントありがとうございます。公開前に対策いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問