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

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

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

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

メール

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

Q&A

解決済

2回答

1368閲覧

PHPでmail関数で送信したメールが文字化けする

yukiko1025

総合スコア16

PHP

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

メール

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

0グッド

0クリップ

投稿2019/05/08 10:49

phpを利用した問い合わせフォームを作成しています。
問い合わせフォームから送信させたメール本文が文字化けしてしまい困っています。

<form>で内容を入力してもらい、確認画面へ$_POST形式で入力内容を確認し、 問題が無ければ「送信」ボタンでmail関数でメールを送信させ送信画面を出すという動きです。

入力画面、確認画面、送信画面はそれぞれ別のページになっています。
また、画面上に$_POST値を利用して入力内容を表示させており、そちらは正常に表示されます。

mb_send_mail関数の使用については、HPサーバの環境上の問題でエラーが出るため使用できません。
ソースの文字コードセットは「UTF-8」を指定して保存しています。

当初はmd_send_mail時に設定するエンコード方法(以下)で試していたのですが、
件名、本文ともに文字化けしてしまったため削除しました。

php

1 //エンコード処理 2 mb_language("Japanese"); 3 mb_internal_encoding("UTF-8"); 4

現在は以下のソースで動かしており、件名の文字化けは解消しております。
しかし、本文については文字化けしたままです。ソース後に一応文字化け内容を載せます。

php

1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 2<html lang="ja"> 3 4<head> 5<meta http-equiv="Content-Style-Type" content="text/css"> 6<meta http-equiv="Content-type" content="text/html; charset=UTF-8"> 7 8<meta http-equiv="Content-Script-Type" content="text/javascript"> 9<link rel="stylesheet" href="style.css"> 10 11<TITLE>お問い合わせ</TITLE> 12</head> 13 14<body> 15 16<?php 17$namae = $_POST["namae"]; 18$mailaddress = $_POST["mailaddress"]; 19$naiyou = $_POST["naiyou"]; 20 21 //メール本文の作成 22 $honbun = ''; 23 $honbun .= "メールフォームよりお問い合わせがありました。"."\n\n"; 24 $honbun .= "【お名前】"."\n"; 25 $honbun .= $namae."\n\n"; 26 $honbun .= "【メールアドレス】"."\n"; 27 $honbun .= $mailaddress."\n\n"; 28 $honbun .= "【お問い合わせ内容】"."\n"; 29 $honbun .= $naiyou."\n\n"; 30 31 //エンコード処理 32 mb_internal_encoding("UTF-8"); 33 34 35 //メールの作成 36 $mail_to = "sample@sample.co.jp"; //送信先メールアドレス 37 $mail_subject = "メールフォームよりお問い合わせ"; //メールの件名 38 $mail_body = $honbun; //メールの本文 39 $mail_header = "from:".$mailaddress; //送信元として表示されるメールアドレス 40 41 //メール送信処理 42 $mailsousin = mail($mail_to, mb_encode_mimeheader($mail_subject,'UTF-8'), mb_convert_encoding($mail_body,'UTF-8'), $mail_header); 43 44 //メール送信結果 45 if($mailsousin == true) { 46 $result = '<p><font face="メイリオ" size="-1"><b>お問い合わせいただきありがとうございます。</b><br><br>ご記入いただきました内容を送信いたしました。<br>お問い合わせいただきました内容を確認後、担当者より改めてご連絡いたします。</p>'; 47 } else { 48 $result = '<p><font face="メイリオ" size="-1"><b>メール送信でエラーが発生しました。</b><br><br>お手数ですがもう一度お試しください。</font></p>'; 49 } 50?> 51 52 53</body> 54</html>

以下が届いたメールの内容です。
お力添えいただけますと幸いです、よろしくお願いします。

繝。繝シ繝ォ繝輔か繝シ繝繧医j縺雁撫縺・粋繧上○縺後≠繧翫∪縺励◆縲・

縲舌♀蜷榊燕縲・
譁・ュ怜喧縺・

縲舌Γ繝シ繝ォ繧「繝峨Ξ繧ケ縲・
─【$mail_headerのアドレス】がアルファベットで正常表示─

縲舌♀蝠上>蜷医o縺帛・螳ケ縲・
繧ゅ§縺ー縺・

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

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

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

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

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

guest

回答2

0

ベストアンサー

当該スクリプトを動かしたところ、手元の環境では文字化けしなかったものの、Content-Typeヘッダがでていないので、環境によっては文字化けするかもしれません。以下のようにしたらどうでしょうか?

PHP

1$mail_header = "Content-Type: text/plain; charset=UTF-8\r\nfrom:".$mailaddress;

ただし、この部分にはメールヘッダ・インジェクションという脆弱性があります。宛先を追加したり、PHPのバージョンによっては、本文を改変したり、添付ファイルを付与できたりします。「安全なウェブサイトの作り方」などを参照して改善することをつよくお勧めします。
対策の一例としては、Fromヘッダを指定するのではなく、本文中に書いてしまうのが簡便です。

投稿2019/05/08 12:04

ockeghem

総合スコア11701

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

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

0

mb_send_mail()つかうサンプルコードを探して、書き直そう。
例えば:
メール送信がうまくいかないときに読む記事(そういう質問をされたときに読ませる記事) - Qiita

投稿2019/05/08 11:13

編集2019/05/08 11:15
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yukiko1025

2019/05/08 11:25

開発の環境(CentOS)では、以下のmd_send_mailを使用したコードで正常に動作していました。 //エンコード処理 mb_language("Japanese"); mb_internal_encoding("UTF-8"); //メールの作成 $mail_to = "sample@sample.co.jp"; //送信先メールアドレス $mail_subject = "メールフォームよりお問い合わせ"; //メールの件名 $mail_body = $honbun; //メールの本文 $mail_header = "from:".$mailaddress; //送信元として表示されるメールアドレス //メール送信処理 $mailsousin = mb_send_mail($mail_to, $mail_subject, $mail_body, $mail_header); しかし、上記のコードのまま開発環境(WindowsSERVER2012)に移すと、 送信画面で設定したフラグによるエラーメッセージが表示され、メール送信自体が失敗します。 送信失敗画面のソースを見ると、以下のようなメッセージが出ていました。 <b>Warning</b>: mb_send_mail(): SMTP server response: 500 Command unknown: 'CONTENT-TYPE:' 500 Command unknown: 'CONTENT-TRANSFER-ENCODING:' in <b>ソースファイル名</b> on line <b>42</b><br /> おそらくこのURLにかかれているようなPHPのバージョンの問題なのかと思っていますが…。 https://www.php-factory.net/cms/detail.php?id=24
退会済みユーザー

退会済みユーザー

2019/05/08 11:28

そう考えるのであれば、第三者にもわかるように、稼働した環境のPHPバージョンと、動かない環境のPHPバージョンを示すべきでしょう。(質問文中に追記してね。)
yukiko1025

2019/05/08 11:31

すみません、あくまでも解決したかった内容がmail関数で作成したメールの文字化けだったので… 最初の質問に記載したエンコード方法が誤っていれば、 そちらの解消で予定した動作になるのではないかと思っていました
退会済みユーザー

退会済みユーザー

2019/05/08 11:57

> m6u さん 引用した Shibuya Kosuke さんの記事って、ライブラリ使えって内容だと思うんだけど。。。 > yukiko1025 さん こんなスパム発射台なコード、インターネット上で使用してほしくないです。 ほとんどまともに届かないだろうけど、早急にサーバから削除されることをオススメします。
退会済みユーザー

退会済みユーザー

2019/05/09 00:48

もっと用意周到に様々な対策を入れたサンプルコードがどこかにあったはずなのに、今見つけられず。
yukiko1025

2019/05/09 02:42

すみません、誰もがアクセスできる環境に置くのではなくて 同ネットワーク内の限られた端末からのみアクセス・利用できる環境で使用する予定のコードです。 安全対策についてはもう少し詰めてから使用します、ご指摘ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問