問題は、見つかったメソッドが1つの単純な条件を満たさないということです。 レターのテキストはサーバーにダウンロードされず、レターを受け入れるかどうかの決定はヘッダーの分析のみに基づいていることが望ましい。
メールサーバーと同じコンピューターにWebサーバーがあるため、次のアルゴリズムが実装されました。
-送信者のホワイトリストを作成し、そこから文字を制限なしで受け入れます
-送信者がホワイトリストにない場合、ホワイトリストにアドレスを追加する方法を示すエラーが送信者に送信されます
-Webサーバーで、ホワイトリストにアドレスを追加するためのcaptchaを含むページを作成します
そのため、順番に(ubuntuを使用しているため、このタイプのディストリビューション用の手順です):
1.ホワイトリストを保存するためにpostgresqlを使用します。
sudo apt-get install apache2 postgresql-8.3 postfix php
/etc/postgresql/8.3/main/pg_hba.confファイルに次の行を挿入します
local whitelist whitelist password
次に、単一のホワイトリストテーブルでホワイトリストデータベースを作成します
sudo su - postgres
psql -c "create user whitelist password '1'" ( )
psql -c "create database whitelist owner whitelist"
psql -d whitelist -c "create table whitelist(email varchar, primary key(email))"
2.データベースの準備ができたら、メールアドレスを追加するページを作成します ホワイトリストにメールします。
ダウンロードkcaptcha http://www.captcha.ru/kcaptcha/
whitelist.phpを作成します。
<? session_start(); ?> <html><head><title></title> </head> <body> <div align="center"> <table width="80%"><tr><td> <h1> </h1> , , . </td></tr> <tr><td align="center" class="formbg"> <form action="/whitelist_add.php" method="post"> <table><tr> <td> e-mail :</td> <td><input type="text" name="email" class="inp"/></td></tr> <tr><td> </td></tr> <tr> <td valign="bottom"> :</td> <td><img src="/kcaptcha/index.php?<?=session_name()?>=<?=session_id()?>"><br/><input type="text" name="keystring" class="inp"></td></tr> <tr><td> </td></tr> <tr><td colspan="2" align="center"><input type="submit" value=" "></td> </tr></table> </form> </td></tr> </table> </body> </html>
<? session_start(); ?> <html><head><title></title> </head> <body> <div align="center"> <table width="80%"><tr><td> <h1> </h1> , , . </td></tr> <tr><td align="center" class="formbg"> <form action="/whitelist_add.php" method="post"> <table><tr> <td> e-mail :</td> <td><input type="text" name="email" class="inp"/></td></tr> <tr><td> </td></tr> <tr> <td valign="bottom"> :</td> <td><img src="/kcaptcha/index.php?<?=session_name()?>=<?=session_id()?>"><br/><input type="text" name="keystring" class="inp"></td></tr> <tr><td> </td></tr> <tr><td colspan="2" align="center"><input type="submit" value=" "></td> </tr></table> </form> </td></tr> </table> </body> </html>
ファイルwhitelist_add.php
<? session_start(); $correct = false; if(count($_POST)>0){ if(isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] == $_POST['keystring']){ $correct = true; } } unset($_SESSION['captcha_keystring']); ?> <html><head><title> </title> </head> <body> <div align="center"> <table width="80%"><tr><td> <h1><? if($correct) { $dbconn = pg_connect("host=localhost dbname=whitelist user=whielist password=1") // , .1 or die('Could not connect: ' . pg_last_error()); // Performing SQL query $result = pg_prepare($dbconn, "check_query", 'select email from white_list where email = $1'); $result = pg_execute($dbconn, "check_query", array($_POST['email'])); if(pg_fetch_array($result)) { ?> <? } else { $result = pg_prepare($dbconn, "insert_query", 'insert into white_list(email) values($1)'); $result = pg_execute($dbconn, "insert_query", array($_POST['email'])); ?> !<? } if($result) { pg_free_result($result); } pg_close($dbconn); } else { ?> <? }?> </h1><? if($correct) { ?> <? } else { ?> <a href="whitelist.php"> </a> <? } ?> </td></tr> <tr><td><br/><br/><a href="/whitelist.php"> </a></td></tr> </table> </body> </html>
3.ヘッダーをフィルタリングするように接尾辞を設定します
ディレクトリ/ etc / postfixにブロックファイルを作成します
/.*/ REJECT \n\n******** your e-mail should be in our whitelist ******** \n Visit http://[ ]/whitelist.php \n\n *******************************************\n\n
同じディレクトリにpg_whitelist.cfファイルを作成します
hosts = localhost
user = whitelist
password = 1 # . 1
dbname = whitelist
query = select 'permit' from white_list where email = '%s'
/etc/postfix/main.confファイルに追加します
smtpd_sender_restrictions = check_sender_access pgsql:/etc/postfix/pg_whitelist.cf, check_sender_access regexp:/etc/postfix/block
4.後置をオーバーロードする:
sudo /etc/init.d/postfix reload
このメカニズムは約1年間使用します。 使用初日から、スパムは遮断されました。 もちろん、時々自分で顧客の住所を入力する必要がありますが、基本的に彼らは自分でそれを見つけます。 スパムは次の2つの理由で突破する可能性があります。返信先アドレスが入力されていないか、受信者と一致するかどうか。 残念ながら、From = Toが見つからなかったことを確認する簡単な方法を見つける時間はありませんでした。