博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spamassassin_SpamAssassin,MIMEDefang和Procmail:2017年最佳三人组合
阅读量:2525 次
发布时间:2019-05-11

本文共 10009 字,大约阅读时间需要 33 分钟。

spamassassin

在和 ,我将两个开源命令或程序类型授予“最佳情侣”奖,这些命令或程序类型共同使我的世界变得更加美好。 今年,“最佳情侣”奖已变成“最佳三人”,因为解决了我着手解决的问题(有效的服务器端电子邮件分类),这需要三款软件一起工作。 这就是我使用SpamAssassin,MIMEDefang和Procmail(三种常见且可免费获得的开源软件包)使所有工作正常运行的方式。

问题

为了简化电子邮件管理,我喜欢将收到的邮件分类到几个文件夹中(除了收件箱)。 垃圾邮件始终归档在垃圾邮件文件夹中,每隔几天我会检查一次,以防万一我想要的内容被标记为垃圾邮件。 我还将来自其他两个来源的电子邮件分类到特定的文件夹中。 默认情况下,其他所有内容都已归档到收件箱中。

关于术语的快速入门:排序是对电子邮件进行分类并将其存储在适当文件夹中的过程。 过滤器对电子邮件进行分类。 使用该分类,通过向主题行添加文本字符串来将邮件标记为垃圾邮件。 该分类允许其他软件将电子邮件归档到指定的文件夹中。 我一直在使用这两个应用程序,并且我需要软件来完成这最后一个步骤,即完成归档的程序。

我在设置了几个电子邮件过滤器,这是我发现的满足我个人需求的最佳客户端。 我和妻子都在计算机上使用电子邮件过滤器。 当我们旅行或使用手持设备时,这些过滤器并不总是起作用,因为Thunderbird或任何其他带有过滤器的电子邮件客户端必须在家中运行我的计算机才能执行过滤任务。 我可以在笔记本电脑上设置过滤器,以便在旅行时对电子邮件进行分类,但这意味着我必须维护多组过滤器。

我还想解决一个技术问题。 客户端电子邮件过滤取决于将邮件放入收件箱后对其进行扫描。 由于某些未知原因,有时客户端不会从收件箱中删除(删除)已移动的邮件。 这可能是Thunderbird的问题(或者可能是我的Thunderbird配置的问题)。 多年来,即使通过Fedora和Thunderbird的多个完整重新安装,我也没有成功解决此问题。

此外,垃圾邮件对我来说是一个主要问题。 我有自己的电子邮件服务器,并且使用多个电子邮件地址。 我有一些电子邮件帐户已经有几十年了,它们已经成为垃圾邮件的主要吸引者。 实际上,我每天通常会收到1,200到1,500封垃圾邮件-我的记录是每天只有2500封垃圾邮件-而且数量还在不断增加。

为了解决我的问题,我需要一种基于服务器而不是基于客户端的电子邮件归档方法(即,将它们分类到适当的文件夹中)。 这将解决几个问题:我不需要仅在家庭工作站上运行电子邮件客户端即可执行过滤。 我无需从收件箱中删除或删除邮件,尤其是垃圾邮件。 而且,我不需要在多个位置配置过滤器-我只需要在一个位置(服务器)中配置过滤器。

我的电子邮件服务器

当我从OS / 2切换到Red Hat Linux 5时,大约在1997年,我选择了Sendmail作为我的电子邮件服务器,因为我已经使用它几年了。 从那以后,它一直是我的 (MTA),用于企业和个人用途。 (我不知道为什么当我所有其他引用都说“邮件”传输代理时,Wikipedia为何将MTA称为“邮件”传输代理。Wikipedia页面的“对话”选项卡对此进行了一些讨论,甚至产生了更多讨论。让我感到困惑。)

我一直在使用SpamAssassin和MIMEDefang来对传入的电子邮件进行评分和标记为垃圾邮件,在主题### SPAM ###中放置一个已知字符串,以便我可以识别垃圾邮件并对其进行分类,既可以是人工的,也可以是软件的。 我使用进行客户端对电子邮件的访问,但这不是服务器端筛选和排序的一个因素。

是的,我在电子邮件的服务器端使用了许多老式软件,但众所周知,它运行良好,而且我了解如何使其执行我需要做的事情。

项目要求

我认为在开始一个项目之前,必须有一套明确定义的要求。 根据对问题的描述,我为此项目创建了五个简单要求:

  1. 使用已经添加到主题行的标识文本将传入的垃圾邮件分类到服务器端的垃圾邮件文件夹中。
  2. 将其他传入电子邮件分类到指定的文件夹中。
  3. 避免问题未从收件箱中删除或删除的移动邮件。
  4. 保留现有的SpamAssassin和MIMEDefang软件。
  5. 确保任何新软件都易于安装和配置。

这组目标意味着我需要一个排序程序,该程序可以与现有零件很好地集成在一起。

邮件

经过广泛的研究,我选择了古老的 。 我知道-更多旧的东西-如今也几乎不受支持。 但是它可以满足我的需要,并且可以与我已经在使用的软件一起很好地工作。 它很稳定,没有已知的严重错误。 可以将其配置为在系统级别以及单个用户级别使用。

基于Red Hat和基于Red Hat的发行版(例如CentOS和Fedora)使用Procmail作为SendMail的默认 (MDA),因此甚至无需安装它。 它已经在那里。 我的服务器运行CentOS,因此使用Procmail确实是一件容易的事。

除了传送电子邮件外,Procmail还可用于过滤和排序。 Procmail规则(称为食谱)可用于识别垃圾邮件并将其删除或分类到指定的邮件文件夹中。 其他食谱也可以识别和分类其他邮件。 除了将电子邮件分类到指定的文件夹中之外,Procmail还可以用于许多其他事情,例如自动转发,复制等等。 这些其他任务不在本文的讨论范围之内,但是了解排序应该使您对如何完成这些其他任务有更好的了解。

这个怎么运作

将SpamAssassin,MIMEDefang和Procmail一起用于反垃圾邮件解决方案的方法有很多,因此,我不会深入探讨如何配置它们。 相反,我将专注于如何集成这三个软件包以实现自己的解决方案。

传入电子邮件处理始于SendMail。 我将此行添加到了sendmail.mc配置文件中:

INPUT_MAIL_FILTER ( ` mimedefang ', `S=unix:/var/spool/MIMEDefang/mimedefang.sock, T=S:5m;R:5m' ) dnl

该行调用MIMEDefang作为电子邮件处理的一部分。 对SendMail进行任何配置更改后,请确保运行make命令,然后重新启动SendMail。 (有关更多信息,请参阅《 第8章。)

SpamAssassin可以在某些应用程序中作为独立软件运行。 但是,在这种环境下,它不是作为守护程序运行,而是由MIMEDefang调用,并且每一封电子邮件都首先由SpamAssassin处理以为其生成垃圾邮件评分。

SpamAssassin提供了一组默认规则,但是您可以通过修改/etc/mail/spamassassin/local.cf文件来修改现有规则的分数,添加自己的规则以及创建白名单和黑名单。 该文件可能会变得很大。 我的刚刚超过70KB,并且还在不断增长。

SpamAssassin使用一组默认和自定义规则以及分数来为每封电子邮件生成总分数。 MIMEDefang使用SpamAssassin作为子例程,并接收垃圾邮件分数作为返回码。

MIMEDefang是在Perl中编程的,因此很容易被黑客入侵。 我已经破解了/ etc / mail / mimedefang-filter中的代码的最后一部分,以提供比默认粒度稍大的过滤细分。 这是这段代码在我的安装中的外观(我对这段代码进行了重大更改,因此您的代码看起来可能不太像这样):

#####################################################################      
# Determine how to handle the email based on its spam score and #
# add an appropriate X-Spam-Status header and alter the subject. #
#####################################################################
# Set required_hits in sa-mimedefang.cf to get value for $req #
#####################################################################
if
(
$hits
> =
$req
)
{
action_add_header
(
"X-Spam-Status" ,
"Spam, score= $hits required= $req tests= $names "
) ;
action_change_header
(
"Subject" ,
"####SPAM#### ( $hits ) $Subject "
) ;
action_add_part
(
$entity ,
"text/plain" ,
"-suggest" ,
" $report \n " ,
"SpamAssassinReport.txt" ,
"inline"
) ;
# action_discard();
} elsif
(
$hits
> =
8
)
{
action_add_header
(
"X-Spam-Status" ,
"Probably, score= $hits required= $req tests= $names "
) ;
action_change_header
(
"Subject" ,
"####Probably SPAM#### ( $hits ) $Subject "
) ;
action_add_part
(
$entity ,
"text/plain" ,
"-suggest" ,
" $report \n " ,
"SpamAssassinReport.txt" ,
"inline"
) ;
} elsif
(
$hits
> =
5
)
{
action_add_header
(
"X-Spam-Status" ,
"Possibly, score= $hits required= $req tests= $names "
) ;
action_change_header
(
"Subject" ,
"####Possibly SPAM#### ( $hits ) $Subject "
) ;
action_add_part
(
$entity ,
"text/plain" ,
"-suggest" ,
" $report \n " ,
"SpamAssassinReport.txt" ,
"inline"
) ;
} elsif
(
$hits
> =
0.00
)
{
action_add_header
(
"X-Spam-Status" ,
"Probably not, score= $hits required= $req tests= $names "
) ;
# action_add_part($entity, "text/plain", "-suggest", "$report\n", "SpamAssassinReport.txt", "inline");
}
else
{
# If score (hits) is less than or equal to 0
action_add_header
(
"X-Spam-Status" ,
"No, score= $hits required= $req tests= $names "
) ;
# action_add_part($entity, "text/plain", "-suggest", "$report\n", "SpamAssassinReport.txt", "inline");
}

以下是该代码中更改电子邮件主题行的行:

action_change_header ( "Subject" , "####SPAM#### ( $hits ) $Subject " ) ;

实际上,它调用另一个Perl子例程来使用我想添加的字符串作为参数来更改主题行,但是效果是相同的。 现在,主题行包含字符串#### SPAM ####和垃圾邮件得分(即变量$ hits )。 在主题行中包含此已知字符串使进一步过滤变得容易。

修改后的电子邮件将返回到SendMail进行进一步处理,SendMail调用Procmail充当MDA。

Procmail使用全局和用户级别的配置文件,但是必须创建全局/ etc / procmailrc文件和单个用户〜/ .procmailrc文件。 文件的结构相同,但是全局文件在所有传入的电子邮件上运行,而可以为每个用户配置本地文件。 由于我不使用全局文件,因此所有排序均在用户级别完成。 我的.procmailrc文件很简单:

# .procmailrc file for david@both.org      
# Rules are run sequentially - first match wins
PATH =
/ usr
/ sbin:
/ usr
/ bin
MAILDIR =
$HOME
/ mail
#location of your mailboxes
DEFAULT =
/ var
/ spool
/ mail
/ david
# Send Spam to the spam mailbox
# This is my new style SPAM subject
:
0
* ^Subject:.
*
####SPAM####
$HOME
/ spam
# Political stuff goes here. Must be using my political email address
:
0
* ^To:.
* political
$HOME
/ Political
# SysAdmin stuff goes here. Usually system log messages
:
0
* ^Subject:.
*
( Logwatch
| rkhunter
| Anacron
| Cron
| Fail2Ban
)
$HOME
/ AdminStuff
# drops messages into the default box
:
0
* .
*

请注意, .procmailrc文件必须位于我的电子邮件帐户在电子邮件服务器上的主目录中,而不是在我的工作站的主目录中。 由于大多数电子邮件帐户不是登录帐户,因此它们将nologin程序用作默认外壳程序,因此管理员必须创建和维护这些文件。 另一种选择是更改为登录shell(例如Bash)并设置密码,以便有知识的用户可以登录服务器上的电子邮件帐户并维护其.procmailrc文件。

每个Procmail配方的第一行均以:0 (是,为零)开头,总共包含三行。 第二行以*开头,并包含一个条件语句,该条件语句由Procmail与传入电子邮件中的每一行进行比较的正则表达式(regex)组成。 如果匹配,Procmail会将电子邮件分类到第三行指定的文件夹中。 进行比较时, ^符号表示行的开头。

我的.procmailrc文件中的第一个配方将MIMEDefang在主题行中标识的垃圾邮件排序到我的垃圾邮件文件夹中。 第二个配方将政治电子邮件(由我用于各政治组织的志愿者工作的特殊电子邮件地址标识)分类到其自己的文件夹中。 第三个秘诀将我从处理的多台计算机收到的大量系统电子邮件分类到一个邮箱中,以履行系统管理员的职责。 此设置使这些电子邮件非常容易找到。

请注意,使用括号括起要匹配的字符串列表。 每个字符串都由竖线(也称为管道( | ))分隔,该竖线用作逻辑“或”。 所以条件线

* ^Subject:. * ( Logwatch | rkhunter | Anacron | Cron | Fail2Ban )

读取,“如果主题行包含Logwatch或rkhunter或...或Fail2Ban。” 由于Procmail忽略大小写,因此无需创建寻找各种大小写组合的配方。

最后一个食谱会将与另一个食谱不匹配的所有电子邮件放入默认文件夹,通常是收件箱。

我的主目录中有.procmailrc文件,不会导致Procmail过滤我的邮件。 我必须再添加一个文件,即〜/ .forward文件,该文件告诉Procmail过滤所有传入的电子邮件:

# .forward file      
# process all incoming mail through procmail - see .procmailrc for
# the filter rules.
|/ usr
/ bin
/
procmail

创建或修改Procmail配置文件时,不必重新启动SendMail或MIMEDefang。

有关Procmail的配置和配方创建的更多详细信息,请参见和RHEL部署指南中的信息。

一些附加说明

请注意,MIMEDefang必须首先在SendMail之前启动,以便它可以在SendMail发送电子邮件进行处理的地方创建套接字。 我有一个简短的脚本(可以自动执行所有操作!),我用来以正确的顺序停止和重新启动SendMail和MIMEDefang,以便local.cf文件中的新规则或修改后的规则生效。

我的SpamAssassin local.cf文件中已经有大量规则和分数修饰符,因此,尽管我本可以单独使用Procmail进行垃圾邮件过滤和排序,但转换所有这些规则仍需要大量工作。 我还认为SpamAssassin的评分更好,因为它不依赖于单个规则进行匹配,而是依赖于所有规则的总得分以及贝叶斯过滤的得分。

当可以使用已知字符串非常明确地进行匹配时,例如我已将MIMEDefang配置为放在主题行中的字符串,Procmail可以很好地工作。 我认为Procmail在垃圾邮件过滤过程中作为最后的排序阶段比单独作为完整的解决方案更有效。 就是说,我知道许多管理员已经使用Procmail制作了完整的垃圾邮件过滤解决方案。

现在,我已经在服务器端进行了过滤,在选择电子邮件客户端方面,我受到的限制有所减少,因为我不再需要执行过滤和排序的客户端。 我也不需要一直在运行电子邮件客户端来执行过滤和排序。

Procmail的灭亡报道被大大夸大了

在我对本文的研究中,我发现Google的一些结果(从2001年到2013年)宣布Procmail已死。 证据包括损坏的网页,缺少的源代码以及上的一句话,该句子声明Procmail已死,并链接到最新的替换内容。 但是,所有Red Hat,Fedora和CentOS发行版都将Procmail安装为SendMail的MDA。 红帽,Fedora和CentOS存储库都具有Procmail的源RPM,并且源代码也位于 。

考虑到Red Hat继续使用Procmail,我可以毫无问题地使用这种成熟的软件,该软件可以无声无息地发挥作用。

资源资源

  • 还包含有关MIMEDefang和Procmail的信息
  • 维基百科上的
  • 维基百科上的
  • 红帽的文档

翻译自:

spamassassin

转载地址:http://nynzd.baihongyu.com/

你可能感兴趣的文章
阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第2节 反射_6_反射_获取字节码Class对象的三种方式...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第2节 反射_11_反射_案例
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第2节 反射_8_反射_Class对象功能_获取Field...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第2节 反射_10_反射_Class对象功能_获取Method成员方法...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第3节 注解_13_注解_JDK内置注解...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第3节 注解_12_注解_概念
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第3节 注解_15_注解_自定义注解_属性定义...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第3节 注解_14_注解_自定义注解_格式&本质...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第3节 注解_17_注解_解析注解...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第3节 注解_16_注解_自定义注解_元注解...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第3节 注解_18_注解_案例_简单的测试框架...
查看>>
阶段3 1.Mybatis_01.Mybatis课程介绍及环境搭建_01.mybatis课程介绍
查看>>
阶段3 1.Mybatis_01.Mybatis课程介绍及环境搭建_02.三层架构和ssm框架的对应关系
查看>>
阶段3 1.Mybatis_01.Mybatis课程介绍及环境搭建_03.jdbc操作数据库的问题分析
查看>>
阶段3 1.Mybatis_01.Mybatis课程介绍及环境搭建_04.mybatis概述
查看>>
阶段3 1.Mybatis_01.Mybatis课程介绍及环境搭建_05.mybatis环境搭建-前期准备
查看>>
阶段3 1.Mybatis_01.Mybatis课程介绍及环境搭建_06.mybatis的环境搭建
查看>>
阶段3 1.Mybatis_01.Mybatis课程介绍及环境搭建_07.环境搭建的注意事项
查看>>
阶段3 1.Mybatis_02.Mybatis入门案例_3.mybatis注解开发和编写dao实现类的方式
查看>>
阶段3 1.Mybatis_02.Mybatis入门案例_2.mybatis入门案例中的设计模式分析
查看>>