迷惑メール(スパム)対策

PHPで迷惑メール対策、時間判定で99.9%(テストメールを除くと100%)判定しています。2022/4月は232件の迷惑メール1日平均10通程度、5月はそれを上回ています。

以前はメールアドレスが収集されたスパムメールが来ていましたが、ここ数年はお問合せフォームからの迷惑メールが増えています。

内容は下記のようなものです。国内からのスパムメール


From: xxxxxx@xxxxx.co.jp
To: xxxxxxx
Subject: Project Nexus様からのお問い合わせ

【お名前】
Project Nexus

【住所】
144341

【電話番号】
xxxxxxxx

【メールアドレス】
xxxxxxxxxxxxx@yahoo.co.jp

【お問合わせ内容】
ご担当者 様

お世話になっております。
xxxxxx project ディレクターのxxxxxxxと申します。

先日「Googleレビュー」についてご連絡を致しましたが、その後は如何でしょうか?
といいますのも、他様でGoogleレビュー(クチコミ)を運用されていらっしゃる
複数の方々からの情報でクチコミが削除(消える)されてしまった!というお話を
多く聞くようになりました。

今回は上記の件も踏まえてxxxxxx projectに取り組みをご案内させて下さい。

改めましてこちらの連絡はWEBサイトが完成する前に以前にお話されたお客様
及びお名刺交換された方に対してご連絡を致しております。

3年間運用をしておりますが基本的に削除(消される)ということはありません。
万が一を考え各保証制度を揃えており安心できるようにしております!
※詳しくは担当者からのご説明をお聴きください。

【お客様の地域・業種に合わせて投稿者を見つけます】
適当にレビューを投稿する訳ではなくお客様に合わせて
全国から最適なレビュアーを選択

【風評被害・誹謗中傷対策も可能】
風評被害や誹謗中傷を豊富な実績とノウハウで悩みに沿った解決策で対応
担当者と直通のホットラインがありますので敏速な対応が可能

【高評価をお約束致します】
レビュアーについては年齢や性別・地域が異なりますが、お客様の良い部分だけを
記載するように致しておりますのでネガティブ評価はございません。

【1件あたり3,500円(最大)でご案内が可能】
「ターゲットの選択」「投稿確約」「高評価保証」込みの価格となります。

ご興味・ご質問がございましたら下記のフォームにお問い合わせ下さい。
新規でレビューを増やしたい、他社から乗換え等…
(ご連絡を頂きましたら、折り返し担当者から詳しい説明をいたします)

詳細・お問い合わせはこちらまで
https://xxxxxxxxx/


〒156-00xx
東京都xxxxxxxxxx
xxxxxx project Director xxxxxxxxx


海外からのスパムメール


【お名前】
ArthurTix

【住所】
121441

【電話番号】
83711121387

【メールアドレス】
bogdanandreev8230@seoklan.xyz

【お問合わせ内容】
hydrarusoeitpwagsnukxyxkd4copuuvio52k7hd6qbabt4lxcwnbsad.onion

настоящая ссылка на гидру

hydrarusawyg5ykmsgvnyhdumzeawp465jp7zhynyihexdv5p74etnid.onion
hydraclubbioknikokex7njhwuahc2l67lfiz7z36md2jvopda7nchid.onion
гидра не работает
гидра рабочее зеркало
ссылка на гидру

hidraruzxpnew4af.onion
гидра сайт
hydraclubbioknikokex7njhwuahc2l67lfiz7z36md2jvopda7nchid.onion
гидра не работает
hydraruzxpnew4af


ワードプレスならプラグインで対策可能ですが、通常のメール構成なら時間判定を行ってます。現在99.9%のスパムで有効です。クライアントが、最近迷惑メールが来ないと、テストと打ち込んで送信したら、時間判定で迷惑メールになり、メールシステムに異常がありメールが来ないと、問合せが来たことがあります。

最初はJqueryで入力時間を記録していました。この設定では10秒です。

入力部

<?php
 //contact_test.php
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/common.js"></script>
<title>メールテスト</title>
</head>
<body>
	<div id="contents">
		<div id="main">
			<h3>お問合わせ</h3>
			<div class="box_out">
				<div class="box_in">
					<p>お問合わせありがとうございます。</p>
					<p>メールアドレスの誤りで、返信できない場合がございます。メールアドレスはお間違えの無いよう再確認をお願い致します。</p>
					<form name="frm" action="contact_test_fin.php" method="post">
						<table>
							<tr>
								<th><span >*</span>お名前</th>
								<td><input type="text" name="name" size="50" style="ime-mode: active;width:98%;"/></td>
							</tr>
							<tr>
								<th>郵便番号</th>
								<td><input type="text" name="zip" size="15" style="ime-mode: disabled;" /></td>
							</tr>
							<tr>
								<th>ご住所</th>
								<td><input type="text" name="addr" size="60" style="ime-mode: active;width:98%;" /></td>
							</tr>
							<tr>
								<th>お電話番号</th>
								<td><input type="text" name="tel" size="20" style="ime-mode: disabled;" /></td>
							</tr>
							<tr>
								<th><span>*</span>メールアドレス</th>
								<td><input type="text" name="mail" size="50" style="ime-mode: disabled;width:50%;" /></td>
							</tr>
							<tr>
								<th><span>*</span>お問い合わせ事項</th>
								<td><textarea rows="7" cols="50" name="naiyo" style="ime-mode: active;width:98%;height:98%;"></textarea></td>
							</tr>
						</table>
						<p><span >*は必須入力項目です。メールアドレスが不完全で返信できない場合がございます。今一度ご確認ください。</span></p>
						<div class="wspace"><input type="button" value="  送 信  " onClick="SetDataSubmit();" /></div>
						<input type="hidden" id="name1" name="tim[]">
						<input type="hidden" id="zip1"  name="tim[]">
						<input type="hidden" id="addr1" name="tim[]">
						<input type="hidden" id="tel1"  name="tim[]">
						<input type="hidden" id="mail1" name="tim[]">
						<input type="hidden" id="naiyo1" name="tim[]">
					</form>
				</div>
			</div>
		</div>
	</div>
	<!----- javascript ----->
	<script type="text/javascript">
		function SetDataSubmit() {
			if( document.frm.name.value == "" )	{
				alert("お名前が入力されていません。");
			}else if(!document.frm.mail.value.match(/.+@.+\..+/)){
				alert("メールアドレスが入力されていません。");
			}else if( document.frm.naiyo.value == "" ){
				alert("お問い合わせ事項が入力されていません。");
			}else{
				if (window.confirm("入力された内容で送信します。\nよろしいですか?")) {
					document.frm.submit();
				}
			}
		}
		$(function() {
			//テキストボックスに変更を加えたら発動
			$('input[type="text"]').change(function() {
				//入力したvalue値を変数に格納
				var val = $(this).attr("name")+"1";
				console.log("changed this text area="+val);
				$('#'+val).val($.now());
			});
			$('textarea').change(function() {
				//入力したvalue値を変数に格納
				var val = $(this).attr("name")+"1";
				console.log("changed this text area="+val);
				$('#'+val).val($.now());
			});
		});
	</script>
</body>
</html>

送信ボタンが押された後の送信部

<?php
		/*** 入力データ取得 ***/
	$name=$_POST['name'];
	$zip=$_POST['zip'];
	$addr=$_POST['addr'];
	$mail=$_POST['mail'];
	$tel =$_POST['tel'];
	$naiyo=$_POST['naiyo'];
	//
	$tim=$_POST['tim'];	
	$tim[6]=($tim[5]-$tim[0])/1000; //入力に要した秒数
	//
	if (!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $mail)) {
		die("メールアドレスが誤っています。お手数ですがご確認ください");
	}
	//送信先メールアドレス
	$to ="メールアドレスを設定";			
	
	// カレントの言語を日本語に設定する
	mb_language("ja");
	// 内部文字エンコードを設定する
	mb_internal_encoding("UTF-8");
	
	$from  = "From: <" . $mail . ">";
	$subject = $name . "様からのお問い合わせ";
	$body = "【お名前】\n" . $name;
	$body .= "\n\n【住所】\n";
	$body .= $zip."--";
	$body .= $addr;
	$body .= "\n【電話番号】\n" . $tel;
	$body .= "\n【メールアドレス】\n" . $mail;
	$body .= "\n【お問合わせ内容】\n" . $naiyo;
	//10秒以内か直接呼び出された
	if ($tim[0]==0 or $tim[5]==0 or $tim[6]<10 ) {		
		$subject="<SPAM>".$subject;		
		$body .= "\n\nSPAM!!入力時間=".$tim[6];
	}else{
		if (strlen($naiyo)==mb_strlen($naiyo,'utf8')) {	//英文メール
			$subject="<SPAM>".$subject;		
			$body .= "\n\nSPAM!!英文!!";
		}
	}
	@mb_send_mail($to, $subject, $body, $from);
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/common.js"></script>
</head>
<body>
	<div id="contents">
		<div id="main">
			<h3>お問合わせ</h3>
			<div class="box_out">
				<div class="box_in">
					<p>お問い合わせ、ありがとうございます。<br />下記内容で承りました。</p>
					<table>
						<tr>
							<th>お名前</th>
							<td><?=$name; ?></td>
						</tr>
						<tr>
							<th>郵便番号</th>
							<td><?=$zip; ?></td>
						</tr>
						<tr>
							<th>ご住所</th>
							<td><?=$addr; ?></td>
						</tr>
						<tr>
							<th>お電話番号</th>
							<td><?=$tel; ?></td>
						</tr>
						<tr>
							<th>メールアドレス</th>
							<td><?=$mail; ?></td>
						</tr>
						<tr>
							<th>お問い合わせ事項</th>
							<td><?=nl2br($naiyo); ?></td>
						</tr>
					</table>
					<div class="wspace"></div>
				</div>
			</div>
	</div>
</body>
</html>

From: test@test.com
To: xxxx@xxxxx.xxxx
Subject: [SPAM]test様からのお問い合わせ

【お名前】 test
【住所】
【電話番号】
【メールアドレス】 test@test.com
【お問合わせ内容】 ん

SPAM!!入力時間=6.448

こんな感じです。SPAMは自動送信なので「入力時間=0」となります。実際には正常なメールの送信先はクライアント、それ以外では、当社にしています。2022/4では232通、振り分けミス0です。いままではミスは0件で、お使い頂いている会社が、テストメールを送ったのをスパムに扱ったのか1件です。

セッション変数を使った別の方法です。結果的にこちらが簡単でした。

入力部 セッション変数の追加をしただけ!

<?php
	//contact_test2.php
	session_start();
	$_SESSION['code']=date("YmdHis");
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/common.js"></script>
<title>メールテスト</title>
</head>
<body>
	<div id="contents">
		<div id="main">
			<h3>お問合わせ</h3>
			<div class="box_out">
				<div class="box_in">
					<p>お問合わせありがとうございます。</p>
					<p>メールアドレスの誤りで、返信できない場合がございます。メールアドレスはお間違えの無いよう再確認をお願い致します。</p>
					<form name="frm" action="contact_test_fin2.php" method="post">
						<table>
							<tr>
								<th><span >*</span>お名前</th>
								<td><input type="text" name="name" size="50" style="ime-mode: active;width:98%;"/></td>
							</tr>
							<tr>
								<th>郵便番号</th>
								<td><input type="text" name="zip" size="15" style="ime-mode: disabled;" /></td>
							</tr>
							<tr>
								<th>ご住所</th>
								<td><input type="text" name="addr" size="60" style="ime-mode: active;width:98%;" /></td>
							</tr>
							<tr>
								<th>お電話番号</th>
								<td><input type="text" name="tel" size="20" style="ime-mode: disabled;" /></td>
							</tr>
							<tr>
								<th><span>*</span>メールアドレス</th>
								<td><input type="text" name="mail" size="50" style="ime-mode: disabled;width:50%;" /></td>
							</tr>
							<tr>
								<th><span>*</span>お問い合わせ事項</th>
								<td><textarea rows="7" cols="50" name="naiyo" style="ime-mode: active;width:98%;height:98%;"></textarea></td>
							</tr>
						</table>
						<p><span >*は必須入力項目です。メールアドレスが不完全で返信できない場合がございます。今一度ご確認ください。</span></p>
						<div class="wspace"><input type="button" value="  送 信  " onClick="SetDataSubmit();" /></div>
					</form>
				</div>
			</div>
		</div>
	</div>
	<!----- javascript ----->
	<script type="text/javascript">
		function SetDataSubmit() {
			if( document.frm.name.value == "" )	{
				alert("お名前が入力されていません。");
			}else if(!document.frm.mail.value.match(/.+@.+\..+/)){
				alert("メールアドレスが入力されていません。");
			}else if( document.frm.naiyo.value == "" ){
				alert("お問い合わせ事項が入力されていません。");
			}else{
				if (window.confirm("入力された内容で送信します。\nよろしいですか?")) {
					document.frm.submit();
				}
			}
		}
	</script>
</body>
</html>

送信ボタンが押された後の送信部

<?php
	session_start();
	if ($_SESSION['code']>0) {
		$input_time=DATE("YmdHis")-$_SESSION['code'];
		if ($input_time<10) { 	//10SEC以下
			$ng_mail=9;	//ng
		}else{
			$ng_mail=0;	//ok
		}
	}else{
		$input_time=0;
		$ng_mail=9;		//ng
	}
	/*** 入力データ取得 ***/
	$name=$_POST['name'];
	$zip=$_POST['zip'];
	$addr=$_POST['addr'];
	$mail=$_POST['mail'];
	$tel =$_POST['tel'];
	$naiyo=$_POST['naiyo'];

	//
	if (!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $mail)) {
		die("メールアドレスが誤っています。お手数ですがご確認ください");
	}
	//送信先メールアドレス
	$to ="aaa@aaa.aaa";  			//送信先のメールアドレスを設定
	
	// カレントの言語を日本語に設定する
	mb_language("ja");
	// 内部文字エンコードを設定する
	mb_internal_encoding("UTF-8");
	
	$from  = "From: <" . $mail . ">";
	$subject = $name . "様からのお問い合わせ";
	$body = "【お名前】\n" . $name;
	$body .= "\n\n【住所】\n";
	$body .= $zip."--";
	$body .= $addr;
	$body .= "\n【電話番号】\n" . $tel;
	$body .= "\n【メールアドレス】\n" . $mail;
	$body .= "\n【お問合わせ内容】\n" . $naiyo;
	//10秒以内か直接呼び出された
	if ($ng_mail==9 ) {		
		$subject="<SPAM>".$subject;		
		$body .= "\n\nSPAM!!入力時間=".$input_time;
	}else{
		if (strlen($naiyo)==mb_strlen($naiyo,'utf8')) {	//英文メール
			$subject="<SPAM>".$subject;		
			$body .= "\n\nSPAM!!英文!!";
		}else{
			$body .= "\n\n入力時間=".$input_time;
		}
	}
	@mb_send_mail($to, $subject, $body, $from);
	$_SESSION['code']=0;	//リロード対策
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/common.js"></script>
</head>
<body>
	<div id="contents">
		<div id="main">
			<h3>お問合わせ</h3>
			<div class="box_out">
				<div class="box_in">
					<p>お問い合わせ、ありがとうございます。<br />下記内容で承りました。</p>
					<table>
						<tr>
							<th>お名前</th>
							<td><?=$name; ?></td>
						</tr>
						<tr>
							<th>郵便番号</th>
							<td><?=$zip; ?></td>
						</tr>
						<tr>
							<th>ご住所</th>
							<td><?=$addr; ?></td>
						</tr>
						<tr>
							<th>お電話番号</th>
							<td><?=$tel; ?></td>
						</tr>
						<tr>
							<th>メールアドレス</th>
							<td><?=$mail; ?></td>
						</tr>
						<tr>
							<th>お問い合わせ事項</th>
							<td><?=nl2br($naiyo); ?></td>
						</tr>
					</table>
				</div>
			</div>
	</div>
</body>
</html>

かなり古い、既存のシステムに追加しているので綺麗ではありませんが、セッション変数の判定で表示から入力終了までの時間を調べています。入力時間判定で、99.9%のスパムは防げています。また、これを超えるスパムが出るのでしょうが、それまでは行けそうです。

大事なのは「SPAMで送信できませんでした」とせずに送信したことで、SPAMを送った側を安心させることです。

【お名前】
ああああ
【住所】

【電話番号】

【メールアドレス】 test@test.com
【お問合わせ内容】 ああああ

SPAM!!入力時間=4