TCB*_*B13 8 postfix spamassasin
我按照大多数网站推荐的此类操作系统设置的说明进行了 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}
Run Code Online (Sandbox Code Playgroud)
SpamAssassin 实际上工作正常并且我的电子邮件被过滤了,但是我注意到以下内容。过去,在 SpamAssassin 之前,将电子邮件发送到我的服务器时,标题会显示如下内容:
Return-path: <sender@sender-server.dev>
Envelope-to: <destination@my-server.dev>
Delivery-date: Wed, 02 Dec 2015 12:37:13 +0100
Received: from mail.sender-server.dev ...
by mail.my-server.dev
Run Code Online (Sandbox Code Playgroud)
在 SpamAssassin 之后,它们显示:
Return-path: <sender@sender-server.dev>
Envelope-to: <destination@my-server.dev>
Delivery-date: Wed, 02 Dec 2015 12:37:13 +0100
Received: from mail.my-server.dev ...
by mail.my-server.dev
Run Code Online (Sandbox Code Playgroud)
看起来在启用 SpamAssassin 时,Received: from
从电子邮件真正到达我自己的服务器的原始服务器更改了......为什么会发生这种情况?这不能通过显示正确标题过滤我的电子邮件的方式来解决吗?谢谢你。
这是我在@tarleb 的研究和帮助后的最终解决方案
我的邮件传递是通过sendmail
程序进行的,它在我的电子邮件中添加了一些额外的标题。我可以使用 mitter(邮件过滤器)来过滤传入的电子邮件并放弃sendmail
使用,但是我决定更改为 Dovecot LDA 进行交付。
我原来的过滤器是,在 Postfix 的开头master.cf
:
smtp inet n - - - - smtpd -o content_filter=spamassassin
Run Code Online (Sandbox Code Playgroud)
并在文件末尾:
spamassassin unix - n n - - pipe
user=debian-spamd argv=/usr/bin/spamc -f -e
/usr/sbin/sendmail -oi -f ${sender} ${recipient}
Run Code Online (Sandbox Code Playgroud)
我通过以下方式更改了文件末尾以使用 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}
Run Code Online (Sandbox Code Playgroud)
现在编辑 Postfixmain.cf
并添加(可选,检查(3)波纹管):
spamassassin_destination_recipient_limit = 1
Run Code Online (Sandbox Code Playgroud)
现在您的电子邮件将通过 Dovecot LDA 发送,无需更改标题。对于好奇的人,这里有一些关于我的配置的细节:
user+nospam@example.com
将被发送到user@example.com
收件箱) - 这就是为什么我添加-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
}
Run Code Online (Sandbox Code Playgroud)安装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
}
Run Code Online (Sandbox Code Playgroud)编辑/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
}
Run Code Online (Sandbox Code Playgroud)
警告:您可能在选项下有其他设置protocol
,请保留它们。protocol lda/lmtp
文件中的行更改,保持原来的。
创建文件夹 /etc/dovecot/sieve/
/etc/dovecot/sieve/default.sieve
使用此内容创建文件:
require "fileinto";
if header :contains "X-Spam-Flag" "YES" {
fileinto "Junk";
}
Run Code Online (Sandbox Code Playgroud)将文件夹权限更改为您的虚拟电子邮件用户和组,例如: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'
。