我按照大多数网站推荐的此类操作系统设置的说明进行了 Postfix + SpamAssassin 设置。基本上我编辑了我的master.cf
添加:
smtp inet n - - - - smtpd -o content_filter=spamassassin
spamassassin unix - n n - - pipe
user=debian-spamd argv=/usr/bin/spamc -f -e
/usr/sbin/sendmail -oi -f ${sender} ${recipient}
SpamAssassin 实际上工作正常,我的电子邮件被过滤,但我注意到以下情况。过去,在 SpamAssassin 之前,当电子邮件发送到我的服务器时,标头会显示如下内容:
Return-path: <[email protected]>
Envelope-to: <[email protected]>
Delivery-date: Wed, 02 Dec 2015 12:37:13 +0100
Received: from mail.sender-server.dev ...
by mail.my-server.dev
在 SpamAssassin 之后,他们显示:
Return-path: <[email protected]>
Envelope-to: <[email protected]>
Delivery-date: Wed, 02 Dec 2015 12:37:13 +0100
Received: from mail.my-server.dev ...
by mail.my-server.dev
看起来启用 SpamAssassin 后Received: from
,电子邮件真正到达我自己的服务器的原始服务器发生了变化......为什么会发生这种情况?不能通过显示正确的标题来过滤我的电子邮件来解决此问题吗?谢谢。
答案1
这是我经过研究和 @tarleb 的帮助后的最终解决方案
我的邮件投递是通过sendmail
程序进行的,该程序向我的电子邮件添加了一些额外的标头。我可以使用 mitter(邮件过滤器)来过滤传入的电子邮件并放弃使用sendmail
,但我决定更改为 Dovecot LDA 进行传递。
我原来的过滤器是在 Postfix 的开头master.cf
:
smtp inet n - - - - smtpd -o content_filter=spamassassin
并在文件末尾:
spamassassin unix - n n - - pipe
user=debian-spamd argv=/usr/bin/spamc -f -e
/usr/sbin/sendmail -oi -f ${sender} ${recipient}
我通过以下方式更改了文件末尾以使用 Dovecot 本地交付:
spamassassin unix - n n - - pipe
flags=DROhu user=vmail:vmail argv=/usr/bin/spamc -f -e
/usr/lib/dovecot/deliver -f ${sender} -d ${user}@${nexthop}
现在编辑 Postfixmain.cf
并添加(可选,检查下面的 (3)):
spamassassin_destination_recipient_limit = 1
现在,您的电子邮件将通过 Dovecot LDA 发送,无需更改标头。对于好奇的人,以下是我的配置的一些详细信息:
- 这config 可以与加号寻址/子寻址/收件人分隔符一起使用(发送至的电子邮件
[email protected]
将发送到[email protected]
收件箱) - 这就是为什么我添加了-d ${user}@${nexthop}
这将删除+
以及域之前的所有内容。要启用此功能,还请务必添加recipient_delimiter = +
到main.cf
; - 我的标志
flags=DROhu
,它们没有添加任何异常,但可以在这里理解:http://www.postfix.org/pipe.8.html; spamassassin_destination_recipient_limit = 1
需要确保每个收件人都得到 spamassassin 的单独处理。由于D
上面的标志(包括X-Original-To
标头),这是必需的。如果您有该D
标志但未设置spamassassin_destination_recipient_limit = 1
多个目的地的电子邮件将不会被发送!如果您不关心此标头,您可以删除该标志,但这不是必需的。
编辑:奖励内容 - 将您的垃圾邮件移至Junk
文件夹!
您还可以配置 Dovecot 将检测为垃圾邮件的电子邮件移至Junk
IMAP 文件夹。这肯定会让您的生活更轻松。只需按照以下步骤操作即可:
编辑
/etc/dovecot/conf.d/15-mailboxes.conf
并取消注释/添加Junk
文件夹(应位于namespace inbox
附近的部分mailbox Trash
):mailbox Junk { special_use = \Junk }
安装
dovecot-sieve
:apt-get install dovecot-sieve
编辑
/etc/dovecot/conf.d/90-sieve.conf
并注释该行:#sieve = ~/.dovecot.sieve
编辑
/etc/dovecot/conf.d/90-plugin.conf
为:plugin { sieve = /etc/dovecot/sieve/default.sieve }
编辑
/etc/dovecot/conf.d/15-lda.conf
并/etc/dovecot/conf.d/20-lmtp.conf
匹配:protocol lda/lmtp { # do not copy/paste this line! mail_plugins = $mail_plugins sieve }
警告:您的选择下可能还有其他设置
protocol
,保留它们。protocol lda/lmtp
文件中的行发生变化,保留原始内容。创建文件夹
/etc/dovecot/sieve/
创建
/etc/dovecot/sieve/default.sieve
包含以下内容的文件:require "fileinto"; if header :contains "X-Spam-Flag" "YES" { fileinto "Junk"; }
将文件夹权限更改为您的虚拟电子邮件用户和组,例如:
chown vmail:vmail /etc/dovecot/sieve/ -R
。如果你错过了这个鸽子,你会抱怨的!重新启动一切:
service postfix restart; service dovecot restart; service spamassassin restart
尝试向服务器上的某个电子邮件地址(从外部服务器)发送一封电子邮件,首先是一封普通电子邮件,然后是另一封具有此主题的电子邮件:
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
。第二封电子邮件应放入Junk
文件夹,第一封电子邮件应放入收件箱。
如果第一次尝试不起作用,请查看日志:并在运行tail -f /var/log/mail.log
时发送电子邮件。tail
一个好的工作设置应该报告stored mail into mailbox 'INBOX'
或stored mail into mailbox 'Junk'
。
答案2
这是 SMTP 服务器如何处理邮件的直接结果:每个处理邮件的服务器Received
在处理邮件时都会添加一个新的标头(根据 SMTP 服务器的要求)RFC 2821)。
这就是你所看到的。这垃圾邮件刺客服务充当过滤器,从 postfix 获取邮件并将结果发送回 postfix。因此 Postfix 会收到两次邮件。它Received
每次都会插入一个标头。这就是为什么您会看到您自己的服务器列在那里。标头可能包含类似于 的内容(Postfix, from userid 120)
,其中用户 ID 属于您的debian-spamd
用户。
检查邮件标头的其余部分应该显示Received
下面还有更多标头。只是旧的标头现在隐藏得更远,但它们仍然存在。没有信息丢失。