Linuxサーバより愛を込めて。

Linux(Ubuntu)サーバとダーツを愛する中年サラリーマンの日記。

プログラミング

PHPで簡単なメールフォームを作成してみた その2

2015/04/01

PHP超入門 ~誰でもできるプログラム~

PHPで簡単なメールフォームを作成

前回に引き続きPHPでメールフォームを作成していきます。

 

入力用のページはできたので、今度は入力された情報を受け取って実際にメール送信処理を行うプログラムを作ってみます。

ファイル名は「sendmail.php」とでもしておきましょう。

大筋としては

  1. メールヘッダ作成
  2. 入力データを基に本文を作成
  3. メールの送信処理
  4. 指定されたURLへリダイレクト

という流れにしてみます。

 

1.事前準備

ちなみにPHPでメール送信処理を行う場合、事前にphp.iniの編集が必要なんですって。

 

というわけで久しぶりにphp.iniを開いてみます。

 

sudo vi /etc/php5/apache2/php.ini(環境によって異なるので、ご自身の環境に読み替えてください)

 

ずーーーーーーーっと下のほうに降りていくと

 

[mail function]

という項目がありましてその下に

 

;sendmail_path =

という部分があります。

 

ここの先頭のセミコロン(;)を消してコメントアウトした上、以下のように追記します

 

sendmail_path = /usr/sbin/sendmail -t -i -f****@*******"

 

sendmailへのpathを指定してPHPから使用できるようにするわけですが、このパスが環境により異なる可能性がありますので適宜置き換えて読んでください。

 

whereis sendmail

 

ターミナルに入力すると幾つか表示されるはずですので参考にしてみてください。

 

-f以下にスペースを空けずにPHPからデフォルトで使用するメールアドレスを設定します。プロバイダのメールの場合、ブロックされて使えない?なんてこともあるようですので注意が必要かもしれません。

 

ちなみにこのサーバでは自分で設定したメールサーバ及びアカウントを使用するようにしています。

 

前置きが長くなりましたが順を追ってプログラムを作っていくことにしましょう

 

2.メールヘッダの作成

$header_info="From: ".$_POST['_from']."\nContent-Type: text/plain;charset=ISO-2022-JP\nX-Mailer: PHP/".phpversion();

 

このように記述してます。

簡単に説明すると「$header_info」という変数を定義した上でそこに文字を代入する感じです。

 

で、$_POST['_from']の部分が前回作った入力用ページから渡された「_from」の値を使用する事を意味し、\nは改行を(何回か出てきてますね)、以下についてはメールヘッダのフォーマットに基づいて記述しただけですのでそちらを調べてみてください。機会があればいずれ書いてみます。

 

2.メール本文の作成

$body="■■".$_POST['_subject']."■■\n\n";
foreach($_POST as $key=>$value){
if (!strstr($key,"_")){
$body.="[".$key."]".$value."\n\n";
}
}

 

という具合です。

$bodyという変数を確保して$_POST['_subject']は前回のページから受け取った「_subject」の値を取り出した後改行を2回挟んでいよいよ本文です。

 

foreach~の部分は受け取った値(というか配列)に対してそれぞれ処理を行うことを意味します。

分かりにくいですね・・・

 

入力用ページから受け取った値は配列として格納されています。イメージとしては

キー名
_subject 管理者に送る
_email ****@****.com
_result ****@****.com/~(PHPファイルのパス)
_from ****@****.jp
name 山田太郎
memo テストメールを送ります。

 

といった表のような形になります。

 

これを行ごとに処理して最終的に

[キー名]値

 

という形で出力しています。

 

ポイントは!strstr($key,"_")の部分でして、

strstr(第1引数,第2引数)

という関数は第1引数の文字列を検索して第2引数に一致する文字を発見した場合に検索対象(ここでは_)以下の文字列を取得、含まれなければfalseとして処理する関数です。

 

しかし関数の頭に!をつけることで処理を真逆に行うように指定しているんです。

 

実際にキー名と値を例にして見てみると

1.キー名が「_subject」

strstr("_subject","_")となり、本来ならキー名に_が含まれるため以下のsubjectを取り出すはずなんですが頭につけた!の働きで「false」の結果を返します。よって$bodyに追記されることはありません。

2.キー名が「memo」

上と同じ処理により、_を含まないので本来は「false」を返すはずが逆の処理を行って$bodyに追記されます。

[memo]テストメールを送ります。

という1行が追記されるわけです。

 

このようにして本文を整形しています。

 

3.メールの送信処理

mb_send_mail($_POST['_email'],$_POST['_subject'],$body,$header_info);

これは関数で

mb_send_mail(宛先,件名,本文,ヘッダー情報)

という構文にそのまま変数を代入している形になります。

 

4.元のページへリダイレクト

header("Location: ".$_POST['_result']);

リダイレクトというのは自動的に指定したページへ移動する処理のことです。

今回作成した「sendmail.php」は処理を行うためだけに作ったPHPファイルであり、ブラウザ上に何かを表示するものではありません。このままだと画面が真っ白になってしまうので元の入力用ページへ自動的に移動してやります。

 

長くなりましたがこれをまとめると

<?php
$header_info="From: ".$_POST['_from']."\nContent-Type: text/plain;charset=ISO-2022-JP\nX-Mailer: PHP/".phpversion();
$body="■■".$_POST['_subject']."■■\n\n";
foreach($_POST as $key=>$value){
if (!strstr($key,"_")){
$body.="[".$key."]".$value."\n\n";
}
}
mb_send_mail($_POST['_email'],$_POST['_subject'],$body,$header_info);
header("Location: ".$_POST['_result']);
?>

 

という形になります。

 

前回作成したmail_input.phpと同じディレクトリに入れたあと、mail_input.phpファイルにブラウザからアクセスしてみましょう。送信ボタンを押した後指定したアドレスでメールを受信すればOKです。

[rakuten]booxstore:10840690[/rakuten]

-プログラミング
-