9月更新・前月(8月)の人気記事トップ10 09/02/2024
- ( 01 – ) 【Labs】position:absoluteとwidth:100%を指定すると横幅の設定がうまくいかない場合の対処方法について
- ( 07 ↑) 【Mac】macOSをHigh SierraからMontereyにアップグレード
- ( 03 – ) 【Mac】横画面で撮影した動画をYouTubeショート用にMacのiMovieで縦画面に編集する方法
- ( 10 ↑) 【iPhone / iPad】iPhoneのツイッターアプリでユーザー名をコピーする方法
- (圏外↑) 【Labs】CSSだけでドロップダウンメニュー
- ( 02 ↓) 【jQuery】入門2. jQueryをHTMLに組み込む
- ( 09 ↑) 【Mac】Safariでソースコードを見る方法
- ( 04 ↓) 【jQuery】入門7. jQueryで新しいWindowを開く
- ( 06 ↓) 【2024年5月】iPad画面解像度まとめ
- (圏外↑) 【GIMP】レイヤーをロック
【Labs】PHPでシンプルなメールフォーム
こんにちは(・∀・)
PHPで作ったメールフォーム(コンタクトフォーム)をご紹介します。
メールフォーム
中も外も超シンプルに作りました。確認画面ありのタイプとなしのタイプの2種類です。どちらもレスポンシブデザインでスマホ対応です。
入力チェックはForm Validationでクライアントサイドで行います。
確認画面なしのメールフォームサンプル1
確認画面なしのメールフォームです。
入力フォーム部分がindex.html、送信部分のプログラムがmail.phpの2ファイルです。
index.html
<div class="tb-cell mail-form">
<form id="form" action="mail.php" method="post">
<div class="row">
<div class="cell">
<label>name</label>
<!--cell--></div>
<div class="cell">
<input type="text" name="name" required>
<!--cell--></div>
<!--row--></div>
<div class="row">
<div class="cell">
<label>email</label>
<!--cell--></div>
<div class="cell">
<input type="email" name="email" required>
<!--cell--></div>
<!--row--></div>
<div class="row">
<div class="cell">
<label>comment</label>
<!--cell--></div>
<div class="cell">
<textarea name="comment" required></textarea>
<!--cell--></div>
<!--row--></div>
<div class="row">
<div class="cell">
<!--cell--></div>
<div class="cell">
<button type="submit" id="sbtn" name="action" value="post">送 信</button>
<button type="reset" id="rbtn">リセット</button>
<!--cell--></div>
<!--row--></div>
</form>
<!--tb-cell--></div>
mail.php
<?php
$action = $_POST['action'];
$name = htmlspecialchars($_POST['name']);
$email = htmlspecialchars($_POST['email']);
$comment = htmlspecialchars($_POST['comment']);
$to = '受診するメールアドレスを入力';
$subject = 'form-mail-sample-1';
$message = '[お名前]'."\n".$name."\n";
$message .= '[email]'."\n".$email."\n";
$message .= '[コメント]'."\n".$comment."\n\n\n";
$header = 'From: '.$email."\r\n";
$header .= 'Reply-To: '.$email."\r\n";
if($action == "post"){
$status = mb_send_mail($to, $subject, $message, $header);
if ($status) {
echo '<p class="msg">メッセージは正常に送信されました</p>';
echo '<button type="button" onclick="history.go(-1)">入力フォームに戻る</button>';
} else {
echo '<p class="msg">メッセージの送信に失敗しました</p>';
echo '<button type="button" onclick="history.go(-1)">入力フォームに戻る</button>';
}
}
?>
CSS
.tb-cell {
display: table;
width: 300px;
margin: 20px auto 40px auto;
text-align: left;
}
.tb-cell .row {
display: table-row;
}
.tb-cell .row .cell {
display: table-cell;
border: 1px solid #ddd;
padding: 10px;
vertical-align: middle;
color: #fff;
}
.tb-cell .row .cell:nth-child(odd) {
width: 100px;
}
.tb-cell .row .cell:nth-child(even) {
width: 200px;
}
.mail-form .row .cell {
padding: 5px;
}
.mail-form .row .cell:nth-child(1) {
background: #9fb7d4;
}
.mail-form .row .cell:nth-child(2) {
background: #ccc;
}
input[type="text"],
input[type="email"] {
height: 30px;
font-size: 16px;
}
textarea {
height: 100px;
font-size: 16px;
}
button {
color: #fff;
border: none;
padding: 10px;
font-size: 16px;
cursor: pointer;
}
button[type="button"] {
margin-left: 10px;
}
button[type="button"],
button[type="submit"] {
background: #afc6e2;
}
button[type="reset"] {
background: none;
}
button[type="button"]:hover,
button[type="submit"]:hover {
background: #ddd;
}
button[type="reset"]:hover {
text-decoration: underline;
}
.msg {
margin: 50px 0;
font-weight: bold;
}
@media (min-width: 768px) {
.tb-cell {
width: 800px;
}
.tb-cell .row {
display: table-row;
}
.tb-cell .row .cell {
display: table-cell;
border: 1px solid #ddd;
padding: 10px;
vertical-align: middle;
color: #fff;
}
.tb-cell .row .cell:nth-child(odd) {
width: 200px;
}
.tb-cell .row .cell:nth-child(even) {
width: 600px;
}
input[type="text"],
input[type="email"] {
width: 300px;
}
textarea {
width: 580px;
}
/* ** */}
Result
サンプルデモはこちら
スマホでのご確認はこちらをどうぞ
確認画面ありのメールフォームサンプル2
確認画面ありのメールフォームです。
こちらのサンプルも入力フォーム部分がindex.html、送信部分のプログラムがmail.phpの2ファイル構成です。
index.html
<div class="tb-cell mail-form">
<form id="form" action="mail.php" method="post">
<div class="row">
<div class="cell">
<label>name</label>
<!--cell--></div>
<div class="cell">
<input type="text" name="name" required>
<!--cell--></div>
<!--row--></div>
<div class="row">
<div class="cell">
<label>email</label>
<!--cell--></div>
<div class="cell">
<input type="email" name="email" required>
<!--cell--></div>
<!--row--></div>
<div class="row">
<div class="cell">
<label>comment</label>
<!--cell--></div>
<div class="cell">
<textarea name="comment" required></textarea>
<!--cell--></div>
<!--row--></div>
<div class="row">
<div class="cell">
<!--cell--></div>
<div class="cell">
<button type="submit" id="sbtn" name="action" value="post">入力内容を確認</button>
<button type="reset" id="rbtn">リセット</button>
<!--cell--></div>
<!--row--></div>
</form>
<!--tb-cell--></div>
mail.php
/*<html>タグの前に記述*/
<?php
if(!$_POST){
header('Location: /');
}
session_start();
if(isset($_POST['name'],$_POST['email'],$_POST['comment'])){
$_SESSION['name'] = $_POST['name'];
$_SESSION['email'] = $_POST['email'];
$_SESSION['comment'] = $_POST['comment'];
}
?>
/*<body>内に記述*/
<?php
$action = $_POST['action'];
$name = htmlspecialchars($_SESSION['name']);
$email = htmlspecialchars($_SESSION['email']);
$comment = htmlspecialchars($_SESSION['comment']);
$to = '受診するメールアドレスを入力';
$subject = 'form-mail-sample-2';
$message = '[お名前]'."\n".$name."\n";
$message .= '[email]'."\n".$email."\n";
$message .= '[コメント]'."\n".$comment."\n\n\n";
$header = 'From: '.$email."\r\n";
$header .= 'Reply-To: '.$email."\r\n";
if($action == "post"){
echo '<div class="tb-cell mail-form">';
echo '<form id="form" action="mail.php" method="post">';
echo '<div class="row">';
echo '<div class="cell">';
echo '<label>name</label>';
echo '<!--cell--></div>';
echo '<div class="cell">';
echo $_SESSION['name'];
echo '<!--cell--></div>';
echo '<!--row--></div>';
echo '<div class="row">';
echo '<div class="cell">';
echo '<label>email</label>';
echo '<!--cell--></div>';
echo '<div class="cell">';
echo $_SESSION['email'];
echo '<!--cell--></div>';
echo '<!--row--></div>';
echo '<div class="row">';
echo '<div class="cell">';
echo '<label>comment</label>';
echo '<!--cell--></div>';
echo '<div class="cell">';
echo $_SESSION['comment'];
echo '<!--cell--></div>';
echo '<!--row--></div>';
echo '<div class="row">';
echo '<div class="cell">';
echo ' ';
echo '<!--cell--></div>';
echo '<div class="cell">';
echo '<p>入力内容が正しければ送信してください</p><br>';
echo '<button type="submit" id="sbtn" name="action" value="send">送 信</button>';
echo '<button type="button" onclick="history.go(-1)">入力フォームに戻る</button>';
echo '<!--cell--></div>';
echo '<!--row--></div>';
echo '</form>';
echo '<!--tb-cell--></div>';
}elseif($action == "send"){
$status = mb_send_mail($to, $subject, $message, $header);
if ($status) {
echo '<p class="msg">メッセージは正常に送信されました</p>';
echo '<button type="button" onclick="history.go(-2)">入力フォームに戻る</button>';
} else {
echo '<p class="msg">メッセージの送信に失敗しました</p>';
echo '<button type="button" onclick="history.go(-2)">入力フォームに戻る</button>';
}
$_SESSION = array();
session_destroy();
}
?>
CSS
.tb-cell {
display: table;
width: 300px;
margin: 20px auto 40px auto;
text-align: left;
}
.tb-cell .row {
display: table-row;
}
.tb-cell .row .cell {
display: table-cell;
border: 1px solid #ddd;
padding: 10px;
vertical-align: middle;
color: #fff;
}
.tb-cell .row .cell:nth-child(odd) {
width: 100px;
}
.tb-cell .row .cell:nth-child(even) {
width: 200px;
}
.mail-form .row .cell {
padding: 5px;
}
.mail-form .row .cell:nth-child(1) {
background: #9fb7d4;
}
.mail-form .row .cell:nth-child(2) {
background: #ccc;
}
input[type="text"],
input[type="email"] {
height: 30px;
font-size: 16px;
}
textarea {
height: 100px;
font-size: 16px;
}
button {
color: #fff;
border: none;
padding: 10px;
font-size: 16px;
cursor: pointer;
}
button[type="button"] {
margin-left: 10px;
}
button[type="button"],
button[type="submit"] {
background: #afc6e2;
}
button[type="reset"] {
background: none;
}
button[type="button"]:hover,
button[type="submit"]:hover {
background: #ddd;
}
button[type="reset"]:hover {
text-decoration: underline;
}
@media (min-width: 768px) {
.tb-cell {
width: 800px;
}
.tb-cell .row {
display: table-row;
}
.tb-cell .row .cell {
display: table-cell;
border: 1px solid #ddd;
padding: 10px;
vertical-align: middle;
color: #fff;
}
.tb-cell .row .cell:nth-child(odd) {
width: 200px;
}
.tb-cell .row .cell:nth-child(even) {
width: 600px;
}
input[type="text"],
input[type="email"] {
width: 300px;
}
textarea {
width: 580px;
}
/* ** */}
Result
サンプルデモはこちら
スマホでのご確認はこちらをどうぞ
メールアドレスの入力マッチ
メールアドレスの入力マッチの機能を追加したい場合は次のスクリプトで実現できます。
<script>
function mailcheck(){
var mail = email.value;
var mail2 = email2.value;
if(mail != mail2){
email2.setCustomValidity('メールアドレスが一致しません');
}else{
email2.setCustomValidity('');
}
}
var sn = document.getElementById('email2');
sn.addEventListener('input',mailcheck,false);
</script>
index.htmlの入力フォームにメールアドレス欄を一つ増やします。元からあるメールアドレス欄のIDはemailとしてください。追加するメールアドレス欄のIDはemail2にします。
元からあるメールアドレス欄の塊をを丸ごとコピーしてIDを変更すればいいと思います。
上記スクリプトをそのままコピーして</body>タグ直前に貼り付けます。
その他
メールの送信時間やIPアドレスなどの情報も欲しい場合、次のコードで取得できます。
$agent = getenv("HTTP_USER_AGENT");
$host = getenv("REMOTE_HOST");
$addr = getenv("REMOTE_ADDR");
if($host == "" || $host == $addr){$host = @gethostbyaddr($addr);}
$date = gmdate("Y/m/d H:i:s (D)",time()+9*60*60);
$message .= '[投稿時間]'."\n".$date."\n";
$message .= '[IPアドレス]'."\n".$addr."\n";
$message .= '[ホスト名]'."\n".$host."\n";
$message .= '[ブラウザ・OS]'."\n".$agent."\n\n";
そのままコピーしてPHP内に貼り付けてください。
関連リンク
【Labs】iframeで画面遷移しないように見えるメールフォーム
【Labs】シンプルメールフォームで簡易CAPTCHA認証