如何将垃圾邮件移至垃圾邮件文件夹? [关闭]

Posted

技术标签:

【中文标题】如何将垃圾邮件移至垃圾邮件文件夹? [关闭]【英文标题】:How to move spam to spam folder? [closed] 【发布时间】:2014-08-07 00:07:29 【问题描述】:

我已经在我的 centos 5.10 上安装了 postfix、dovecot、Clamav、Spamassassin 和 amavisd-new。 教程在这里:http://catatanlepas.com/komputer/aplikasi/server-mail/postfix/359-instalasi-postfix-menggunakan-dovecot-di-centos-5-5

我只是没有在该教程中安装 Razor、Pyzor、dan DCC。

在 /var/log/maillog 中一切正常,如果有垃圾邮件没有进入收件箱,但我想将垃圾邮件移动到垃圾邮件文件夹。

我的问题是: 1. 如何在我的网络邮件上自动创建垃圾邮件文件夹,因为它只是创建收件箱、草稿和已发送邮件,我的网络邮件上没有垃圾邮件文件夹。 2. 如何将垃圾邮件移动到每个用户的垃圾邮件文件夹(我在 /var/vmail 上创建用户)

请帮帮我,我在谷歌搜索了 5 天,我对此很感兴趣:(

谢谢。

【问题讨论】:

【参考方案1】:

I - 将您的电子邮件发送设置为使用 Dovecot LDA:

OP 链接的原始网站处于离线状态,但我相信电子邮件传递是通过sendmail 程序进行的,它应该通过 Dovecot LDA 完成,以满足您的需要。 (为了避免电子邮件来源标题更改)。

编辑 Postfix 的master.cf(开头):

smtp      inet  n       -       -       -       -       smtpd -o content_filter=spamassassin

在文件末尾:

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 

现在编辑 Postfix 的 main.cf 并添加(可选,检查下面的 (3)):

spamassassin_destination_recipient_limit = 1

现在您的电子邮件将通过 Dovecot LDA 发送,无需更改标题。对于好奇的人,这里有一些关于我的配置的细节:

    配置可与加号地址/子地址/收件人分隔符一起使用(发往user+nospam@example.com 的电子邮件将被发送到user@example.com 收件箱) - 这就是我添加-d $user@$nexthop 的原因这将删除+ 以及该域之前的所有内容。要启用此功能,还请务必将recipient_delimiter = + 添加到main.cf; 我的flagsflags=DROhu,没有添加任何异常但是可以在这里理解:http://www.postfix.org/pipe.8.html; spamassassin_destination_recipient_limit = 1 需要确保每个收件人都被 spamassassin 单独处理。由于上面的D 标志(包括X-Original-To 标头),这是必需的。如果您不关心此标头,则可以删除该标志,这不是必需的。

II - 将您的垃圾邮件移至Junk 文件夹:

(在@Electronic Technologies https://***.com/a/32470349/560745 的帮助下)

您还可以将 Dovecot 配置为将检测为垃圾邮件的电子邮件移动到 Junk IMAP 文件夹。请按照以下说明操作:

    编辑/etc/dovecot/conf.d/15-mailboxes.conf 并取消注释/添加Junk 文件夹(应该在mailbox Trash 附近的namespace inbox 部分):

    mailbox Junk 
       special_use = \Junk
    
    

    apt-get install dovecot-sieve安装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'

【讨论】:

这对我有用,除了-e /usr/lib/dovecot/deliver -f $sender -d $user@$nexthop 部分。它以“(未知用户)”反弹。我确实尝试过使用-a $recipient 而不是-d $user@$nexthop,但它实际上只是在以太中丢失了(它说它已经发送,但没有收到任何东西)。所以我最终改用-e /usr/sbin/sendmail -oi -f $sender $recipient,它很有魅力:D @Stretch 显然您的鸽舍配置与我的不同。您的解决方案可以工作,但是您将无法将电子邮件移动到 Junk 文件夹。通过 postfix 传递会在您的电子邮件中添加您不喜欢的额外标题。您的Unknown User 错误指向一个鸽舍,它在知道您拥有哪些电子邮件帐户时遇到了问题。您在使用虚拟帐户吗?身份验证如何控制? mysql?后缀套接字? 它确实将它发送到垃圾文件夹...通过您的设置,邮件采用 Postfix -> Spamassassin -> Dovecot LDA -> Dovecot ... 我的去向 Postfix -> Spamassassin - > Sendmail -> Dovecot(所以 Dovecot Sieve 仍然适用)。是的,我在 MySQL 中使用虚拟帐户。 我用这个编辑了master.cfuser=spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f $sender $recipient 当然,我的 spamassassin 用户是 spamd...所有其他解决方案都不适用于我的情况。但它仍然不会将电子邮件移动到垃圾文件夹。我正在使用亚马逊 SES。 一些dovecot 设置在其dovecot.conf 中没有include conf.d/*.conf。我花了几个小时才意识到这一点。而且我并不孤单serverfault.com/a/778462/122228【参考方案2】:

适用于 Dovecot 2.1+ 修改/etc/dovecot/dovecot.conf:

namespace 
    type = private
    separator = .
    inbox = yes
  mailbox Trash 
    auto = subscribe # autocreate and autosubscribe
    special_use = \Trash
  
  mailbox Drafts 
    auto = subscribe
    special_use = \Drafts
  
  mailbox Sent 
    auto = subscribe
    special_use = \Sent
  
  mailbox Junk 
    auto = subscribe
    special_use = \Junk
  


plugin 
    sieve = /home/spam/default.sieve


protocol lda 
            auth_socket_path = /var/run/dovecot/auth-master
            mail_plugins = $mail_plugins sieve

然后 /etc/postfix/master.cf - 添加

spamassassin unix -     n   n   -   -   pipe
  user=vmail argv=/usr/bin/spamc -f -e  /usr/libexec/dovecot/deliver -f $sender -d $recipient

(!!) user=vmail - 将用户更改为为 spamassassin 设置的用户

并将内容过滤器添加到 smtp

smtp  inet  n  - - - -  smtpd -o content_filter=spamassassin

在 /etc/mail/spamassassin/local.cf 中

add_header all Status _YESNO_, score=_SCORE_ required=_REQD_ version=_VERSION_
#rewrite_header Subject *****SPAM*****
bayes_ignore_header X-Bogosity
bayes_ignore_header X-Spam-Flag
bayes_ignore_header X-Spam-Status

我将在邮件中添加 X-Spam 标头,用于以后的筛子过滤 重启 spamassassin,重新加载 dovecot 和 postfix

垃圾文件夹将自动创建。 所有垃圾邮件将在本地投递到邮箱 Junk 我还添加了一个筛子过滤器的示例,以将所有标记为垃圾邮件的邮件(上面的 spamassassin 配置)移动到垃圾文件夹。

require "fileinto";
  if exists "X-Spam-Flag" 
          if header :contains "X-Spam-Flag" "NO" 
           else 
          fileinto "Junk";
          stop;
          
  

【讨论】:

我试过了,现在所有邮件都进入垃圾文件夹了...为什么? @TCB13 你解决了这个问题吗? 我已经更新了我的帖子。这是 postfix-dovecot-spamassassin 的工作配置 请注意以下部分:spamassassin unix -n n --pipe @pregmatch 在下面查看我的答案。【参考方案3】:

嗯,有几种方法,但这是我发现的工作。在你安装好 postfix、dovecot、spamassassin 和(我推荐 procmail)之后,你可以告诉 procmail/spamassassin 如何将垃圾邮件分发到不同的文件夹中。带鸽舍。我使用以下 4 个文件夹:

spam          (for known spam based on Bayes setting)
spam-learn    (for spam that slipped through, you move it here)
spam-probably (for spam ID'd as probably spam by Bayes setting)
spam-unlearn  (messages flagged as spam, that are NOT spam go here)

将文件夹设置和后缀配置为通过 procmail 过滤邮件:

mailbox_command = /usr/bin/procmail -a "$EXTENSION"

您现在可以设置您的 procmailrc 以将垃圾邮件放在收件箱中的正确位置。你的 ~/.procmailrc 应该是这样的:

PATH=/usr/bin/vendor_perl:/usr/bin:/bin:/usr/local/bin:.
MAILDIR=$HOME/Mail/
LOGDIR=$HOME/log
#DEFAULT=$HOME/Mail/
LOGFILE=$LOGDIR/procmail.log
VERBOSE=ON
## with spamc
:0fw: spamc.lock
* < 256000
| spamc
#| /usr/bin/vendor_perl/spamc
# Mails with a score of 15 or higher are almost certainly spam (with 0.05%
# false positives according to rules/STATISTICS.txt). Let's put them in a
# different mbox. (This one is optional.)
:0:
* ^X-Spam-Level: \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
spam
#Mail/spam

# All mail tagged as spam (eg. with a score higher than the set threshold)
# is moved to "probably-spam".
:0:
* ^X-Spam-Status: Yes
spam-probably
#Mail/spam-probably

# Work around procmail bug: any output on stderr will cause the "F" in "From"
# to be dropped.  This will re-add it.
:0
* ^^rom[ ]

LOG="*** Dropped F off From_ header! Fixing up. "

:0 fhw
| sed -e '1s/^/F/'

现在,让这一切自动运行的最后一个关键是使用fetchmail 扫描到达您收件箱的邮件,然后转交给 procmail,以便将垃圾邮件/垃圾邮件可能放在正确的文件夹中,并阅读邮件中的邮件spam(删除)和 spam-unlearn(学习为ham)。一个典型的 fetchmail 脚本是你的 ~/.fetchmailrc。它只包含轮询邮箱的命令:

poll mail.yourserver.com protocol IMAP : user yourname with password yourpass ssl \
sslfingerprint "D9:73:1A:FE:C6:7C:E7:9B:F1:31:F8:A1:A0:E1:F9:27"

(您可以通过对您的 .fetchmailrc 文件简单地运行 fetchmail --verbose 来获取您的服务器指纹,它会打印服务器指纹,检查您当前的指纹,告诉您它们不匹配并关闭连接 - 但是 -你下次得到正确的指纹:-)

最后,通过读取 spam-learn 和 spam-unlearn 文件夹来设置几个 cron 作业来运行整个过程。每小时就够了。脚本可能如下所示:

#!/bin/bash

## log file location and per-user name
LDIR=/home/admin/log
LFN="$LDIR/$USER.log"

## Retrieve and Process Spam & Ham from 'spam-learn' & 'spam-unlearn' folders
/usr/bin/fetchmail -a -s -n --folder spam-learn -m '/usr/bin/vendor_perl/sa-learn --spam' &>/dev/null
mss=$?
sleep 2
/usr/bin/fetchmail -a -s -n --folder spam-unlearn -m '/usr/bin/vendor_perl/sa-learn --ham' &>/dev/null
mhs=$?

## test and create log dir in noexist
[[ -d "$LDIR" ]] || mkdir -p "$LDIR"
if [[ -w "$LDIR" ]]; then

## check return from fetchmail and write log info
if [[ $(($mhs+$mss)) -le 2 ]]; then
    echo "$(date +'%b %e %R:%S') $HOSTNAME $0##*/: sa-learn completed successfully for user $USER" >>$LFN
else
    echo "$(date +'%b %e %R:%S') $HOSTNAME $0##*/: sa-learn FAILED for user $USER" >>$LFN
fi
fi

而 cron 作业只需​​执行上面的 spamv.sh 文件:

05 * * * * /usr/local/bin/spamv.sh

我已经运行这样的服务器近十年了,它运行良好。培训文件位于用户的主目录中,可以轻松地逐个移动,为新用户提供良好的基础集。祝你好运。几年前,我为openSuSE 11.0 做了一个简短的操作说明。那里可能还有更多信息。

附: Rayzor 值得加载。

【讨论】:

感谢大卫先生的回复。当我想安装 procmail 时,在我的 centos 5.10 中已经安装了 procmail。我该怎么办 ?我搜索 /etc/procmailrc 但在 /etc/ 上什么也没找到,没有 procmailrc。我也没有在我的虚拟用户目录中找到任何关于 procmail 的内容,/var/vmail/(domain)/(username)/Maildir/ 我很困惑搜索它。我应该先卸载 procmail 还是应该怎么做?谢谢你:) 默认没有/etc/procmailrc,但是如果你创建一个,Procmail 会使用它。 procmailrc 文件是 ~/.procmailrc -- 很抱歉造成混乱

以上是关于如何将垃圾邮件移至垃圾邮件文件夹? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Python 3:通过 uid (imaplib) 将电子邮件移至垃圾箱

如何阻止 Gmail 将我的网络应用程序发送的邮件标记为垃圾邮件? [关闭]

构建垃圾邮件分类器

12.朴素贝叶斯-垃圾邮件分类

12.朴素贝叶斯-垃圾邮件分类

Codeigniter邮件功能将邮件发送到垃圾邮件文件夹[重复]