メールフォームの送信機能を実装

フォームから値が送信されてくることが確認できたところで、この値をメールで送信したいと思います。
新しい技術が色々出てきますが、がんばっていきましょう。

if文の利用

ここで基本的な制御構文のひとつである、if文の説明をします。

if文について

プログラムを作っていく上で、様々なタイプのif文を利用することになります。

<?php
$param = 1;
if ($param == 1) {
    echo "1です";
} else if ($param != 0) {
    echo "0以外です";
} else {
    echo "値はありません";
}

これが基本形です。
上記の例ではまず、「if ($param == 1) {」が評価されます。もし$paramが1の場合「1です」が表示されます。(上記では当然1になるわけですが)
次に、「} else if ($param != 0) {」が評価されます。
もし$paramが0以外だった場合「1以外です」が表示されます。
最後に、「} else {」が評価されます。
いずれの条件にも該当しなかったため「値はありません」が表示されます。
(else ifは複数書くことができますが、ifとelseは一連の構文で一回のみ使えます)

他のパターンとして、以下のように記載することもできます。

else ifがないケース

<?php
$param = 1;
if ($param == 1) {
    echo "1です";
} else {
    echo "値はありません";
}

ifのみのケース

<?php
$param = 1;
if ($param == 1) {
    echo "1です";
}

評価式

if文では、評価式を使って値を評価し、真(true)か偽(false)を決定します。
以下の例はすべて「真」が出力されます。

==(イコール)

両者が同じ場合に真とします。

<?php
$param1 = 1;
$param2 = 1;
if ($param1 == $param2) {
    echo "真";
} else {
    echo "偽";
}

&&(AND=両方がtrue)

両者が真の場合に真とします。

<?php
$param1 = true;
$param2 = true;
if ($param1 && $param2) {
    echo "真";
} else {
    echo "偽";
}

※trueとは真を現します。一方、falseとは偽を現します

||(OR=どちらかがtrue)

どちらかが真の場合に真とします。

<?php
$param1 = true;
$param2 = false;
if ($param1 || $param2) {
    echo "真";
} else {
    echo "偽";
}

!=(不一致)

両者が違う場合に真とします。

<?php
$param1 = "abc";
$param2 = "def";
if ($param1 != $param2) {
    echo "真";
} else {
    echo "偽";
}

変数のみ

変数が真の場合に真とします。

<?php
$param1 = true;
if ($param1) {
    echo "真";
} else {
    echo "偽";
}

変数のみ(偽)

変数が偽の場合に真とします。

<?php
$param1 = false;
if (!$param1) {
    echo "真";
} else {
    echo "偽";
}

===(厳密なイコール)

いずれ詳しく説明しますが、ここでは、『==が厳密になったバージョン』と覚えておいてください。

!==(厳密な否定)

いずれ詳しく説明しますが、ここでは、『!=が厳密になったバージョン』と覚えておいてください。

if文を使って送信モードを判別

inquiry.phpが起動したとき、「送信ボタンが押されて表示されたかケース」「トップページからのリンクなどで表示されたケース」の2種類を判別しようと思います。
そこで、PHPの制御構文であるif文を利用します。

プログラムの修正

まずはinquiry.phpの一番上に追記してください。

<?php
    if (isset($_REQUEST["send"])) {
        echo "送信モードです<br>";
        var_dump($_REQUEST);
    }
?>

全体では以下のようになります。

inquiry.php
<?php
    if (isset($_REQUEST["send"])) {
        echo "送信モードです<br>";
        var_dump($_REQUEST);
    }
?>

<?php $page_title = "お問い合わせ";?>
<?php require "header.php";?>
    <p>
      お問い合わせは以下よりお願いします
    </p>
    <form action="inquiry.php" method="post">
      <div>
        お名前<br>
        <input type="text" name="uname" size="30">
      </div>
      <div>
        メールアドレス<br>
        <input type="text" name="email" size="30">
      </div>
      <div>
        お問い合わせ内容<br>
        <textarea name="body" rows="5" cols="20"></textarea>
      </div>
      <div>
        <input type="submit" name="send" value="送信する">
      </div>
    </form>
<?php require "footer.php";?>

値を送信して確認

上記の修正を行ってからフォーム送信を行うと、画面に以下が表示されます。
if文の中に入っているのがわかります。
なお、isset(xxx)というのは、ある変数が定義されているかをチェックする関数です。

step1-060-1

関数について

関数とは、『ある別の処理を呼び出す構文』であり、『結果を取得することができる構文』でもあります。
前述の、『isset』『var_dump』のどちらも関数にあたります。
ここでは関数について説明したいと思います。

関数の使い方

大きく分けて、『戻り値がある関数』『戻り値がない関数』の2種類があります。
(PHPのマニュアルなどで、戻り値がvoidとなっているものが、戻り値がない関数となります)

戻り値のあるケース

<?php
$param = 1;
$result = isset($param);
if ($result) {
    echo "定義されています";
}

issetは、ある変数が定義されているかを調べる関数です。
上記の場合は、$resultへはtrueが入ります。
なお、戻り値を変数に入れない形で関数を呼び出すこともできます。

戻り値がないケース

<?php
$param = 1;
var_dump($param);

var_dumpは、ある変数の中身を出力する関数です。
上記の場合は、ダンプが行われるだけで、戻り値はありません。(そのため、結果を変数に代入する必要はありません)

関数の種類

組み込み関数

PHPに標準で組み込まれた関数になります。
PHP自体のバージョンや設定によって、利用できるものが変わってきます。

ユーザー関数

オリジナルで定義した関数です。
インターネットなどで配布されているライブラリなども、ユーザー関数という扱いになります。

test.php
<?php
function test_function($str){
    echo $str;
    return true;
}
$result = test_function("abc");
// abcが画面に出力され、$resultにtrueが入る

上記は$strという変数を受け取ったのち、$strを画面に出力し、結果としてtrueを返すユーザー関数のサンプルです。

引数について

<?php
$param = 1;
$result = isset($param);
if ($result) {
    echo "定義されています";
}

この例ではisset関数に$paramという変数を渡していますが、関数に渡す値のことは、引数と呼びます。複数の引数を渡す場合は、左端から、第一引数、第二引数などと表現します。(今回は、第一引数に$paramを渡しています)

配列について

配列についても触れておきます。
配列型の変数を使うことで、ひとつの変数に複数の値を持たせることができます。

配列の定義方法

$_REQUESTなどのスーパーグローバル変数の場合は自動で設定されてきますが、自分で配列を定義することもできます。
配列を定義するには、以下のような構文を使います。

一括での定義方法

<?php
$array = array(
    "uname" => "山田太郎",
    "email" => "test@example.com",
);

配列初期化後に値を追加する方法

<?php
$array = array();
$array["uname"] = "山田太郎";
$array["email"] = "test@example.com";

連想配列と通常の配列

上記は『連想配列』と呼ばれる配列の使い方になります。
PHPでは連想配列を使う機会が多いのですが、通常の配列を使う場合もあります。
通常の配列は、『文字列』の添え字ではなく、『数値』の添え字を使います。
また、数値を省略することもできます。

一括での定義方法

<?php
$array = array(
    0 => "山田太郎",
    1 => "test@example.com",
);

$array = array(
    "山田太郎",
    "test@example.com",
);

配列初期化後に値を追加する方法

<?php
$array = array();
$array[0] = "山田太郎";
$array[1] = "test@example.com";

$array = array();
$array[] = "山田太郎";
$array[] = "test@example.com";

配列の利用方法

配列の添え字を指定することで、配列の値を取り出すことができます。

 "山田太郎",
    "email" => "test@example.com",
);
echo $array["uname"]; // 山田太郎 と出力されます

多次元配列

配列は二次元だけでなく、三次元、四次元などと、多次元にできます。
$_REQUESTなどのスーパーグローバル変数も二次元配列です。

<?php
$fruits = $array(
    "apple" => array(
        "name" => "りんご",
        "color" => "red",
    ),
    "banana" => array(
        "name" => "バナナ",
        "color" => "yellow",
    ),
    "lemon" => array(
        "name" => "レモン",
        "color" => "yellow",
    ),
);
echo $fruits["apple"]["name"]; // りんご が表示される

上記は二次元配列の例です。

メール送信の実行

実際のメール送信処理の実装を行っていきます。

プログラムの修正

inquiry.phpを以下のように修正してください。
また、ソースコード内の$admin_emailにあなたのメールアドレスを代入してください。

$admin_email = "own@example.com";

(mailtodiskを有効にしてあれば、メールの内容がファイルシステムに保存されるだけですが)

inquiry.php
<?php
$page_message = ""; // ページに表示するメッセージ
if (isset($_REQUEST["send"])) {
    // 初期設定
    mb_language("japanese"); // メール送信の際のおまじない
    mb_internal_encoding("UTF-8"); // メール送信の際のおまじない
    
    // 送信本文の作成
    $mail_body = "";
    if (isset($_REQUEST["uname"])) {
        $mail_body .= "[お名前]\n";
        $mail_body .= "{$_REQUEST["uname"]}\n";
    }
    if (isset($_REQUEST["email"])) {
        $mail_body .= "[メールアドレス]\n";
        $mail_body .= "{$_REQUEST["email"]}\n";
    }
    if (isset($_REQUEST["body"])) {
        $mail_body .= "[お問い合わせ内容]\n";
        $mail_body .= "{$_REQUEST["body"]}\n";
    }
    
    // 送信実行
    $subject = "お問い合わせがありました";
    $admin_email = "own@example.com"; // あなたのメールアドレスを入力してください
    $add_header = "From:" . $admin_email;
    $result = mb_send_mail($admin_email, $subject, $mail_body, $add_header);
    
    // 完了
    $page_message = "送信しました!";
}
?>

<?php $page_title = "お問い合わせ";?>
<?php require "header.php";?>
    <p>
      <?php echo $page_message; ?>
    </p>
    <p>
      お問い合わせは以下よりお願いします
    </p>
    <form action="inquiry.php" method="post">
      <div>
        お名前<br>
        <input type="text" name="uname" size="30">
      </div>
      <div>
        メールアドレス<br>
        <input type="text" name="email" size="30">
      </div>
      <div>
        お問い合わせ内容<br>
        <textarea name="body" rows="5" cols="20"></textarea>
      </div>
      <div>
        <input type="submit" name="send" value="送信する">
      </div>
    </form>
<?php require "footer.php";?>

今回は、mb_send_mailという関数を使ってメール送信を行っています。
詳しくはこちらのmb_send_mailの公式マニュアルをご覧ください。

それでは以下に、各行を説明します。

$page_message = ""; // ページに表示するメッセージ

送信完了時のメッセージをHTMLに出力するための変数をセット(初期化)しています。

    // 初期設定
    mb_language("japanese"); // メール送信の際のおまじない
    mb_internal_encoding("UTF-8"); // メール送信の際のおまじない

利用する言語を初期化しています。メール送信の際はおきまりで設定します。

    // 送信本文の作成
    $mail_body = "";
    if (isset($_REQUEST["uname"])) {
        $mail_body .= "[お名前]\n";
        $mail_body .= "{$_REQUEST["uname"]}\n";
    }

はじめに、メール本文を作るための変数$mail_bodyを初期化します。
issetでの判定で入力値が存在したら、項目タイトルと値をセットしています。

    // 送信実行
    $subject = "お問い合わせがありました";
    $admin_email = "own@example.com"; // あなたのメールアドレスを入力してください
    $add_header = "From:" . $admin_email;
    $result = mb_send_mail($admin_email, $subject, $mail_body, $add_header);

mb_send_mail関数を使ってメール送信を実行しています。
実際のサーバでしたらインターネットへメールが送信されますが、今回はローカルファイルシステムにメール文面の書かれたファイルが生成されます。
$subjectはメール件名、
$admin_emailは管理者(あなた)のメールアドレス、
$add_headerはメールに記載される送信元名(From:に続けて書く決まりです)、
になっています。

    // 完了
    $page_message = "送信しました!";

送信したことを伝えるメッセージを$page_messageに代入します。

    <p>
      <?php echo $page_message; ?>
    </p>

送信メッセージを表示します。
$page_messageは、メール送信したときのみメッセージが代入され、初期状態では空白となります。

PHPソースのインデントについて

いまさらながらですが、PHPのインデントについて触れておきます。
プログラミングに際しては、TABでインデントする考え方と、半角スペースをつなげてインデントする考え方があります。会社やプロジェクトによって変わってきますが、当講座では『半角スペース4つ分』としています。
現在はHTMLとPHPが混在して見づらくなっていますが、最終的にはプログラムとHTMLを分離するコーディング方法にします。

メールフォームの実行

値を入力して送信すると、以下のように画面上部に『送信しました!』と表示されます。

step1-060-3

もしエラーが表示されるようでしたら、以下のページの一番下にある、mailtodiskの設定方法について確認してください。

[初級]XAMPPでPHPのデスクトップ開発環境を作る

送信されたメールの確認

今回はmailtodiskを有効にしているため、メール送信時に書き込まれたファイルを確認します。
C:\xampp\mailoutput\
を開くと、書き込まれたファイルを確認できます。

To: own@example.com
Subject: =?ISO-2022-JP?B?GyRCJCpMZCQkOWckbyQ7JCwbKEI=?=
 =?ISO-2022-JP?B?GyRCJCIkaiReJDckPxsoQg==?=
X-PHP-Originating-Script: 0:inquiry.php
From:own@example.com
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

[お名前]
山田太郎
[メールアドレス]
test@example.com
[お問い合わせ内容]
こんにちは!
はじめまして!

文字コードについてはJIS(ISO-2022-JP)での送信となっています。
その他、メール送信時特有の情報を確認することができます。
普段やりとりしているeメールでは、上記のようなデータをやりとりしているわけです。

最後に、ここまでの最終形のソースコードを添付しておきます。

step1-060.zip

このページをシェア Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn