日本PHPユーザ会 掲示板

日本PHPユーザ会運営の掲示板です。※ただいまテスト運用中です。

日本PHPユーザ会 掲示板 » PHP事はじめ » 助けてください!

助けてください!

ページ: 1

投稿者 投稿
会員
登録者: 2 2010
返信数: 4
もうダメです。
とてもカンタンなフォームみたいですが、
件名だけはちゃんと日本語になりません。

ファイルは三つです。


① mail1.html

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

<?php
session_start();

if(isset($_POST))
{
if(isset($_POST["add"]))
{
$_SESSION["name"] = $_POST["name"];
$_SESSION["email"] = $_POST["email"];
$_SESSION["place5"] = $_POST["place5"];
header("location: mail1_confirm.html");
}
if(isset($_POST["clear"]))
{
$_SESSION["name"] = "";
$_SESSION["email"] = "";
$_SESSION["place5"] = "";
}
}

?>




<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
>
<title>フォーム</title>

<!--]fontsize-->

</head>


<body>
<table width="100" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>&nbsp;</td>
</tr>
<tr>
<td background="img/bg.gif">

<div style="padding:0px 30px 0px 40px">

<form name="form1" id="form1" method="post" action="mail1.html" onSubmit="return _validation();">
<p align="right" class="style4" style="margin-right:20px">&nbsp;</p>
<table width="200" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="2" bgcolor="#175600">&nbsp;</td>
<td style="padding:15px 0px 15px 10px"><span class="style9">ォーム</span></td>
</tr>
</table>
<p class="style3">&nbsp;</p>
<table width="100%" border="0" cellspacing="10" cellpadding="0">
<tr>
<td><span class="style4">名前:</span>
<input type="text" name="name" id="name" value="<?php echo $_SESSION["name"]; ?>" style="width:150px"/>
</td>
</tr>
<tr>
<td><span class="style4">メール:</span>
<input type="text" name="email" id="email" value="<?php echo $_SESSION["email"]; ?>" style="width:150px"/>
</td>
</tr>

</table>
<br />
<br />
<table width="100%" border="0" cellspacing="10" cellpadding="0">

<tr>
<td><span class="style7">コメント</span></td>
</tr>
<tr>
<td><textarea name="place5" id="place5" style="width:470px"><?php echo $_SESSION["place5"]; ?></textarea></td>
</tr>
</table>
<p><input type="submit" name="add" id="add" value="確認" />
<input type="submit" name="clear" id="clear" value="リセット" />
</p>
</form>
</div>

<div align="center"></div></td>
</tr>
<tr>
<td>&nbsp;</td>
</tr>
</table>
</body>
</html>


///////////////////////////////////////////////////////////////////

② mail1_confirm.html





<?php
session_start();
if($_SESSION["name"] == "")
header("location:mail1.html");

$to = "username@emailserver.com";

$subject = "ホームページからのメッセージ";
if(isset($_POST))
{
if(isset($_POST["confirm_add"]))
{
$from_email = $_SESSION["email"];
$from_name = $_SESSION["name"];

$body = "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
 診察希望フォーム
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

――――――――――――――――――――――――――――――――――――――
 ■名前
  " .$_SESSION["name"]. "
――――――――――――――――――――――――――――――――――――――
 ■メール
  " .$_SESSION["email"]. "
――――――――――――――――――――――――――――――――――――――
 ■コメント
  " .$_SESSION["place5"]. "
――――――――――――――――――――――――――――――――――――――


";

$_SESSION["name"] = "";
$_SESSION["email"] = "";
$_SESSION["place5"] = "";

if(_mail($to, $subject, $body, $from_email,$from_name))
header("location: mail1_result.html?res=1");
else
header("location: mail1_result.html?res=0");

}
if(isset($_POST["back"]))
{
header("location: mail1.html");
}
}

function _mail($to, $subject, $body, $from_email,$from_name)
{
mb_language("ja");
$subject = mb_convert_encoding($subject, "ISO-2022-JP","AUTO");
$subject = mb_encode_mimeheader($subject);

$from_name = mb_convert_encoding($from_name, "ISO-2022-JP","AUTO");
$from_name = mb_encode_mimeheader($from_name);

$headers = "MIME-Version: 1.0 \n" ;
$headers .= "From: " .
"".$from_name ."" .
"<".$from_email."> \n";
$headers .= "Reply-To: " .
"".$from_name ."" .
"<".$from_email."> \n";

$headers .= "Content-Type: text/plain;charset=ISO-2022-JP \n";
$body = mb_convert_encoding($body, "ISO-2022-JP","AUTO");
$sendmail_params = "-f$from_email";
$result = mail($to, $subject, $body, $headers, $sendmail_params);
return $result;
}

?>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>フォーム</title>


</head>


<body>
<table width="100" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><img src="img/top.gif" width="584" height="43" /></td>
</tr>
<tr>
<td background="img/bg.gif">

<div style="padding:0px 30px 0px 40px">

<form name="form1" id="form1" method="post" action="mail1_confirm.html">
<p align="right" class="style4" style="margin-right:20px">&nbsp;</p>
<table width="200" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="2" bgcolor="#175600">&nbsp;</td>
<td style="padding:15px 0px 15px 10px"><span class="style9">フォーム</span></td>
</tr>
</table>
<p class="style1">&nbsp;</p>
<table width="100%" border="0" cellspacing="10" cellpadding="0">
<tr>
<td class="style4"><span class="style2">*</span><span class="style4">名前:</span>
<?php echo $_SESSION["name"]; ?>
</td>
</tr>

<tr>
<td class="style4"><span class="style4">メール:</span>
<?php echo $_SESSION["email"]; ?></td>
</tr>
</table>
<br />
<br />
<table width="100%" border="0" cellspacing="10" cellpadding="0">

<tr>
<td><span class="style7">コメント</span></td>
</tr>
<tr>
<td class="style4"><?php echo $_SESSION["place5"]; ?></td>
</tr>
</table>
<p><input type="submit" name="confirm_add" id="add" value="送信" />
<input type="submit" name="back" id="back" value="戻る" />

</p>

</form>
</div>

<div align="center"></div></td>
</tr>
<tr>
<td>&nbsp;</td>
</tr>
</table>
</body>
</html>



/////////////////////////////////////////////////////////////////////


③ mail1_result.html



<?php
session_start();
if(isset($_POST))
{
if(isset($_POST["confirm_add"]))
{
header("location: mail1_result.html");
}
if(isset($_POST["back"]))
{
header("location: mail1.html");
}
}

?>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>フォーム</title>


</head>


<body>
<table width="100" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><img src="img/top.gif" width="584" height="43" /></td>
</tr>
<tr>
<td background="img/bg.gif">

<div style="padding:0px 30px 0px 40px">


<p align="right" class="style4" style="margin-right:20px">吉村紳一先生への相談フォーム</p>
<table width="200" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="2" bgcolor="#175600">&nbsp;</td>
<td style="padding:15px 0px 15px 10px"><span class="style9">診察希望フォーム</span></td>
</tr>
</table>
<p class="style1"><br />
</p>
<div align="left" class="style10" style="width:450px; margin-left:40px">
<?php
if(isset($_GET["res"]) && $_GET["res"])
echo "ありがとうございました。";
else
{
echo "<p>メール送信エラー</p>";
echo "<p>メール送信することができませんでした。お手数をおかけします。もう一度最初から入力をお願い致します。</p>";
}
?>
</div>
<p></p>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><a href="javascript:window.close();" class="style4">X 閉じる </a></td>
</tr>
</table>
</div>
<div align="center"><img src="img/bottontxt.gif" width="513" height="35" /></div></td>
</tr>
<tr>
<td><img src="img/bott.gif" width="584" height="40" /></td>
</tr>
</table>
</body>
</html>


//////////////////////////////////////////////////////////


お願い、分かる方がいれば教えてください。 :'(

問題は件名だけです。


宜しくお願いします。
会員
登録者: 8 2009
返信数: 103
こんにちは、
ソースだけでは再現のしようがない場合があります。
os、phpのバージョン
などの環境を最低限提示してください。

> 件名だけはちゃんと日本語になりません。
何の件名でしょうか?
メールのSubjectですか?
メールのSubjectという話で進めます。
こちらの環境では「ホームページからのメッセージ」と表示されています。
つまり正常です。
”ちゃんと日本語になりません。”はどういう状態になるのですか?
肝心な情報がないと検証できません。
そもそもメールのSubjectの話なのか……



# こちらもあえて検証した環境を伏せておきます。
会員
登録者: 2 2010
返信数: 4
nullaさん、返事ありがとうございます。
多分、使っているサーバーの問題かもしれませんが、
そのフォームから送信をすると”件名”だけ(SUBJECT)は
こんな感じで届きます:

=?ISO-2022-JP?B?GyRCJVshPCVgJVohPCU4JCskaSROJWElQyU7ITwlOBsoQg==?=

後は全部ちゃんと日本語になってます。
変更が出来る方法が無いでしょうか? :'(

宜しくお願いします
会員
登録者: 8 2009
返信数: 103
○○というメーラを使っていて件名には○○と表示されてしまいます。
という情報に期待したのですが…。
お使いのメーラは何ですか?

> =?ISO-2022-JP?B?GyRCJVshPCVgJVohPCU4JCskaSROJWElQyU7ITwlOBsoQg==?=
そのメールのソースがこうなっているのなら正常です。
メーラで読み込んだときデコードされて「ホームページからのメッセージ」と表示されます。
というかこちらの環境では正常に表示されています。
今時Subjectをデコードできないメーラを使っているわけではないですよね?

個人情報を伏せたメールのソースを提示してみてください。



Subject: =?ISO-2022-JP?B?PT9JU08tMjAyMi1KUD9CP0d5UkNKVnNoUENWZ0pWb2hQQ1U0SkNza2FT?=
=?ISO-2022-JP?B?Uk9KV0VsUXlVN0lUd2xPQnNvUWc9PT89?=



# 私の書き込みちゃんと読んでくれてるのかな?
# 予測と感で書き込むのはとても疲れます。
# ここの文章は余計でしたね。申し訳ありません。
« 最終編集者 nulla 日時 2010 年 2 月 13 日(土) 15:51. »
会員
登録者: 8 2009
返信数: 103
そういえばmbstring.func_overloadが設定されているとmail関数が自動的にマルチバイト関数に置き換わるような…。
$subjectだけmb_encode_mimeheader()しないで送信したらどうなるでしょう?
会員
登録者: 8 2009
返信数: 103
mbstring.func_overload = 1
件名が2回エンコードされる現象を再現できました。

$subjectはmb_convert_encoding()とmb_encode_mimeheader()しない。
$bodyはmb_convert_encoding()しない。
mail関数ではなくmb_send_mail関数を使用する。

これで大丈夫だと思いますが脆弱性が残っているので塞いでください。
会員
登録者: 2 2010
返信数: 4
nullaさん、返事ありがとうございました、

さっきの言ったとうりにしましたが、SUBJECTとBODY(mailno内容)は文字化けになりました。
ちなみに、これを書きました。

";

$_SESSION["name"] = "";
$_SESSION["email"] = "";
$_SESSION["place5"] = "";

if(_mail($to, $subject, $body, $from_email,$from_name))
header("location: mail1_result.html?res=1");
else
header("location: mail1_result.html?res=0");

}
if(isset($_POST["back"]))
{
header("location: mail1.html");
}
}

function _mail($to, $subject, $body, $from_email,$from_name)
{
mb_language("ja");

$from_name = mb_convert_encoding($from_name, "ISO-2022-JP","AUTO");
$from_name = mb_encode_mimeheader($from_name);

$headers = "MIME-Version: 1.0 \n" ;
$headers .= "From: " .
"".$from_name ."" .
"<".$from_email."> \n";
$headers .= "Reply-To: " .
"".$from_name ."" .
"<".$from_email."> \n";

$headers .= "Content-Type: text/plain;charset=ISO-2022-JP \n";
$sendmail_params = "-f$from_email";
$result = mb_send_mail($to, $subject, $body, $headers, $sendmail_params);
return $result;
}

?>
会員
登録者: 8 2009
返信数: 103
おはようございます。

こちらではこのように変更しました。

";

$_SESSION["name"] = "";
$_SESSION["email"] = "";
$_SESSION["place5"] = "";

if(_mail($to, $subject, $body, $from_email,$from_name))
header("location: mail1_result.php?res=1");
else
header("location: mail1_result.php?res=0");

}
if(isset($_POST["back"]))
{
header("location: mail1.php");
}
}

function _mail($to, $subject, $body, $from_email,$from_name)
{
mb_language("ja");
// $subject = mb_convert_encoding($subject, "ISO-2022-JP","AUTO");
// $subject = mb_encode_mimeheader($subject);

$from_name = mb_convert_encoding($from_name, "ISO-2022-JP","AUTO");
$from_name = mb_encode_mimeheader($from_name);

$headers = "MIME-Version: 1.0 \n" ;
$headers .= "From: " .
"".$from_name ."" .
"<".$from_email."> \n";
$headers .= "Reply-To: " .
"".$from_name ."" .
"<".$from_email."> \n";

$headers .= "Content-Type: text/plain;charset=ISO-2022-JP \n";
// $body = mb_convert_encoding($body, "ISO-2022-JP","AUTO");
$sendmail_params = "-f$from_email";
$result = mb_send_mail($to, $subject, $body, $headers, $sendmail_params);
// $result = mail($to, $subject, $body, $headers, $sendmail_params);
return $result;
}

?>


やはり環境がわからないと予測と感を駆使しても無理ですね。
ちなみにこちらの環境は
*server
CentOS 5.4
Apache-2.2.3
php-5.2.10(cgi)

php.iniマルチバイト関係抜粋
[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = utf-8
mbstring.http_input = pass
mbstring.http_output = pass
mbstring.encoding_translation = Off
mbstring.detect_order = utf-8,sjis,euc-jp,jis,ascii

*client
Mozilla Thunderbird-3.0.1

この環境では最初のソースで正常動作します。


php.iniにmbstring.func_overload = 1
を追記するとこの記事のソースで正常です。
(拡張子htmlでphpを動作するようになっていないので拡張子はphpにしてます)

# 単に「文字化けになりました」と書かれてもこちらには何も伝わりません。
# 回答者は質問者の環境や不具合の具体的な内容を知らなければ答えようがないということを理解してください。
# ご使用の環境を提示されない限り私からの回答はこれが最後になります。
会員
登録者: 2 2010
返信数: 4
nullaさん、メッセージありがとうございます。
nullaさんが書いたとおりでファイルを変更しました(copy-paste)が、
今回これで件名と中身(body)も文字化けになってしまいました。
私は普通のウェブデザイナーで、システムが分からなくて、後、サーバーにあるphp.iniとかHTACCSESSをなぶる事が出来ませんので、ただ上に書いたコードで直さないといけない。
本当にありがとう、でもやぱりこの状態で直す方法が無いみたいね。
会員
登録者: 8 2009
返信数: 103
こんにちは、

環境を知る方法はいくらでもあります。
あなたの依頼人?に聞くとか下記のソースなど。

<?php
phpinfo();
?>

最近のデザイナは環境を知らされずに作成させられるのでしょうか…。

# なんとかの情けというやつです。

ページ: 1

日本PHPユーザ会 掲示板 » PHP事はじめ » 助けてください!

日本PHPユーザ会 掲示板 は UseBB 1 フォーラムソフトウェア を使用しています