PHPでシンプルなメールフォームを作る方法(確認画面あり/なし)

今回はPHPでシンプルなメールフォームを作る方法を解説します。

確認画面あり/なしの2パターン作ります。

 

 確認画面なしのPHPメールフォーム

確認画面なしでPHPメールフォームを作る方法です。

入力フォーム画面がindex.html、メール送信完了画面がmail.phpです。

この2つのファイルさえあればとりあえずPHPでメールフォームを作ることはできます。

index.htmlにはphpは記述しないので、htmlファイルで構いません。

index.html

<div class="tb-cell mail-form">
<form id="form" action="mail.php" method="post">
<div class="row">
<div class="cell">
<label>name</label>
<!--cell--></div>
<div class="cell">
<input type="text" name="name" required>
<!--cell--></div>
<!--row--></div>
<div class="row">
<div class="cell">
<label>email</label>
<!--cell--></div>
<div class="cell">
<input type="email" name="email" required>
<!--cell--></div>
<!--row--></div>
<div class="row">
<div class="cell">
<label>comment</label>
<!--cell--></div>
<div class="cell">
<textarea name="comment" required></textarea>
<!--cell--></div>
<!--row--></div>
<div class="row">
<div class="cell">
&nbsp;
<!--cell--></div>
<div class="cell">
<button type="submit" id="sbtn" name="action" value="post">送 信</button>
<button type="reset" id="rbtn">リセット</button>
<!--cell--></div>
<!--row--></div>
</form>
<!--tb-cell--></div>

 

mail.php

<?php
$action = $_POST['action'];
$name = htmlspecialchars($_POST['name']);
$email = htmlspecialchars($_POST['email']);
$comment = htmlspecialchars($_POST['comment']);
$to = '受診するメールアドレスを入力';
$subject = 'form-mail-sample-1';
$message = '[お名前]'."\n".$name."\n";
$message .= '[email]'."\n".$email."\n";
$message .= '[コメント]'."\n".$comment."\n\n\n";
$header = 'From: '.$email."\r\n";
$header .= 'Reply-To: '.$email."\r\n";
if($action == "post"){
$status = mb_send_mail($to, $subject, $message, $header);
if ($status) {
echo '<p class="msg">メッセージは正常に送信されました</p>';
echo '<button type="button" onclick="history.go(-1)">入力フォームに戻る</button>';
} else {
echo '<p class="msg">メッセージの送信に失敗しました</p>';
echo '<button type="button" onclick="history.go(-1)">入力フォームに戻る</button>';
}
}
?>

 

name,email,commentにそれぞれエラーがなければ($statusがtrueなら)「メッセージが送信されました」と表示され、メールが正しく送信されます。

エラーの場合はelseの方を出力し、「メッセージの送信に失敗しました」と表示します。

 

CSSでスタイルを整えるとよりそれっぽくなると思います。

 

 確認画面ありのPHPメールフォーム

こちらも入力フォームがindex.html、メール送信がmail.phpです。

index.html

<div class="tb-cell mail-form">
<form id="form" action="mail.php" method="post">
<div class="row">
<div class="cell">
<label>name</label>
<!--cell--></div>
<div class="cell">
<input type="text" name="name" required>
<!--cell--></div>
<!--row--></div>
<div class="row">
<div class="cell">
<label>email</label>
<!--cell--></div>
<div class="cell">
<input type="email" name="email" required>
<!--cell--></div>
<!--row--></div>
<div class="row">
<div class="cell">
<label>comment</label>
<!--cell--></div>
<div class="cell">
<textarea name="comment" required></textarea>
<!--cell--></div>
<!--row--></div>
<div class="row">
<div class="cell">
&nbsp;
<!--cell--></div>
<div class="cell">
<button type="submit" id="sbtn" name="action" value="post">入力内容を確認</button>
<button type="reset" id="rbtn">リセット</button>
<!--cell--></div>
<!--row--></div>
</form>
<!--tb-cell--></div>

 

mail.php

/*<html>タグの前に記述*/
<?php 
if(!$_POST){
header('Location: /');
}
session_start();
if(isset($_POST['name'],$_POST['email'],$_POST['comment'])){
$_SESSION['name'] = $_POST['name'];
$_SESSION['email'] = $_POST['email'];
$_SESSION['comment'] = $_POST['comment'];
}
?>
/*<body>内に記述*/
<?php
$action = $_POST['action'];
$name = htmlspecialchars($_SESSION['name']);
$email = htmlspecialchars($_SESSION['email']);
$comment = htmlspecialchars($_SESSION['comment']);
$to = '受診するメールアドレスを入力';
$subject = 'form-mail-sample-2';
$message = '[お名前]'."\n".$name."\n";
$message .= '[email]'."\n".$email."\n";
$message .= '[コメント]'."\n".$comment."\n\n\n";
$header = 'From: '.$email."\r\n";
$header .= 'Reply-To: '.$email."\r\n";
if($action == "post"){
echo '<div class="tb-cell mail-form">';
echo '<form id="form" action="mail.php" method="post">';
echo '<div class="row">';
echo '<div class="cell">';
echo '<label>name</label>';
echo '<!--cell--></div>';
echo '<div class="cell">';
echo $_SESSION['name'];
echo '<!--cell--></div>';
echo '<!--row--></div>';
echo '<div class="row">';
echo '<div class="cell">';
echo '<label>email</label>';
echo '<!--cell--></div>';
echo '<div class="cell">';
echo $_SESSION['email'];
echo '<!--cell--></div>';
echo '<!--row--></div>';
echo '<div class="row">';
echo '<div class="cell">';
echo '<label>comment</label>';
echo '<!--cell--></div>';
echo '<div class="cell">';
echo $_SESSION['comment'];
echo '<!--cell--></div>';
echo '<!--row--></div>';
echo '<div class="row">';
echo '<div class="cell">';
echo '&nbsp;';
echo '<!--cell--></div>';
echo '<div class="cell">';
echo '<p>入力内容が正しければ送信してください</p><br>';
echo '<button type="submit" id="sbtn" name="action" value="send">送 信</button>';
echo '<button type="button" onclick="history.go(-1)">入力フォームに戻る</button>';
echo '<!--cell--></div>';
echo '<!--row--></div>';
echo '</form>';
echo '<!--tb-cell--></div>';
}elseif($action == "send"){
$status = mb_send_mail($to, $subject, $message, $header);
if ($status) {
echo '<p class="msg">メッセージは正常に送信されました</p>';
echo '<button type="button" onclick="history.go(-2)">入力フォームに戻る</button>';
} else {
echo '<p class="msg">メッセージの送信に失敗しました</p>';
echo '<button type="button" onclick="history.go(-2)">入力フォームに戻る</button>';
}
$_SESSION = array();
session_destroy();
}
?>

 

一度入力内容を確認し、内容が正しければ送信ボタンを押します。するとメールが送られます。

エラーの場合はさっきと同様elseの方が表示され、メールは送信しません。

 

その他

2回入力して確認する

メールアドレスを2回入力し、それぞれが同じかどうかを確認するスクリプトです。

以下の内容をJavaScriptに記述するか、</body>前に記述しちゃってください。

<script>
function mailcheck(){
var mail = email.value;
var mail2 = email2.value;
if(mail != mail2){
email2.setCustomValidity('メールアドレスが一致しません');
}else{
email2.setCustomValidity('');
}
}
var sn = document.getElementById('email2');
sn.addEventListener('input',mailcheck,false);
</script>

 

仕組みはシンプルで、1回目と2回目に入力された値が違う場合はエラーを出力、一致すればイベント処理を行うというものです。

また、これを実装する際はindex.htmlのメールアドレス入力欄を2つ用意してください。元からあるメールアドレス欄のIDはemail、追加するメールアドレス欄のIDはemail2とかにするとわかりやすいです。

その他の情報も取得

メールの送信された時間、IPアドレス、ホスト名なども取得したい場合は以下のように記述すればokです。

$agent = getenv("HTTP_USER_AGENT");
$host = getenv("REMOTE_HOST");
$addr = getenv("REMOTE_ADDR");
if($host == "" || $host == $addr){$host = @gethostbyaddr($addr);}
$date = gmdate("Y/m/d H:i:s (D)",time()+9*60*60);
$message .= '[投稿時間]'."\n".$date."\n";
$message .= '[IPアドレス]'."\n".$addr."\n";
$message .= '[ホスト名]'."\n".$host."\n";
$message .= '[ブラウザ・OS]'."\n".$agent."\n\n";

 

getenv()で環境変数を取得し、$messageにつなげていくだけです。