前回に画像をアップした「メルマガ登録フォーム」。
その中で、実際に名前とメールアドレスを入力する「フォーム」と
入力した内容を自身のメールで受け取るための「PHPプログラム」。
それぞれの内容を下にアップします。
今回は、セキュリティーを強化しました。
URLはスマホの「Edge」か「Google Chrome」でないと上手く表示されません。
あなたが、他の項目も追加したい場合は、コピペして、
その項目を追加してやるだけで「自分の得たい見込み客からの情報」
がメールで送られてきます。
mailForm.php
<?php
session_start();
//クリックジャッキング対策
header('X-FRAME-OPTIONS: SAMEORIGIN');
// トークン生成(CSRF対策)
if (!isset($_SESSION['token'])) {
$_SESSION['token'] = sha1(random_bytes(30));
}
// HTML特殊文字をエスケープする関数
function escape($str) {
return htmlspecialchars($str,ENT_QUOTES,'UTF-8');
}
?>
<html>
<title>メルマガ登録フォーム</title>
<head>
<meta charset="utf-8"/>
<style>
body {
background-image: url("img/roman-holiday.png");
background-repeat:no-repeat;
background-size:cover;
}
input.example{ width: 200%; }
.txt1{font-size: 2.5rem;}
</style>
</head>
<body>
<center>
<h1>メルマガ登録</h1>
<div class="comment">
<form action="mailConfirm2.php" method="POST">
<div class="wrapper">
<div class="txt1">Name<span style="color:red">(必須)</span></div>
<div>
<input type="text" name="name" class="txt1" placeholder="全角20文字以内" required>
</div>
</div>
<div class="wrapper">
<div class="txt1">Contact<span class="txt1" style="color:red">(必須)</span></div>
<div>
<input id="contact_mail" name="adress_mail" type="text" class="txt1" placeholder="Mail(半角30文字以内)">
</div>
</div>
<div class="wrapper">
<div class="txt1">Comment<span class="txt1" style="color:red">(必須)</span></div>
<div class="insert">
<textarea name="comment" class="txt1" placeholder="全角200文字以内" required></textarea>
</div>
</div>
<input type="hidden" name="token" value="<?=$_SESSION['token']?>">
<div class="submit">
<input class="txt1" type="submit" value="送信">
</div>
</form>
</div>
</center>
</body>
</html>
mailConfirm.php
<?php
session_start();
//クリックジャッキング対策
header('X-FRAME-OPTIONS: SAMEORIGIN');
// HTML特殊文字をエスケープする関数
function escape($str) {
return htmlspecialchars($str,ENT_QUOTES,'UTF-8');
}
//前後にある半角全角スペースを削除する関数
function spaceTrim ($str) {
// 行頭
$str = preg_replace('/^[ ]+/u', '', $str);
// 末尾
$str = preg_replace('/[ ]+$/u', '', $str);
return $str;
}
//tokenを変数に入れる
$token = $_POST['token'];
// トークンを確認し、確認画面を表示
if(!(hash_equals($token, $_SESSION['token']) && !empty($token))) {
echo "不正アクセスの可能性があります";
exit();
}
//POSTされたデータを各変数に入れる
$name = isset($_POST['name']) ? $_POST['name'] : NULL;
$mail = isset($_POST['adress_mail']) ? $_POST['adress_mail'] : NULL;
$comment = isset($_POST['comment']) ? $_POST['comment'] : NULL;
//前後にある半角全角スペースを削除
$name = spaceTrim($name);
$mail = spaceTrim($mail);
$comment = spaceTrim($comment);
//名前入力判定
if ($name == ''){
$errors['name'] = "名前が入力されていません。";
}
//メール入力判定
if ($mail == ''){
$errors['mail'] = "メールが入力されていません。";
}
//コメント入力判定
if ($comment == ''){
$errors['comment'] = "コメントが入力されていません。";
}
//エラーが無ければセッションに登録
if(count($errors) === 0){
$_SESSION['name'] = $name;
$_SESSION['mail'] = $mail;
$_SESSION['comment'] = $comment;
}
?>
<html>
<head>
<title>確認ページ</title>
<meta charset="utf-8"/>
<style>
body {
background-image: url("img/roman-holiday.png");
background-repeat:no-repeat;
background-size:cover;
}
input.example{ width: 200%; }
.txt1{font-size: 2.5rem;}
</style>
</head>
<body>
<center>
<form method="post" action="mailSend.php">
<table>
<tr>
<th class="txt1">お名前</th>
<td class="txt1"><?php echo escape($name); ?></td>
</tr>
<tr>
<th class="txt1">メールアドレス</th>
<td class="txt1"><?php echo escape($mail); ?></td>
</tr>
<tr>
<th class="txt1">ご要望・その他</th>
<td class="txt1"><?php echo nl2br(escape($comment)); ?></td>
</tr>
</table>
<input class="txt1" type="button" value="戻る" onClick="history.back()">
<input type="hidden" name="token" value= <?php echo escape($token); ?>>
<button class="txt1">送信</button>
</form>
</center>
</body>
</html>
mailSend.php
<?php
session_start();
//クリックジャッキング対策
header('X-FRAME-OPTIONS: SAMEORIGIN');
// HTML特殊文字をエスケープする関数
function escape($str) {
return htmlspecialchars($str,ENT_QUOTES,'UTF-8');
}
//前後にある半角全角スペースを削除する関数
function spaceTrim ($str) {
// 行頭
$str = preg_replace('/^[ ]+/u', '', $str);
// 末尾
$str = preg_replace('/[ ]+$/u', '', $str);
return $str;
}
//tokenを変数に入れる
$token = $_POST['token'];
?>
<html>
<head>
<title>送信ページ</title>
<meta charset="utf-8"/>
<style>
body {
background-image: url("img/roman-holiday.png");
background-repeat:no-repeat;
background-size:cover;
}
input.example{ width: 200%; }
.txt1{font-size: 2.5rem;}
</style>
</head>
<body>
<center class="txt1">
<?php
$to = 'xxxxxxx@gmail.com';
mb_language('japanese');
mb_internal_encoding('UTF-8');
$from = $_SESSION['mail'];
$mail = $_SESSION['mail'];
$name = $_SESSION['name'];
$comment = $_SESSION['comment'];
$headers = 'xxxxxx@e3.valueserver.jp'
$subject = 'メルマガ登録';
$body = $comment. "\n". $name. "\n". $mail;
$success = mb_send_mail($to, $subject, $body, 'From: '.$from);
?>
<div id="tyMessage">
<?php if ($success) : ?>
登録が完了しました!
<?php else : ?>
申し訳ありません。エラーのため登録出来ませんでした。<br>
<?php endif; ?>
<a href="registration.php">Homeに戻る</a><br>
</div>
</center>
</body>
</html>