数年前にphpで作ったメールフォームスクリプト

必要なファイルは、ソースから逆コーディングしてくんろ(ぁ

仮にSPFレコードやら何やらが一致しない場合ですが
・PC:SpamAssassinやセキュリティソフトでメールヘッダを解析されていたら、スパム行きになるかも
・ケータイ:メールのなりすまし規制レベルが「高」になっていなければ届くと思います
・ロリポ等レンタルサーバの場合、強制的に送信者メールアドレスが書き換わる場合あり

悪用厳禁m9`・ω・´)

<?php
# ケータイ判別するよ
preg_match("/(DoCoMo|UP\.Browser|SoftBank|J\-PHONE|Vodafone|iPod|iPhone|iPad|Android|BrackBerry)/",$_SERVER["HTTP_USER_AGENT"],$mobi);
if ($mobi[1])
{
	$TmplDir = "./mobile/";
}
else
{
	$TmplDir = "./pc/";
}

/*--------設定ここから--------*/

# テンプレートの文字エンコード (SJIS-win,UTF-8から選択)
$tmpl_enc = "UTF-8";

# メールの題名
$Subject = "お問い合わせフォームより";

# 送信者アドレスは、フォーム記載のメアドから引っ張ってきますので
# このまま空にしておいてください。
# 送信者名も、フォーム記載の名前が先頭にくるようになりますので
# その点うまいぐあいに名前をつけてあげてください。
$Sender["Mail"] = "";
$Sender["Name"] = " - お問い合わせフォーム";

# 受信者
$Receiver["Mail"] = "webmaster@excample.com";
$Receiver["Name"] = "管理者";

# 通常はCCとBCCはカラッポです。使うときはこっちをコメントアウトするように。
$Cc  = array();
$Bcc = array();

# 必要だったらコメントアウトを解除してね
# CC
#$Cc[0]["Mail"] = "xxxx@xxxx.xxx";
#$Cc[0]["Name"] = "YourName";
#$Cc[1]["Mail"] = "xxxx@xxxx.xxx";
#$Cc[1]["Name"] = "YourName";

# BCC
#$Bcc[0]["Mail"] = "xxxx@xxxx.xxx";
#$Bcc[0]["Name"] = "YourName";
#$Bcc[1]["Mail"] = "xxxx@xxxx.xxx";
#$Bcc[1]["Name"] = "YourName";

/*--------設定ここまで--------*/

# テンプレファイル群
$Tmpl["Form"]     = $TmplDir."MailForm.html";
$Tmpl["Confirm"]  = $TmplDir."MailConfirm.html";
$Tmpl["Complete"] = $TmplDir."MailComplete.html";
$Tmpl["MailBody"] = "MailBody.txt";

# エラーフラグ初期化
if (!empty(array_search($tmpl_enc,array("SJIS-win","UTF-8"))))
{
	$error = 0;
}
else
{
	$error = 1;
	$ErrorMsg["Encode"] = "指定外の文字エンコードがセットされています。";
}

# 送信ボタンおしたぉ
if ($_POST["Confirm"])
{
	# 名前
	$_POST["Name"] = RemoveEmoji($_POST["Name"],$tmpl_enc);
	if (mb_strlen($_POST["Name"],$tmpl_enc)==0)
	{
		$_POST["Name"] = "名無しさん";
	}
	else if (mb_strlen($_POST["Name"],$tmpl_enc)>20)
	{
		$error = 1;
		$ErrorMsg["Name"] = "名前は20文字以内で入力してください。";
	}

	# メアド
	$_POST["MailAddress"] = RemoveEmoji($_POST["MailAddress"],$tmpl_enc);
	if (mb_strlen($_POST["MailAddress"],$tmpl_enc)<=0 ||  	mb_strlen($_POST["MailAddress"],$tmpl_enc)>128)
	{
		$error = 1;
		$ErrorMsg["MailAddress"] = "メールアドレスが入力されていないか、128文字を越えています。";
	}
	else if (MailChecker($_POST["MailAddress"])===FALSE)
	{
		$error = 1;
		$ErrorMsg["MailAddress"] = "メールアドレスの記述が正しくありません。";
	}

	# 本文
	$_POST["Message"] = RemoveEmoji($_POST["Message"],$tmpl_enc);
	if (mb_strlen($_POST["Message"],$tmpl_enc)<=0 || mb_strlen($_POST["Message"],$tmpl_enc)>1000)
	{
		$error = 1;
		$ErrorMsg["Message"] = "本文が入力されていないか、1000文字を超えています。";
	}

	# 確認画面
	if ($error==0) require_once($Tmpl["Confirm"]);
}

# 確認画面から送信画面にいくよ
else if ($_POST["Complete"])
{
	# 送信者メアドと送信者名を完成させる
	$Sender["Name"] = $_POST["Name"].$Sender["Name"];
	$Sender["Mail"] = $_POST["MailAddress"];

	$MailBody = @file_get_contents($Tmpl["MailBody"]);
	$MailBody = str_replace("{Name}",$_POST["Name"],$MailBody);
	$MailBody = str_replace("{MailAddress}",$_POST["MailAddress"],$MailBody);
	$MailBody = str_replace("{Message}",$_POST["Message"],$MailBody);
	$MailBody = str_replace("{UserAgent}",$_SERVER["HTTP_USER_AGENT"],$MailBody);
	$MailBody = str_replace("{Host}",gethostbyaddr($_SERVER["REMOTE_ADDR"]),$MailBody);
	$MailBody = str_replace("{Ip}",$_SERVER["REMOTE_ADDR"],$MailBody);

	@MailSender($Sender,$Receiver,$Cc,$Bcc,$Subject,$MailBody);

	require_once($Tmpl["Complete"]);
}

# 初期画面またはエラーが出たときはフォーム出るよ
if (!$_POST || $error==1)
{
	# 初期画面はフォーム出すよ
	require_once($Tmpl["Form"]);
}

# 絵文字除去
function RemoveEmoji($str,$tmpl_enc="UTF-8")
{
	# 絵文字除去のためのおまじない
	$this->mb_substitute_character("none");
	$str = mb_convert_encoding($str, $tmpl_enc, "auto");

	preg_match_all("/[\\x1B][\\x24][G|E|F|O|P|Q][\\x21-\\x7E]+([\\x0F]|$)/", $str, $arr);
	$str = str_replace($arr[0], array(), $str);
	return $str;
}

# メアドがRFCに準拠してるかチェックする関数
function MailChecker($email)
{
	if (!preg("^[^@]{1,64}@[^@]{1,255}$", $email))
	{
		return false;
	}

	$email_array = explode("@", $email);
	$local_array = explode(".", $email_array[0]);

	for ($i = 0; $i < sizeof($local_array); $i++)
	{
		 if (!preg("/^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$/", $local_array[$i]))
		{
			return false;
 		}
 	}

	if (!preg("^\[?[0-9\.]+\]?$", $email_array[1]))
	{
		$domain_array = explode(".", $email_array[1]);
		if (sizeof($domain_array) < 2)
		{
		return false;
		}

		for ($i = 0; $i < sizeof($domain_array); $i++)
		{
			if (!preg("/^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$/", $domain_array[$i]))
			{
				return false;
			}
		}
	}

	return true;
}

# メール送るよ
function MailSender($Sender=array(),$Receiver=array(),$Cc=array(),$Bcc=array(),$Subject="",$Message="")
{
	# アドレスがない場合、エラー
	if ($Sender["Mail"]=="" || $Receiver["Mail"]=="") return FALSE;

	$MailHeader .= "MIME-Version:1.0\r\n";
	$MailHeader .= "Content-Type:text/plain;charset=ISO-2022-JP-MS\r\n";
	$MailHeader .= "Content-Transfer-Encoding:7bit\r\n";

	// 送信先アドレスのセット
	if ($Receiver["Name"])
	{
		$To = $this->mk_header_enc($Receiver["Name"])." <".$Receiver["Mail"].">\r\n";
	}
	else
	{
		$To = "<".$Receiver["Mail"].">\r\n";
	}

	$MailHeader .= "To: ".$To."\r\n";

	# 送信元アドレスのセット
	if ($Sender["Name"])
	{
		$MailHeader = "From: ".$this->mk_header_enc($Sender["Name"])." <".$Sender["Mail"].">\r\n";
	}
	else
	{
		$MailHeader = "From: <".$Sender["Mail"].">\r\n";
	}

	$MailHeader .= "Reply-To: ".$Sender["Mail"]."\r\n";

	# Cc,Bcc指定
	if (count($Cc)>0)
	{
		foreach ($Cc as $val)
		{
			if ($val["Name"]) $CcSetArray[] = $this->mk_header_enc($val["Name"])." <".$val["Mail"].">";
			else $CcSetArray[] = $val["Mail"];
 		}

		$MailHeader .= "Cc: ".implode(", ",$CcSetArray)."\r\n";
	}

	if (count($Bcc)>0)
	{
		foreach ($Bcc as $val)
		{
			if ($val["Name"]) $BccSetArray[] = $this->mk_header_enc($val["Name"])." <".$val["Mail"].">";
			else $BccSetArray[] = $val["Mail"];
		}

		$MailHeader .= "Bcc: ".implode(", ",$BccSetArray)."\r\n";
	}

	# タイトル
	if (!$Subject) $Subject = "(No title)";
	$Subject = $this->mk_header_enc($Subject);

	# 本文長チェック
	# 送信用に本文を加工
	$Message = mb_convert_encoding(str_replace("\n.","\n..",$Message),"ISO-2022-JP-MS","auto");

	# 本文セット
	$Message .= "\r\n";

	# 通常のメール関数で送る
	return @mail($To,$Subject,$Message,$MailHeader);

	# ヘッダ生成用文字エンコ関数
	private function mk_header_enc($str)
	{
		$str = "=?iso-2022-jp?B?".base64_encode(mb_convert_encoding($str,"ISO-2022-JP-MS","auto"))."?=";
		return $str;
	}
}
?>