メールフォームと $_SESSION

メールを送信するときのポイント

  1. hidden属性にはセキュリティの問題があるため、$_SESSIONを使う
  2. send-mail関数を使い、メールを自動返信する
  3. 入力チェックをして、未入力処理をする
hidden フィールドの問題点
  • hidden フィールドは、見た目を隠しているだけ
  • ブラウザのソースコードで入力内容を見ることができる

$_SESSION とは

  • ユーザーから中身を見ることができない便利な「箱」
  • この「箱」が $_SESSION とという特殊な変数です
  • Webアプリケーションでは、アプリケーションを使い始めるときから使い終わった時までをひと続き(1つのセッション)だと考えます
  • $_POST から受け取った入力値を $_SESSION に格納するだけで、アプリケーション全体のページ入力値を参照・変更できるようになります
$_SESSION の使い方
  • 「セッション変数の使用を開始します」と宣言する必要があります
  • 「session_start関数」を有効化します
  • 「session_start関数」はそのページで画面に何らかの文字列を表示する前、そしてHTMLタグが始まる前に実行する必要があります
<?php
session_start();
 ・・・
$name = $_POST[ 'name' ];
 ・・・
$_SESSION[ 'name' ] = $name;

入力内容のチェック

  • PHP関数を使って $_POST の中身をチェックする
<?php
// フォームデータが空の場合は処理終了
if ( empty($_POST[ 'name' ]) ) {
    print "お名前を入力してください。";
    exit;
}
  • 「if ( empty($_POST[ 'name' ]) )」は「if ( empty($_POST[ 'name' ]) == true )」を省略した記述方法です
  • 「名前(name)が空だった場合は」という条件で、名前が記入されているかどうかをチェックします

安全面のチェック

  • 危険な値を「洗浄する」という発想
  • 危険な値を安全にする作業は「サニタイズ(洗浄)」と呼ばれます
<?php
$name = htmlspecialchars( $_POST[ 'name' ], ENT_QUOTES, 'UTF-8' );
$email = htmlspecialchars( $_POST[ 'email' ], ENT_QUOTES, 'UTF-8' );
$message = htmlspecialchars( $_POST[ 'message' ], ENT_QUOTES, 'UTF-8' );
PHP関数の短縮形
  • 1文字の関数名でユーザー定義関数を作成する
<?php
function h( $a ) {
    return htmlspecialchars( $a, ENT_QUOTES, 'UTF-8' );
}
$b = h( $a );

mb_send_mail関数

  • 「日本語」のメール送信に役立つPHP関数
  • 「mb_send_mail(送信先, タイトル, 本文, 追加ヘッダー)」というパラメータで実行します
  • 「追加ヘッダー」には、送信元を指定するのが典型的なパターンです
<?php

$to = 'クライアントメールアドレス, $email';
$title = '【メールフォームより】';
$subject = 'お問い合せを受け付けました。';
$ext_header = 'From: $email';
$body =  'メール本文';
$rc = mb_send_mail( $to, $title, $body, $ext_header );
メール送信にはメールサーバーが必要
  • 外部メールサーバー(レンタルサーバー)を使う方法が後々役に立ちます
  • ローカルでの設定は「php.ini」を編集しますが、ここでは割愛します
長いメール本文を組み立てる
  • 「ヒアドキュメント(here document)」を使う
  • ヒアドキュメントは、名前をつけた文字列を出力する



print <<< 開始ID


終端ID;


開始IDの注意点

  1. 開始IDの前後に全角空白があるとIDはその空白も含めたものになる
  2. 開始IDの後ろにタブと半角スペースは入れられない
  3. <<< とIDの間にはタブと半角スペースを入れられる
  4. 開始IDの後ろにはコメントもつけられない


終端IDの注意点

  1. 終端IDは必ず行頭に置かなくてはならない
  2. 終端IDの行には「;」(セミコロン)以外置いてはならない
  3. タブやスペースでのインデントもセミコロンの前後に空白も不可
  4. コメントもつけられない