フォームから送られてきた値をテキストファイルに保存し、更新された分を自動で毎日メールでお知らせしてくれるシステムをPHPで作る方法

更新日:2022年3月13日

今回の記事では、
「フォームから送られてきた値をテキストファイルに保存し、更新された分を自動で毎日メールでお知らせしてくれるシステム」
をPHPで作成しようと思います。

PHPが使えるサーバー環境と、CRON(クーロン)が使える環境であることが前提条件となります。

一連の流れとしては以下になります。
・入力フォームのphpファイルを作成します。
・送られてきた値をテキストファイルに書き込みするphpファイルを作成します。
・テキストファイルの内容を送信するphpファイルを作成します。

さて、それではいってみましょう!

input.php(入力フォームのphpファイル)

input.phpを作成して、下記のように記述します。

<!doctype html>
<html>
	<head>
		
		登録ページ
	</head>
	<body>

	

</body> </html>

ただの入力フォームです。
フォームに入力された値がinput_do.phpに送信されます。

input_do.php(送られてきた値をテキストファイルに書き込みするphpファイル)

input_do.phpを作成して、下記のように記述します。

<?php
date_default_timezone_set('Asia/Tokyo');

if(isset($_POST['goods_name'], $_POST['send'], $_POST['size'], $_POST['number_of_copies'])) {
	$fp = fopen("data/" . date("Ymd") . ".txt", "a");
	$fp_matome = fopen("matome/matome.txt", "a");
	$write_str = $_POST['goods_name'] . "\t" . $_POST['send'] . "\t".$_POST['size'] . "\t".$_POST['number_of_copies'] . "\n";
	fwrite($fp, $write_str);
	fwrite($fp_matome, $write_str);
	fclose($fp);
}
?>
<!doctype html>
<html>
	<head>
		
		登録完了ページ
	</head>
	<body>

	

商品を登録しました

</body> </html>

input.phpから送られてきた値を受け取り、matome/matome.txtに書き込みます。
同時に送信日時のテキストファイルを自動で生成して、そのテキストファイルにも、input.phpから送られてきた値を書き込みます。

例えば、2022年3月13日にinput.phpのフォームから送信されたとしたら、その時に自動で生成されるテキストファイルの名前は「2022313.txt」となります。このテキストファイルはdataフォルダの中に生成されます。

送信日時のテキストファイルは、日付が変わらない限りはずっと追記されていきますが、日付が変わるとまた新たな送信日時のテキストファイルを自動で生成して、そこに書き込みします。

matome/matome.txtは日付とか関係なく、常に書き込みがされるテキストファイルとなります。

ですので、まとめると以下のような階層となります。

input.php
input_do.php
matomeフォルダ
 ┗matome.txt
dataフォルダ
 ┗2022313.txt
 ┗2022312.txt
 ┗2022311.txt
.
.
.

submit.php(テキストファイルの内容を送信するphpファイル)

input.phpやinput_do.phpと同階層に、submit.phpを作成して、下記のように記述します。

<?php
//絶対パスを取得する
$path = realpath(dirname(__FILE__));

//dataフォルダ内のテキストファイル一覽を取得する
$txt_files = glob($path ."/data/*.txt");

//取得したテキストファイルの中で、一番大きな数のテキストファイルを取得する
$txt_files_max = max($txt_files);

//メールの内容
$body .= "▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼\n";

//テキストファイルの内容を呼び出し
$data = file($txt_files_max);
$data = array_reverse($data);
$data = array_map("trim",$data);
for($i = 0;$i < count($data);$i++){
	$row = $data[$i];
	$cell = explode("\t",$row);
	$body .= $row . "\n";
}

$body .= "▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼\n";

//メールの送り先,メールの送り元,メールタイトル
$flg = bSENDMAIL3("example@example.com","example@example.com","【Web担当者の作り方】です。本日の更新内容をお知らせします。",$body);

if($flg == true){
	$msg = "メールの送信が完了しました。
送った内容は以下になります。
" . $body; }else{ $msg = "メールの送信に失敗しました。"; } function bSENDMAIL3($to,$from,$sub,$body){ mb_language("uni"); mb_internal_encoding("utf-8");//utf-8 or SJIS $Head=""; $Head.="From: ".$from."\n"; $Head.="Mime-Version: 1.0\n"; $Head.="Reply-To: ".$from."\n"; $Head.="X-Mailer: PHP/" . phpversion(); $flg = mb_send_mail($to, $sub, $body,$Head); return $flg; } ?> <!doctype html> <html> <head> 送信完了ページ </head> <body>

<?=$msg?>

</body> </html>

このプログラムは、dataフォルダ内の一番大きな数のテキストファイル(=つまり最新の日時)の中身を指定のメールアドレスに送信するものになっています。
フォルダの作成は自動ではないので、事前に「matome」フォルダと、「data」フォルダの作成をしておくようにしましょう。submit.phpと同階層に作成しておきます。

CRONを使っている関係上、相対パスでの指定だと動かないので、
$path = realpath(dirname(__FILE__));
で絶対パスに置き換えています。
細かい解説はソースコード内にコメントとして書いているので割愛しますが、このsubmit.phpは前回の記事「CRON設定を使ってPHPを決まった日時に動かす方法【さくらレンタルサーバー】」で紹介したCRON設定を使って自動的に決まった時間に送信するものとなっております。
「実行コマンド」にはsubmit.phpを指定して下さい。
日付が変わった瞬間に送信すると漏れがないので、CRON設定では毎日0時に送信するように設定しておいた方がいいでしょう。

これにて、その日にinput.phpから送信された値を、毎日0時にお知らせしてくれるシステムの完成です。
是非お試しあれ!