考え、感じる、Web制作。

Web制作の学習や情報についての記事が中心です。

php 自作メールフォーム

メールフォームを一から作る

メールフォームの自作を開始。基本的なエラー回避も盛り込む方向。
最初は基本的な作りで、徐々に機能を追加させていく。
入力ページ(index.php)、確認ページ(check.php)、完了ページ(thanks.php)の3ページ構成。

step1,入力ページ仕様決定

入力ページはindex.php
入力値はname,email,messageの3つ。
formで記述し、method="POST"で送る。

step2,入力ページコード記述

<body>内部の記述。

<form action="check.php" method="POST">
  <lanel for="name">name</label>
  <input type="text" name="name" id="name" size="30"><br>
  <lanel for="email">email</label>
  <input type="text" name="email" id="email" size="50"><br>
  <lanel for="message">message</label>
  <textarea name="message" id="message" rows="5" co;s="30"></textarea>
  <input type="submit" value="submit">
</form>

 

step3,確認ページ仕様決定

確認ページはcheck.php
POSTで得たname,email,messageをtableで表示させる。
「戻る」「O.K.」ボタンを付ける。

 

step4,確認ページコード記述

前処理の記述

function h($str){
$str=htmlspecialchars($str,ENT_QUOTES,"utf-8");
return$str;}

$name='';
$email='';
$message='';
$name=$_POST['name'];
$email=$_POST['email'];
$message=$_POST['message'];
session_start();
session_regenerate_id(true);
$_SESSION['mail_data']['name']=$_POST['name'];
$_SESSION['mail_data']['email']=$_POST['email'];
$_SESSION['mail_data']['message']=$_POST['message'];

 

sessionについて

sessionはページをまたいでデータのやり取りをする場合に用いる。
セッションを開始すると、データがテンポラリファイルに書き出される。
このデータは意図的に削除するかブラウザを閉じるなどすると消える。

 

session_regenerate_id(true)について

session開始により生成されたテンポラリファイルは、idを確定すると他者が閲覧可能となる。このidを毎度生成し直し、idを固定化させないことでセキュリティを向上させている。

 

連想配列にする意義性

わざわざ['mail_data']を定義しているのは、削除する際の作業性向上のためである。実際の業務では一つの変数に複数連想配列を定義することが多いと予想され、このような癖付けは作業の安全性向上にも有意である。

 

<body>内の記述

<table>
<tr>
<th>name</th>
  <td><?php print h($name);?></td>
</tr>
<tr>
  <th>email</th>
  <td><?php print h($email);?></td>
</tr>
<tr>
  <th>message</th>
  <td><?php print h($message);?></td>
</tr>
</table>
<button><a href="index.php">back</a></button>
<button><a href="thanks.php">O.K.</a></button>

 

 step5,完了ページ仕様決定

 完了ページはthanks.php

sessionで得たname,email,messageをtableで表示させる。
お礼メッセージを表示させ、「戻る」ボタンを付ける。

 

 step6,完了ページコード記述

前処理

受け側でもsession_start;とsession_regenerate_id(true)が必要。

function h($str){
$str=htmlspecialchars($str,ENT_QUOTES,"utf-8");
return$str;}

$name='';
$email='';
$message='';
session_start();
session_regenerate_id(true);
$name=h$_SESSION['mail_data']['name'];
$email=h$_SESSION['mail_data']['email];
$message=h$_SESSION['mail_data']['message'];

 

sessionとテンポラリデータ削除

リソース解放およびセキュリティの観点から、sessionデータは削除後すぐに消去すべきである。下記の記述はその際の一連の流れであり、セットで書くことが多い。

上から連想配列の消去、配列定義の破棄、クッキーの削除、セッションの破棄。

$_SESSION['mail_data']=array();
unset($_SESSION['mail_data']);
if(isset($_COOKIE[session_name()])){
  setcookie(session_name(),'',time()-42000,'/');
}
session_destroy();

 

宛先と表題

titleは任意の文字列。

$to="xxx@xxx.com";
$subject="title";

 

メール本文生成

ヒアドキュメントという手法で記述する。$bodyの中に、複数行に渡る文章を定義できる。BODYは任意だが、閉じ位置にあるBODY;と合致させること。

$body=<<<BODY
【お問い合わせメール】
以下の内容で承りました。
お名前:
{$nam}
メールアドレス:
{$eml}
メッセージ:
{$msg}
BODY;

 

メールを日本語utf-8

メールもコードと同じように日本語utf-8を定義する必要がある。

mb_language('Japanese');
mb_internal_encoding('utf-8');

 

送信エラー時の準備

送信エラー時にその旨をひょうじさせるための記述。$rには、送信が上手くいけばtrueが、そうでない場合はflaseが入る。

$r=mb_send_mail($to,$subject,$body);

 

<body>内の記述

いまだにif(!$r)の記述が見慣れない。vbaではif $r<>true then~と書くため、ぱっと見で意味が分からず、ちょっと考えてしまう。

<p>
<?php
  if(!$r){
   print'送信エラーです。お手数ですがもう一度やり直してください。';
  }else{
    '下記内容でメールを承りました。ありがとうございました。'
  }
?>
</p>

<table>
<tr>
<th>name</th>
  <td><?php print h($name);?></td>
</tr>
<tr>
  <th>email</th>
  <td><?php print h($email);?></td>
</tr>
<tr>
  <th>message</th>
  <td><?php print h($message);?></td>
</tr>
</table>
<button><a href="index.php">back</a></button>

 

長くなったが、今回はここまでにする。まだメールが送れるようになっただけ、といったところ。エラープルーフの処理をここから追記していきたい。