2022年8月、ホームページを全面リニューアルしました! 情報を分かりやすくお伝えできるサイト作りを目指してまいります。

PHPで問い合わせメールスクリプトを作成する!

Webを作っていて、自分のメールアドレスは公開したくないが、問い合わせをとか質問を受けたい場合がある。
そんなときに、PHPでWeb問い合わせフォームを作ると非常に便利だ。
ここでは、簡単なWeb問い合わせフォームを紹介する。

OS:Debian GNU Linux3.1 Sarge kernel-2.6.8
PHP:php-4.4.1(セキュリティホール対策バージョン)


1.PHPインストール時の注意

PHPでmailを送信できるようにするために、インストール時に若干設定が必要である。

1) SELinuxをDisableにする
kernel-2.6で SELinuxが enable になっている場合、Disableにする必要がある。したがって、以下の設定を行う。

# vi /etc/sysconfig/selinux
SELINUX = disabled

このようにして、再起動する。

2) PHPのコンパイル時のオプションに以下のオプションパラメータを入れる

PHPのコンパイル時に、以下のconfigureオプションパラメータを必ず付ける。
–enable-trans-sid –enable-mbstring –enable-mbstr-enc-trans

3)php.iniのセクションの編集

# vi /usr/local/lib/php.ini
register_globals = On

省略
; For Unix only. You may supply arguments as well (default: “sendmail -t -i”).
sendmail_path = /usr/sbin/sendmail -t
省略

register_globalsセクションとsendmail_pathセクションを編集する。
注: sendmail_pathは、-iオプションは入れない。


2.実際に、mailを使ったPHPスクリプトの事例の紹介


これは、kozupon.comサイトの問い合わせメールのサンプルスクリプト。

1)スクリプトソース
Faile名 : kozupon_mail.php

<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html;charset=Shift_JIS”>
<title>kozupon.com – 問い合わせメール</title>
</head>
<body>
<?
/********************************
* メールの内容、ヘッダー情報を変数へ格納する *
*********************************/
$mailTo = $_POST[‘mailTo’];
$rebody = $_POST[‘mailBody’];
$companyFrom = $_POST[‘companyFrom’];
$name = $_POST[‘nameFrom’];
$mailFrom = $_POST[‘mailFrom’];
$mailForm2 = $_POST[‘mailForm2’];
$phoneFrom = $_POST[‘phoneFrom’];
$mailSubject = “kozupon.com ホームページからの問い合わせです。”;

/********************************************
* 余計なキャラクタ取り除いたり、置換したりしてデータを整形する *
*********************************************/
$rebody = stripslashes($rebody); // バックスラッシュが取り除かれた文字列を返す。
$body = preg_replace(“/\r\n/”,”<br>&nbsp;&nbsp;&nbsp;”,$rebody);
$body = preg_replace(“/\r/”,”<br>”,$body); // CR をbrタグへ置換する。
$body = preg_replace(“/\n/”,”<br>”,$body);
$companyFrom = stripslashes($companyFrom);
$name = stripslashes($name);
$mailFrom = stripslashes($mailFrom);
$mailFrom2 = stripslashes($mailFrom2);
$phoneFrom = stripslashes($phoneFrom);
/***********************************
* 入力されたデータに正当性が有るか、チェックする。 *
************************************/
function check_email_mx($email)
{
if( (preg_match(‘/(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/’, $email)) ||
(preg_match(‘/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/’,$email)) )
{
$host = explode(‘@’, $email);
if(my_checkdnsrr($host[1].’.’, ‘MX’) ) return true;
if(my_checkdnsrr($host[1].’.’, ‘A’) ) return true;
if(my_checkdnsrr($host[1].’.’, ‘CNAME’) ) return true;
}
return false;
}
function my_checkdnsrr($host, $type = ”)
{
if(!empty($host))
{
if($type == ”) $type = “MX”;
exec(“nslookup -type=$type $host”, $output);
while(list($k, $line) = each($output))
{
if(eregi(“^$host”, $line))
{
return true;
}
}
return false;
}
}
/**********************************
* エラーコードに対するエラー処理とエラーメッセージ *
***********************************/
if($mailTo==””) $error=1;
elseif($body==””) $error=2;
elseif($name==””) $error=3;
elseif($mailFrom==””) $error=4;
elseif(!check_email_mx($mailFrom)) $error=5;
elseif(strcmp($mailFrom, $mailFrom2) != 0 or $mailFrom2==””) $error=6;
else if($phoneFrom!=””)
{
if(!(is_numeric($phoneFrom)) or ($phoneFrom<10000)) $error=7;
}
/**********************
* エラーが無かったら送信処理へ *
***********************/
if(!$error)
{
/****************
* 日本語の設定を行う *
*****************/
mb_language(“Japanese”);
mb_internal_encoding(“SJIS”);
if( $_POST[‘mailTo’]==”Marketing” )
{
$mailTo = “<宛先にしたいメールアドレス>”;
$mailSubject = “技術的質問に関する問い合わせ”;
}
elseif( $_POST[‘mailTo’]==”Administration” )
{
$mailTo = “<宛先にしたいメールアドレス>”;
$mailSubject = “個人的質問に関する問い合わせ”;
}
$rebody = wordwrap($rebody,80,”\n”,1);
$mailBody = “From : Company Name – ” . $companyFrom . ” ; Name – ” .$name.”\r\n”;
$mailBody .= “E-mail Address : ” . $mailFrom . “\r\n”;
$mailBody .= “Subject: ” . $mailSubject . “\r\n”;
$mailBody .= “Phone: ” . $phoneFrom . “\r\n\r\n”;
$mailBody .= $rebody . “\r\n”;
/*******************
* アドレスヘッダを生成する *
********************/
$extraHeader .= “From : ” . $mailFrom . “\r\n”;
$extraHeader .= “Reply-To : ” . $mailFrom . “\r\n”;
/*******************************
* 問い合わせメール送信と送信完了表示生成 *
********************************/
if(mb_send_mail($mailTo, $mailSubject, $mailBody, $extraHeader))
{
echo(“<table border=0 cellspacing=1 width=568>”);
echo(“<tr>”);
echo(“<td bgcolor=#C1EAD6 colspan=3 align=justify valign=baseline width=560>”);
echo(“<Font size=2><B>&nbsp;&nbsp;以下の内容で問い合わせを確かに受け付けました。</B></Font></td>”);
echo(“</tr>”);
echo(“<tr>”);
echo(“<td bgcolor=#FFFFFF colspan=3 width=560>”);
echo(“<hr size=1 noshade color=#339966 width=100%>”);
echo(“</td>”);
echo(“</tr>”);
echo(“<tr>”);
echo(“<td bgcolor=#EEF9F3 colspan=3 width=560> <Font size=2>$body</Font></td>”);
echo(“</tr>”);
echo(“<tr>”);
echo(“<td bgcolor=#EEF9F3 colspan=3 width=560> </td>”);
echo(“</tr>”);
echo(“<tr>”);
echo(“<td bgcolor=#EEF9F3 width=140><Font size=2>&nbsp;会社名&nbsp;</Font></td>”);
echo(“<td bgcolor=#EEF9F3 width=9><Font size=2>:</font></td>”);
echo(“<td bgcolor=#EEF9F3 width=435><Font size=2>$companyFrom</td>”);
echo(“</tr>”);
echo(“<tr>”);
echo(“<td bgcolor=#EEF9F3 width=140><Font size=2>&nbsp;氏名</font></td>”);
echo(“<td bgcolor=#EEF9F3 width=9><Font size=2>:</td>”);
echo(“<td bgcolor=#EEF9F3 width=435><Font size=2>$name</td>”);
echo(“</tr>”);
echo(“<tr>”);
echo(“<td bgcolor=#EEF9F3 width=140><Font size=2>&nbsp;連絡先メールアドレス</font></td>”);
echo(“<td bgcolor=#EEF9F3 width=9><Font size=2>:</td>”);
echo(“<td bgcolor=#EEF9F3 width=435><Font size=2>$mailFrom</td>”);
echo(“</tr>”);
echo(“<tr>”);
echo(“<td bgcolor=#EEF9F3 width=122><Font size=2>&nbsp;電話番号</font></td>”);
echo(“<td bgcolor=#EEF9F3 width=9><Font size=2>:</td>”);
echo(“<td bgcolor=#EEF9F3 width=417><Font size=2>$phoneFrom</td>”);
echo(“</tr>”);
echo(“<tr>”);
echo(“<td colspan=3 bgcolor=#FFFFFF width=560>”);
echo(“<hr size=1 noshade color=#339966>”);
echo(“</td>”);
echo(“</tr>”);
echo(“<tr>”);
echo(“<td colspan=3 bgcolor=#C1EAD6 width=560><Font size=2><B>&nbsp; フィードバックに多少時間が掛かる場合があります、ご容赦下さい。</B></Font></td>”);
echo(“</tr>”);
echo(“<tr>”);
echo(“<td colspan=3 bgcolor=#FFFFFF width=560>”);
echo(“<hr size=1 noshade color=#339966>”);
echo(“</td>”);
echo(“</tr>”);
echo(“</table>”);
}
else $error=8;
}
/************************************************
* エラーメッセージ処理 エラーが有った場合のエラーメッセージを表示する *
*************************************************/
if($error)
{
switch($error)
{
case 1 : $error_message=”まずは、問い合わせる目的を選んでください。”;break;
case 2 : $error_message=”詳しい問い合わせの内容を入力してください。”;break;
case 3 : $error_message=”氏名は必須です。氏名を入力してください。”;break;
case 4 : $error_message=”連絡メールアドレスを入力してください。”;break;
case 5 : $error_message=”連絡メールアドレスが誤っています。”;break;
case 6 : $error_message=”連絡メールアドレス(確認用)が記入されてないか誤っています。”;break;
case 7 : $error_message=”電話番号が誤っています。”;break;
case 8 : $error_message=”メールが送れません!!”;break;
}
echo(“<table width=569 border=0 cellspacing=1>”);
echo(“<tr>”);
echo(“<td bgcolor=#FFFFFF width=565><Font size=2 color=#C01814><B>&nbsp;&nbsp;&nbsp;$error_message</B></Font></td>”);
echo(“</tr>”);
echo(“<tr>”);
echo(“<td bgcolor=#C1EAD6 width=565><Font size=2><B>&nbsp; いずれかの目的を選択して下さい。</B></Font></td>”);
echo(“</tr>”);
echo(“<tr>”);
echo(“<td width=565>”);
echo(“<form action=kozupon_mail.php method=POST>”);
echo(“<table border=0 width=565 cellspacing=1>”);
echo(“<tr>”);
if($mailTo==”Marketing”)
{
echo(“<td width=565> <input type=radio value=Marketing checked name=mailTo ><Font size=2>技術的質問</Font></td>”);
}
else
echo(“<td width=565> <input type=radio value=Marketing name=mailTo><Font size=2>技術的質問</Font></td>”);
echo(“</tr>”);
echo(“<tr>”);
if($mailTo==”Administration”)
{
echo(“<td width=565> <input type=radio value=Administration checked name=mailTo><Font size=2>個人的質問</Font></td>”);
}
else
echo(“<td width=565> <input type=radio value=Administration name=mailTo><Font size=2>個人的質問</Font></td>”);
echo(“</tr>”);
echo(“<tr>”);
echo(“<td bgcolor=#C1EAD6 width=565><Font size=2><B>&nbsp; 詳しい問い合わせの内容を入力してください。</B></Font></td>”);
echo(“</tr>”);
echo(“<tr>”);
echo(“<td width=548><textarea rows=15 name=mailBody cols=61>$rebody</textarea></td>”);
echo(“</tr>”);
echo(“<tr>”);
echo(“<td width=548>”);
echo(“<table border=0 width=560 cellspacing=1>”);
echo(“<tr>”);
echo(“<td width=204 bgcolor=#C1EAD6><Font size=2>&nbsp; 会社名(書かなくても自由)</Font></td>”);
echo(“<td width=340 bgcolor=#C1EAD6><input type=text name=companyFrom size=38 value=’$companyFrom’></td>”);
echo(“</tr>”);
echo(“<tr>”);
echo(“<td width=204 bgcolor=#C1EAD6><Font size=2>&nbsp; 氏名<Font FACE=MS 明朝 LANG=JA>※</Font></Font></td>”);
echo(“<td width=340 bgcolor=#C1EAD6><input type=text name=nameFrom size=20 value=’$name’></td>”);
echo(“</tr>”);
echo(“<tr>”);
echo(“<td width=204 rowspan=2 bgcolor=#C1EAD6><Font size=2> &nbsp;&nbsp;連絡先メールアドレス<Font FACE=MS 明朝 LANG=JA>※</Font></Font></td>”);
echo(“<td width=340 bgcolor=#C1EAD6><input type=text name=mailFrom size=38 value=’$mailFrom’><Font size=2>(半角英数字)</Font></td>”);
echo(“</tr>”);
echo(“<tr>”);
echo(“<td width=340 bgcolor=#C1EAD6>”);
echo(“<Font size=2>例:xxx@xxxxxxxx.co.jp</font>”);
echo(“</td>”);
echo(“</tr>”);
echo(“<tr>”);
echo(“<td width=204 bgcolor=#C1EAD6><Font size=2>&nbsp; 連絡先メールアドレス(確認用)<font FACE=MS 明朝 LANG=JA>※</Font></font></td>”);
echo(“<td width=340 bgcolor=#C1EAD6><input type=text name=mailFrom2 size=38 value=’$mailFrom2’><Font size=2>(半角英数字)</Font></td>”);
echo(“</tr>”);
echo(“<tr>”);
echo(“<td width=204 rowspan=2 bgcolor=#C1EAD6><Font size=2>&nbsp;&nbsp;電話番号(書かなくても自由)</font></td>”);
echo(“<td width=340 bgcolor=#C1EAD6><input type=text name=phoneFrom size=20 value=’$phoneFrom’></td>”);
echo(“</tr>”);
echo(“<tr>”);
echo(“<td width=340 bgcolor=#C1EAD6><Font size=2>例:03xxxxxxxx</font></td>”);
echo(“</tr>”);
echo(“</table>”);
echo(“</td>”);
echo(“</tr>”);
echo(“<tr>”);
echo(“<td width=548><input type=reset value=クリア name=B2> ”);
echo(“<input type=submit value=送信 name=B1></td>”);
echo(“</tr>”);
echo(“<tr>”);
echo(“<td width=548>”);
echo(“<hr size=1 color=#2E895B width=548></td>”);
echo(“</tr>”);
echo(“</table>”);
echo(“</form>”);
echo(“</td>”);
echo(“</tr>”);
echo(“</table>”);
}
?>
</body>
</html>

注1:ピンクの部分の文字比較関数については、PHP5では substr_compare($mailFrom, $mailFrom2,0) にした方が良いと思う。PHP5では、比較対象の文字列のオフセットを指定した方がベスト。

2)スクリプト実行画面
図1は、サンプルスクリプト実行画面

図1

注2:利用・転載は自由に行って結構です。このソースは、赤字の宛先のメールアドレスを書き入れれば、このまま使えるはずです。


以上

コメント