メールフォーム

今回のメールフォームはフォーム入力ページ→内容確認ページ→送信処理ページ→終了メッセージ表示ページと遷移するものを作成します。フォーム入力ページ→内容確認ページへPOSTで送信された値をセッションに格納し、入力された値をを持ちまわります。まずはフォーム入力画面となる「index.php」を作成します。HTMLの部分は各々で作成してください。また、今回は処理ごとにページを分けましたがHTMLのフォーム部品に<input type="hidden" name="operation" value="…">などと記述し、if構文による条件分岐によって1ページにまとめることも可能です。

フォーム入力画面

まずはフォーム入力画面を「index.php」というファイル名で作成します。ほとんど部分はHTMLで書かれていますが、セッションで値を保持している場合にその値を表示させるためにHTML内にPHPタグを挿入してecho関数を記述しています。

スクリプト

<?php
	ini_set('session.use_only_cookies', 1);
	ini_set('session.use_cookies', 1);
	ini_set('session.use_trans_sid', 0);
	session_start(); //HTML出力より前に記述するようにしてください。
?>
	<form method="post" action="post.php">
	<dl>
	<dt><label for="name">お名前</label></dt>
	<dd><input type="text" name="name" id="name" size="20" \
	value="<?php echo htmlspecialchars($_SESSION['name'], ENT_QUOTES); ?>" /></dd>
	<dt><label for="mail">メールアドレス</label></dt>
	<dd><input type="text" name="mail" id="mail" size="40" \
	value="<?php echo htmlspecialchars($_SESSION['mail'], ENT_QUOTES); ?>" /&></dd>
	<dt><label for="subject">件名</label></dt>
	<dd><input type="text" name="subject" id="subject" size="40" \
	value="<?php echo htmlspecialchars($_SESSION['subject'], ENT_QUOTES); ?>" /></dd>
	<dt><label for="body">本文</label></dt>
	<dd><textarea name="body" id="body" cols="60" rows="20">\
	<?php echo htmlspecialchars($_SESSION['body'], ENT_QUOTES); ?></textarea></dd>
	</dl>
	<p><input type="submit" value="確認する" /> <input type="reset" value="取り消す" /></p>
	<form>

解説

ini_set("session.use_only_cookies", 1)
ini_set関数でPHPの設定オプションの変更を行います。この場合はセッションはcookieのみを使用するよう設定しています。
ini_set("session.use_cookies", 1)
セッションはcookieを使用するよう設定しています。
ini_set("session.use_trans_sid", 0)
セッションIDをURLに表示させないよう設定しています。
session_start()
セッションを有効にしています。HTMLが出力される前に宣言する必要があります。
<?php echo htmlspecialchars($_SESSION['name']); >
HTMLの中にPHPを記述しています。確認画面から戻ってきた際に、一度入力した値がセッションに格納されているので、echo関数でその値が表示されるよう記述しています。また、セッションに格納された値を表示させるにあたり、htmlspecialchars関数を使用しHTMLの特殊文字を変換しています。これを怠るとJavaスクリプトを実行されてしまったりなど色々と面倒なことになるので、フォームから送信された値を表示さする際は必ずこの手の処理は実行してください。なお、2番目の引数の「ENT_QUOTES」を指定することでシングルクォート変換の対象となります。

確認画面

フォームから送信された値は$_POST['<フォーム部品の名前>']というグローバル変数で取得することが可能です。このページでは、フォームから送信された値を$_SESSIONというグローバル変数に格納し、どのページからでも呼び出しを可能にしています。一度$_SESSIONに格納された値は、利用者がブラウザを閉じるか、スクリプト側で意図的に破棄するまで保持されます。なお、このページは「post.php」という名前で保存しています。

スクリプト

<?php
	ini_set('session.use_only_cookies', 1);
	ini_set('session.use_cookies', 1);
	ini_set('session.use_trans_sid', 0);
	session_start(); //HTML出力より前に記述するようにしてください。
	$_SESSION['name'] = $_POST['name'];
	$_SESSION['mail'] = $_POST['mail'];
	$_SESSION['subject'] = $_POST['subject'];
	$_SESSION['body'] = $_POST['body'];
	if($_SESSION['name'] == ""){
		echo '<p>Error!お名前をご入力ください</p>';
		echo '<p><a href="index.php">戻る</a></p>';
	}elseif($_SESSION['mail'] == ""){
		echo '<p>Error!メールアドレスをご入力ください</p>';
		echo '<p><a href="index.php">戻る</a></p>';
	}elseif(!ereg('^[a-zA-Z0-9_\.-]+@[a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4}$', $_SESSION['mail'])){
		echo '<p>Error!メールアドレスが不正です。</p>';
		echo '<p><a href="index.php">戻る</a></p>';
	}elseif($_SESSION['subject'] == ""){
		echo '<p>Error!件名をご入力ください</p>';
		echo '<p><a href="index.php">戻る</a></p>';
	}elseif($_SESSION['body'] == ""){
		echo "<p>Error!本文をご入力ください</p>";
		echo '<p><a href="index.php">戻る</a></p>';
	}else{
?>
	<form method="post" action="send.php">
	<dl>
	<dt>お名前</dt>
	<dd><?php echo htmlspecialchars($_SESSION['name'], ENT_QUOTES); ?></dd>
	<dt>メールアドレス</dt>
	<dd><?php echo htmlspecialchars($_SESSION['mail'], ENT_QUOTES); ?></dd>
	<dt>件名</dt>
	<dd><?php echo htmlspecialchars($_SESSION['subject'], ENT_QUOTES); ?></dd>
	<dt>本文</dt>
	<dd><?php echo htmlspecialchars($_SESSION['body'], ENT_QUOTES); ?></dd>
	</dl>
	<p><input type="submit" value="送信する" /> \
	<input type="button" value="訂正する" onclick="history.back()" /></p>
	</form>
<?php
	}
?>

解説

$_SESSION['…'] = $_POST['…']
フォームから送信された値をセッションに格納しています。
if($_SESSION['…'] == "")
値が入力されているかどうか判定し、入力されていない場合はエラー文を出力するように設定しています。
elseif(!ereg("^[a-zA-Z0-9_\.-]+@[a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4}$",$_SESSION['mail'])
正規表現を利用してメールアドレスが正しい形式で入力されているかどうかを判定しています。正規表現については、後日解説いたします。
else{ ?> … <?php }
すべての値が入力され、かつメールアドレスの形式が正しい場合に入力内容が表示される画面を出力する処理を記述しています。ここでは一旦PHPから抜け出し、HTMLとして記述していますが、このような書き方も可能です。

送信処理完了画面

実際に送信処理をするページとなります。メールの送信自体は手順どおりに記述すればそれほど難しくないのですが、問題はどちらかというとセッション情報の破棄に関連する処理です。この処理の一部にHTMLより先に記述することのできない関数(setcookie関数)があるので、今回は送信成功または失敗メッセージを出力するページをリダイレクトさせる方法を選択しています。そのほかの方法としては、「header.php」「footer.php」などのテンプレートを作成しておいてsetcookie関数の後に制御構造のincludeなどで呼び出すか、Smartyなどのテンプレートツールを利用する方法も考えられます。

スクリプト

<?php
	ini_set('session.use_only_cookies', 1);
	ini_set('session.use_cookies', 1);
	ini_set('session.use_trans_sid', 0);
	session_start();
	$to = 'hoge@example.com';
	$name = $_SESSION['name'];
	$mail = $_SESSION['mail'];
	$subject = $_SESSION['subject'];
	$body = $_SESSION['body'];
	$header = 'From: $mail';
	mb_language('Japanese');
	mb_internal_encoding('EUC-JP');
	if(mb_send_mail($to, $subject, $body, $header)){
		$_SESSION = array();
		if(isset($_COOKIE['PHPSESSID'])){
			setcookie('PHPSESSID', '', time() - 1800, '/');
		}
		session_destroy();
		header('Location: ./success.php');
	}else{
		header('Location: ./error.php');
	}
?>

解説

$to = 'hoge@example.com';
宛先のメールアドレスを変数「$to」に代入しています。
$name = $_SESSION['…']
$_SESSION['…']に格納された値をそれぞれ変数に代入しています。
$header = 'From: $mail'
メールヘッダに付加される差出人情報を変数「$header」に代入しています。
mb_language("Japanese")
メールをエンコードする際の言語を指定しています。
mb_internal_encoding('EUC-JP')
PHPで使用している日本語のエンコードを指定してします。
mb_send_mail($to, $subject, $body, $header)
マルチバイト文字列を使用してメール送信する関数がmb_send_mail関数です。引数は宛先、件名、本文、ヘッダの順になっています。
$_SESSION = array();
ここからはセッションを破棄するための処理になります。メールの送信に成功した際に、「$_SESSION」を空にしています。
if(isset($_COOKIE['PHPSESSID'])){ … }
グローバル変数「$_COOKIE['PHPSESSID']」がセットされているかの判定をしています。
setcookie('PHPSESSID', '', time() - 1800, '/')
$_COOKIE['PHPSESSID']がセットされているようであれば、有効期限を現在の時刻より過去の時刻に設定し、クッキーを無効にしています。引数はクッキー名、クッキーの値、有効期限、サーバ上で有効になるクッキーのパスになります。
session_destroy()
現在のセッションに 関連づけられたすべてのデータを破棄します。
header("Location: ./success.php")
送信が完了した旨が記述されているページにリダイレクトします。
header("Location: ./error.html")
送信が失敗した旨が記述されているページにリダイレクトします。

▲ページトップに戻る