Kozupon.com    
 
 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:利用・転載は自由に行って結構です。このソースは、赤字の宛先のメールアドレスを書き入れれば、このまま使えるはずです。
以上


 
 
 



Copyright 2007 Kozupon.com.