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

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

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

悪用厳禁m9`・ω・´)

[code language=”php”]
<?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;
}
}
?>
[/code]

[amazon_link asins=’4774142352′ template=’SupportedAMP’ store=’10yendama-22′ marketplace=’JP’ link_id=’deac4db3-2724-11e8-9c05-9b6b7d01a56f’]

コメント

タイトルとURLをコピーしました