PHP版Web拍手を自作しました。
Web拍手。創作物を公開している方は大抵の方が導入されていると思います。自分も「読んだよ」って程度のお気楽ワンクリックを導入したくて各ページに埋め込んでいますが、もっとシンプルなものが欲しくて自作しました。
機能はこんな感じ。
- PHP製のプログラム。
- 簡単でシンプル。ファイル数は極力少なく。
- 一言コメントがなくてもメールを送信する。
- どのページからの拍手かわかるようにする。
- 拍手に必要な項目はform内で設定する。
- サンクスページはプログラムファイルから独立させる
汎用性が低いので配布は予定していませんが、覚書をかねてプログラムソースと使い方を掲載します。
必須条件
- PHPが使えるWebサーバー
- sendmailが使えるWebサーバー
- 送信先のメールアドレス
- 初心者を見守る優しいこころ
スクリプトファイル
<?php /*=1.[ 設定 ] ==============================================================*/ $to = "*****@*****.***"; //メール送信先アドレス $from = "*****@*****.***"; // メール送信元アドレス $fromname = "ウェブ拍手"; //メール送信元の名前 $subject = "拍手がありました"; // メールの件名 $thanks = "thanks.php"; // サンクスページ $charset = "UTF-8"; // 文字コード /*=設定ここまで===============================================*/ /*=2.[ プログラム処理 ] ==============================================================*/ //formデータを収集 foreach ($_POST as $key => $value) { $contents .= "$key:\n$value\n\n"; } $contents .= "--------------------------------------------------------\n"; // 送信者のアクセス元情報 $referer = getenv("HTTP_REFERER"); $contents.=<<<EOM リファラ:$referer EOM; //おまじない $main = htmlspecialchars($contents); //送信処理 if($_POST["impression"] != ""){ mb_language("Ja"); mb_internal_encoding($charset); $mailfrom = "From:" .mb_encode_mimeheader($fromname) ."<$from>"; mb_send_mail($to,$subject,$main,$mailfrom); header("Location: $Thanks"); } else{ echo "error!!"; } ?>
呼び出し側(サンプル)
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>小説タイトル -章タイトル-</title> </head> <body> <h1>小説タイトル</h1> <h2>章タイトル</h2> <div id="novelStory"> 小説本文 <!-- /#novelStory --> </div> <form method="post" action="webclap.php"> 感想: <select name="impression"> <option value="面白かった" selected="selected">面白かった</option> <option value="いまいち">いまいち</option> <option value="続きを書いて">続きを書いて</option> </select> 一言: <input type="text" size="50" name="message" /> <input type="submit" value="拍手!" /> </form> </body> </html>
使い方
- スクリプトファイルのソースを任意の名前で保存する。サンプルではwebclap.phpとしています。
- スクリプトファイルの「1.設定」内を自分用のデータに置き換える。サンクスページでphpファイルを指定していますが、htmlファイルでも問題ありません。
- サイトにスクリプトファイル(webclap.php)をアップロードする。
- 呼び出し元のファイルに<form>~</form>を挿入する。formタグのactionはスクリプトファイルを指定してください。絶対パス(http://~/webclap.php)でも相対パス(../webclap.php)でも問題ありません。
こんなメールが送られてきます
impression: 面白かった message: 一言メッセージ本文ですよ! -------------------------------------------------------- リファラ:http://nekoproject.net/novel/contents/fiori/hikari/30.php
上記ではリファラが正常に表示されていますが、リファラは改ざん可能であることを念頭においてください。
設置個所が少ないのであればformタグ内に<input type="hidden" name="setup" value="設置個所名。日本語OK">を入れても問題ありません。小説書きの人で小説の小人さんを導入している人は、テンプレートの変数と連携すれば確実にページ名を取得できます。
スクリプトの簡単な解説
$to = "*****@*****.***"; //メール送信先アドレス $from = "*****@*****.***"; // メール送信元アドレス $fromname = "ウェブ拍手"; //メール送信元の名前 $subject = "拍手がありました"; // メールの件名 $thanks = "thanks.php"; // サンクスページ $charset = "UTF-8"; // 文字コード
to…メールの宛先。省略不可。
from…どこから送られたか、を設定するアドレス。空欄でも大体のサーバーで動作しますが入れておいてください。送信元と同じアドレスでも良いと思います。
fromname…Fromのアドレスの名前。省略可
subject…メールの件名。省略可ですが省略すると迷惑メール扱いになるかも?
thanks…サンキューページ。省略すると拍手後に真っ白な画面になるのでサンクスページは必ず作成してください。
charset…文字コード。拍手呼び出し元の文字コードを指定してください。間違えると文字化けします。
//formデータを収集 foreach ($_POST as $key => $value) { $contents .= "$key:\n$value\n\n"; }
フォームのデータを変数にまとめています。
$key:\n$value\n\nとすることで、メール本文で次の表記になります。
name要素名:
name要素の値
// 送信者のアクセス元情報 $referer = getenv("HTTP_REFERER"); $contents.=<<<EOM リファラ:$referer EOM;
リファラ(呼び出し側のURL)を取っています。さっき記載した通りデータは正常に取れない可能性があります。
//おまじない $main = htmlspecialchars($contents);
いたずら対策。一言メッセージ内にタグが入ってても無効にします。詳細はこちらへ。
//送信処理 if($_POST["impression"] != ""){ mb_language("Ja"); mb_internal_encoding($charset); $mailfrom = "From:" .mb_encode_mimeheader($FromName) ."<$From>"; mb_send_mail($to,$subject,$main,$mailfrom);
form要素に組んだselectボックスは必ず文字が入る仕組みになっているので、その値が空っぽでなければメールを送信します。これをかまさないとwebclap.phpにアクセスするだけでメール送信ができちゃいます。要は巡回ボットなど、プログラム用の対策だとお考えください。
header("Location: $Thanks");
メール送信が完了したらサンクスページへ飛ばします。
以上。サンクスページの有無は、今後選べるように加工したいところ。
小説の小人さんとの連携は次の記事で掲載します。
蛇足ですが……
管理機能や連続投稿防止機能は設けていません。高機能なウェブ拍手であればWeb Liberty – フリーCGIスクリプト配布サイトやweb拍手公式サイトを使うのが吉です。全力でおすすめします。
プログラムのここが変だよ、とかあればコメントお願いします。
試し
すごい!送れた!!
初心者なのでとても参考になります!ありがとうございます!