如何自动化Spamcop提交

如何自动化垃圾邮件提交

作者:Stephan Jau

介绍

Spamcop是为邮件服务器提供RBL以拒绝来自垃圾邮件发送者的传入邮件的服务。

他们的理念是处理用户可能的垃圾邮件投诉。 当他们在一段时间内收到一定数量的投诉时,他们将黑名单罪犯。 该系统依赖于用户的垃圾邮件报告。 但是,他们的提交过程不是非常方便用户:

1.)您需要将垃圾邮件转发到在注册期间给予您的垃圾邮件电子邮件地址(类似于submit.aASdfafaASDf@spam.spamcop.net - >我刚刚提出此地址),或者您手动复制“不要粘贴标题和正文,并将它们填充到服务器上的表单中。

2.)然后,您将收到一封电子邮件到您注册时提供的电子邮件地址。

3.)在这封电子邮件中,将有一个链接,要求您验证Webform上提供的数据。 这不仅仅是点击链接,而且手动提交网页。

问题

如上所述,Spamcop几乎取决于用户输入。 如果没有人提交和验证垃圾邮件,那么他们将没有黑名单。 然而,整个提交和验证过程有点恼人。 为什么要打扰垃圾邮件实际提交垃圾邮件并进行验证? 如果我只是删除它,这将花费更少的时间...

人类并没有做出重复的事情。 这让我很快无聊,因此我的想法是使这个提交和验证过程自动化。
在这里我将告诉你我是如何实现的。 我所做的只是将垃圾邮件放入某些文件夹,我们的好老朋友cron做其他事情。

先决条件

我还不是一个高级的linux用户和/或编码器或者sysadmin或者其他的。 我只是分享我拥有的所有知识。 为了让本教程运行,您将需要几件事情:

1.)Maildir结构为您的电子邮件(我只是通过所有的邮件循环的目录,因此maildb将无法使用)

2.)能够设置cron作业(否则你不能自动化一个东西)

能够运行shell脚本(在Bash中)

4.)能够从shell运行PHP脚本(我用Lynx这样做)

一个叫mime-construct的小程序。 你可以像Debian一样安装它:

apt-get install mime-construct

6.) Snoopy类 (用于提交Webforms和其他东西的PHP类)

7.)最终你需要有邮件过滤功能,特别是如果你使用全部的电子邮件地址(例如procmail)。

开始吧

垃圾邮件帐户

首先,您需要在Spamcop创建一个帐户。 这当然是免费的。

“垃圾邮件”

然后,您需要创建一个将所有垃圾邮件放入其中的文件夹。 在我的系统上,我称之为“垃圾邮件”。 (由于Maildir是先决条件,重要的文件夹是垃圾邮件文件夹下的cur文件夹,在我的case /home/mail/web4p1/Maildir/.Spam/cur/中 )。

垃圾邮件转发脚本

既然我们有或多或少的东西在一起,现在是第一个脚本的时候了。 我们现在将通过我们的RBL和Spamassassin的所有垃圾邮件放入我们的“垃圾邮件”文件夹中,其中垃圾邮件实际上被放入子文件夹“cur”。
我们现在需要做的是设置一个循环通过文件夹的脚本,并将电子邮件转发到spamcop。
这是我有的:
fe.sh (转发电子邮件脚本)

#!/bin/bash

# ENTER PATH OF THE EMAILS THAT ARE TO BE SUBMITTED TO SPAMCOP
FPATH="/home/mail/web4p1/Maildir/.Spam/cur"

# ENTER YOUR SPAMCOP EMAIL ADDRESS
EMAIL="........ a.t. spam.spamcop.net"

#################################################################
#################################################################

cd $FPATH

for FILENAME in *
do

# Create email and submit it to the supplied spamcop address
/usr/bin/mime-construct \
--subject "Forwarded spam (MIME encoded)" \
--attachment "Original message" \
--type message/rfc822 \
--encoding base64 \
--file $FILENAME \
--to "$EMAIL"

# Train this email to be spam to the bayesian SA filters
/usr/bin/sa-learn --spam $FILENAME

# Delete email
/bin/rm $FILENAME

done

总而言之,这是一个非常简单的脚本,只需要调整两件事情:

1.) PATH变量需要指向您的垃圾邮件/ cur文件夹

2.) EMAIL变量需要设置为在spamcop注册时收到的变量

在我的脚本中,我还教Spamassassin关于这些垃圾邮件,然后我删除它们。 你可能想要以不同的方式处理它们。 重要的是,一旦您将这些电子邮件提交给spamcop,那么您不会再重新提交。 要么删除它们,要么将它们移动到其他地方。 如果您没有启用spamassassin以使用贝叶斯,那么还可以删除Spamassassin学习行。

垃圾邮件验证脚本

正如先决条件所述,我们还需要一个文件夹,其中来自spamcop的验证邮件转到。 这可以是一个完整的新电子邮件帐户或一些文件夹与一些电子邮件过滤。 我选择了第二个选项,我使用procmail来过滤我的收到的电子邮件:

:0:
* ^To: spamcop a.t. roleplayer.org

Maildir/.Spamcop-Reply/

现在我们有另一个文件夹用于验证电子邮件,我们需要过滤掉包含在其中的唯一ID。 我创建了这个小脚本来获取整个URL:
vssh (验证垃圾邮件脚本)

#!/bin/bash

# ENTER PATH OF THE VERIFICATION EMAILS FROM SPAMCOP
FPATH="/home/mail/web4p1/Maildir/.Spamcop-Reply/cur"

# ENTER WEBPATH TO PHP SCRIPT
URL="http://www.domain.com/spamcop/index.php"

#################################################################
#################################################################

cd $FPATH

for FILENAME in *
do

# Get the supplied URL from the spamcop email
DATA=`/bin/grep -F http://www.spamcop.net/sc?id= $FILENAME`
echo $DATA

# Submit the URL to the PHP script
/usr/bin/lynx -dump $URL?data=$DATA

# Remove that file
/bin/rm $FILENAME

done

再一次,一个简单的脚本。 它所做的一切都是通过给定的路径循环遍历所有包含的电子邮件,并将其与ID进行过滤,并将该信息传递给PHP脚本(然后执行实际的表单提交)。

1.) PATH变量需要指向您的垃圾邮件/ cur文件夹。

2.) URL变量需要设置为脚本的Weblocation。

垃圾邮件表单提交脚本

那么到目前为止,我们已将所有的垃圾邮件转发到spamcop,收到了包含表单submisson ID的验证邮件,并将该数据发送到PHP脚本。
现在,您创建一个包含以下内容的PHP脚本,确保它位于vssh脚本中提供的路径,并将Snoopy.class.php文件放入放置php脚本的同一个文件夹: index .php (表单提交脚本)

<?php

// Function for displaying an array in a table (also works on multidimensional arrays)
function displayArray($aArray) {
if (is_array($aArray) && (count($aArray) > 0)) {
print("<table border=1>");
print("<tr><th>Key</th><th>Value</th></tr>");
foreach ($aArray as $aKey => $aValue) {
print("<tr>");
if (!is_array($aValue)) {
if (empty($aValue)) {
print("<td>$aKey</td><td><i>$aValue</i></td>");
} else {
print("<td>$aKey</td><td>$aValue</td>");
}
} else {
print("<td>$aKey(array)</td><td>");
displayArray($aValue);
print("</td>");
}
print("</tr>");
}
print("</table>");
} else {
print("<i>empty or invalid</i>");
}
}

// The default form fields (those are being repeated to everyone the mail is sent to)
$offender = array("type", "master", "info", "sc_comment", "comment");

// The default form fields (these are the unique fields)
$form_vars = array("action", "spamid", "crc", "date", "source", "reports", "goodrelay", "max", "notes");

// Get the URL from the attached parameters
$data_org = $_GET["data"];

// Split it at sc?id= so that you have the "id code" only
$data = explode("sc?id=", $data_org);
$data = $data[1];

// Just some verification
echo "SC-ID: " . $data;

if($data == "") {
echo "done";
exit;
}

echo "<hr>";

// Require the snoopy class for retrieving the form
require_once("Snoopy.class.php");

$snoopy = new Snoopy;

$snoopy->fetch("http://www.spamcop.net/sc?id=" . $data);

$results = $snoopy->results;

// Another verification that it is actually a spam email that can be submitted....
$results = explode('<form action="/sc"', $results);
$results = $results[1];

if($results == "") {
echo "done";
exit;
}

// Count the number of recipients
$i = substr_count($results, 'textarea name="comment');

while ($i > 0) {

foreach($offender as $val) {

// Get Field Value
$findme = 'name="' . $val . $i . '"';
$offset = strlen($findme);
$pos_start = strpos($results, $findme) + $offset;
$pos_end = strpos($results, ">", $pos_start);
$res = substr($results, $pos_start, $pos_end);
$res = explode('"', $res);
$res = $res[1];
if($val == "comment") { $res = ""; }

$submit_vars["send".$i] = "on";
$submit_vars[$val.$i] = $res;

}

$i--;

}

$submit_vars["submit"] = "Send Spam Report(s) Now";

foreach($form_vars as $val) {

// Get Field Value
$findme = 'name="' . $val . '"';
$offset = strlen($findme);
$pos_start = strpos($results, $findme) + $offset;
$pos_end = strpos($results, ">", $pos_start);
$res = substr($results, $pos_start, $pos_end);
$res = explode('"', $res);
$res = $res[1];
if($val == "notes") { $res = ""; }

$submit_vars[$val] = $res;

}

// Display the data to be sent --> can be deactivated
displayArray($submit_vars);

// Create a new instance to submit the form data
$snoopy = new Snoopy;

$submit_url = "http://www.spamcop.net/sc";

if($snoopy->submit($submit_url,$submit_vars)) {
while(list($key,$val) = each($snoopy->headers)) {
echo $key.": ".$val."<br>\n";
}
echo "<p>\n";
echo "<PRE>".htmlspecialchars($snoopy->results)."</PRE>\n";
} else {
echo "error fetching document: ".$snoopy->error."\n";
}

?>

我已经添加了不少意见,让您了解逻辑。
有一件事情可能会改变

                $submit_vars["send".$i] = "on";

这行可能被删除,但是这一行在这里:

$offender = array("type", "master", "info", "sc_comment", "comment");

需要更改为:

$offender = array("type", "master", "info", "sc_comment", "comment", "on");

在未更改的版本中,您可以通过spamcop向邮件发送头文件中的每个条目,而更改的版本则使用spamcop的建议(这可能是更安全的方法)。

Cron设置

我们现在拥有一切,但是我们需要手动执行两个bash脚本( fe.shvssh )。 那么这个教程是关于如何自动化这一点,所以最后一步是创建cronjobs为我们做这个工作。
我个人更喜欢创建文本文件,然后添加到crontab。 为了这样做,只需创建一个包含以下内容的文件:
cron.txt (cron命令文件)

0,20,40 * * * * /bin/sh /PATH/TO/fe.sh
10,30,50 * * * * /bin/sh /PATH/TO/vs.sh

当然,你必须用你自己的路径替换/ PATH / TO到文件的位置。 在我的情况下是这样的:

0,20,40 * * * * /bin/sh /home/mail/web4p1/fe.sh > /home/mail/web4p1/output1.txt
10,30,50 * * * * /bin/sh /home/mail/web4p1/vs.sh > /home/mail/web4p1/output2.txt

注意:我还添加了一个输出,以查看crons和脚本是否运行正常。 一旦你满意,只需从cron文本文件中删除> ....的东西

那么现在我们创建了cron文本文件,但是我们如何将它添加为cronjob呢? 答案很简单:

crontab -uUSER cron.txt

只需将USER用于您要运行cronjob的用户,或者如果您以此用户身份登录或以root身份登录,并希望以root身份运行(不推荐使用)

最后的话

那就是这样。

1.)您可以从论坛下载脚本的副本。

2.)不要忘记正确地chownchmod文件(我已经为用户执行shell脚本 - 但是我不确定是否需要)。

3.)如果您持续使用相同的垃圾邮件提交邮件,则只需要1个vssh脚本。 为了使用自动提交所需要的是在每个电子邮件帐户中创建一个“垃圾邮件”文件夹,并运行fe.sh脚本。

4.)我设置cron运行每20分钟...很可能你想改变一次一个小时...但提交速度至关重要。 越快,您提交和验证垃圾邮件越快会出现在垃圾邮件RBL。 因为这样,因为白天几乎不停地上网(因为这是我的工作),我设置cron每20分钟运行一次。

如果你有改进和建议,让我知道:)

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏