SQLの窓

2015年05月15日


@BBS(アットビービーエス) のサービスが終了するので、管理人宛のメールサービスをほぼ同じ画面デザインで作成しました。( ご自由にお使い下さい )

デモページ


フォントは変更し、必要無い文言は削除しています。
( オリジナルは SHIFT_JIS でしたが、全て UTF-8 に変更しました )



自分が管理するサーバー(レンタルサーバー)があって、そのサーバーから PHP の mb_send_mail 関数で呼び出す事のできるメールアカウントを使って利用可能です。

common.php
<?php
header( "Content-Type: text/html; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

mb_language( "ja" );
mb_internal_encoding("utf-8");

function admin_mail( $user_body, $user_mail, $user_subject ) {
	$from_address = "<このPHPが置かれるサーバで使用できるメールアドレス>";
	$from = "日本語の差出人";
	$to_address = "<管理人のメールアドレス>";
	$to = "管理人宛";

	$from = mb_convert_encoding( $from, "JIS", "utf-8" );
	$from	= "From: =?ISO-2022-JP?B?" . base64_encode($from) . "?= $from_address";
	$to = mb_convert_encoding( $to, "JIS", "utf-8" );
	$to	= "To: =?ISO-2022-JP?B?" . base64_encode($to) . "?= $to_address";

	$mail_body = "------------------------------------------------\n";
	$mail_body .= "(注)このメールに直接返信しないでください。\n";
	$mail_body .= "送信元は投稿者ではありません。\n";
	$mail_body .= "下記掲載の「投稿者のメールアドレス」に返信してください。\n";
	$mail_body .= "------------------------------------------------\n";
	$mail_body .= "投稿者のIP:{$_SERVER["REMOTE_ADDR"]}\n";
	$mail_body .= "投稿者のメールアドレス:{$user_mail}\n";
	$mail_body .= "内容:\n";
	$mail_body .= $user_body;

	mb_send_mail($to, $user_subject, $mail_body, $from );

}
?>

カスタマイズしやすいように、画面処理は 3つ の PHP ファイルで遷移させています。

1) 入力 : adminmail_1.php
2) 確認 : adminmail_2.php
3) 終了 : adminmail_3.php

その為、通常のデータの受け渡しは、POST を使用していますが、エラー処理の画面遷移では GET を使用しています。

セッションを使うともっと簡潔になりますが、ここでは使用していません。

adminmail_1.php

このページに サーバーから $_POST が送られる事はありませんが、画面遷移を1つのページに仕様変更する際には必要なので、便宜上記述しています。

str_replace の処理は、入力値を HTML 内に問題無く埋め込めるようにする為に、HTML の < と > と 属性の値に使われる "(ダブルクォーテーション) を変換しています。
<?php
require_once( "common.php" );

foreach($_POST as $k => $v) {
	$v = str_replace("\"","&#34;",$v);
	$v = str_replace("<","&lt;",$v);
	$_POST[$k] = str_replace(">","&gt;",$v);
}
foreach($_GET as $k => $v) {
	$v = str_replace("\"","&#34;",$v);
	$v = str_replace("<","&lt;",$v);
	$_GET[$k] = str_replace(">","&gt;",$v);
}

$message = "";
if ( $_GET['e1'] == "1" ) {
	$message .= "<br>※ 件名を入力してください";
}
if ( $_GET['e2'] == "1" ) {
	$message .= "<br>※ メールアドレスを入力してください";
}
if ( $_GET['e2'] == "2" ) {
	$message .= "<br>※ メールアドレスが正しく無いようです";
}
if ( $_GET['e3'] == "1" ) {
	$message .= "<br>※ 本文を入力して下さい";
}

if ( $message != "" ) {
	foreach($_GET as $k => $v) {
		$_POST[$k] = $_GET[$k];
	}
}

?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>管理人へメールを送る</title>

<link type="text/css" rel="stylesheet" href="adminmail.css">

</head>
<body>

<div id="header" style="text-align:left;">
	<a href="adminmail_1.php">リロード</a>
</div>

<div id="container">
	
	<div id="top">
	  <h1>管理人へメールを送る</h1>
	</div>
	<div id="message">
		<?= $message ?>
	</div>	

	<div id="content">
		<fieldset>
			<legend>送信情報</legend>
			
			<div class="explain">
				<ol>
						<li>下記のフォームを埋めて投稿してください。</li>
						<li>メールアドレスは正しく入力してください。</li>
					</ol>
				<p></p>
			</div>


			<form action="adminmail_2.php" method="post" class="form">
				
				<p><label for="subject">件名</label></p>
				
				<p><input type="text" name="subject" value="<?= $_POST["subject"] ?>" id="subject" size="60"></p>
				
				<p><label for="usermail">メールアドレス</label></p>
				
				<p><input type="text" name="usermail" value="<?= $_POST["usermail"] ?>" id="usermail" size="60"></p>
				
				<p><label for="body">本文</label></p>
				
				<p><textarea cols="50" rows="5" name="body" id="body"><?= $_POST["body"] ?></textarea></p>
				
				<input type="submit" name="confirm" value="確認" class="buttons">
				
			</form>
		</fieldset>
	</div>
	
	<div class="clear"></div>
	
</div>


</body>
</html>


adminmail_2.php

メールアドレスのフォーマットチェックには、filter_var 関数(PHP 5 >= 5.2.0) を使用しています。
<?php
require_once( "common.php" );

$err = false;
$param = "";

// 入力チェック
if( trim( $_POST['subject'] ) == "") {
	$err = true;
	if ( $param != "" ) {
		$param .= "&";
	}
	$param .= "e1=1";
}
if( trim( $_POST['usermail'] ) == "") {
	$err = true;
	if ( $param != "" ) {
		$param .= "&";
	}
	$param .= "e2=1";
}
else {
	if( !filter_var($_POST['usermail'], FILTER_VALIDATE_EMAIL)) {
		$err = true;
		if ( $param != "" ) {
			$param .= "&";
		}
		$param .= "e2=2";
	}
}
if( trim( $_POST['body'] ) == "") {
	$err = true;
	if ( $param != "" ) {
		$param .= "&";
	}
	$param .= "e3=1";
}

if ( $err ) {
	$url = "adminmail_1.php?{$param}";
	$url .= "&subject=" . urlencode($_POST['subject']);
	$url .= "&usermail=" . $_POST['usermail'];
	$url .= "&body=" . urlencode($_POST['body']);
	header("Location: {$url}");
	exit();
}

foreach($_POST as $k => $v) {
	$v = str_replace("\"","&#34;",$v);
	$v = str_replace("<","&lt;",$v);
	$_POST[$k] = str_replace(">","&gt;",$v);
}

$_POST["body_html"] = str_replace("\r\n","<br>",$_POST["body"]);
$_POST["body_html"] = str_replace("\n","<br>",$_POST["body_html"]);


?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>管理人へメールを送る</title>

<link type="text/css" rel="stylesheet" href="adminmail.css">

</head>
<body>

<div id="header" style="text-align:left;">
	<a href="adminmail_1.php">リロード</a>
</div>

<div id="container">
	
	<div id="top">
	  <h1>管理人へメールを送る</h1>
	</div>
	
		
	<div id="content">
		<fieldset>
			<legend>送信情報</legend>
			
			<div class="explain">
				<ol>
						<li>下記のフォームを埋めて投稿してください。</li>
						<li>メールアドレスは正しく入力してください。</li>
					</ol>
				<p></p>
			</div>
			
			
			<form action="adminmail_3.php" method="post" class="form">
				<p><label>件名</label></p>
				
				<p><?= $_POST["subject"] ?></p>
				<input type="hidden" name="subject" value="<?= $_POST["subject"] ?>">
				<p><label>メールアドレス</label></p>
				
				<p><?= $_POST["usermail"] ?></p>
				<input type="hidden" name="usermail" value="<?= $_POST["usermail"] ?>">
				<p><label>本文</label></p>
				
				<p><?= $_POST["body_html"] ?></p>
				<input type="hidden" name="body" value="<?= $_POST["body"] ?>">
				<input type="submit" name="edit" value="<< 修正" class="buttons" formaction="adminmail_1.php">
				<input type="submit" name="sendmail" value="送信" class="buttons">
			</form>
		</fieldset>
	</div>
	
	<div class="clear"></div>
	
</div>


</body>
</html>


adminmail_3.php

ここでメール送信を実行しています。送信後、この画面にリダイレクトしているので、ブラウザで再表示しても再度送信しようとする事はありません。
<?php
require_once( "common.php" );

if ($_SERVER["REQUEST_METHOD"] == "POST") {

	admin_mail( $_POST["body"], $_POST["usermail"], $_POST["subject"]);

	header("Location: adminmail_3.php");
	exit();

}

?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>管理人へメールを送る</title>

<link type="text/css" rel="stylesheet" href="adminmail.css">

</head>
<body>

<div id="header" style="text-align:left;">
	<a href="adminmail_1.php">リロード</a>
</div>

<div id="container">
	
	<div id="top">
	  <h1>管理人へメールを送る</h1>
	</div>
	
		
	<div id="content">
		<fieldset>
			<legend>送信情報</legend>
			
			<div class="explain">
				<ol>
						<li>下記のフォームを埋めて投稿してください。</li>
						<li>メールアドレスは正しく入力してください。</li>
					</ol>
				<p></p>
			</div>
			
			
					<p style="color:#336699; font-weight:bold;">メールを送信しました。</p>
			<p><a href="adminmail_1.php">メール作成フォームへ戻る</a></p>
					<div class="clear"></div>
		</fieldset>
	</div>
	
	<div class="clear"></div>
	
</div>


</body>
</html>

送り先が固定なのでここでは実装していませんが、セッションを使えば最初の画面表示から、メール送信までの時間間隔が一定以上必要になるようにする事ができます。



【PHP + 通信の最新記事】
posted by lightbox at 2015-05-15 07:44 | PHP + 通信 | このブログの読者になる | 更新情報をチェックする
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり