如何永久删除sendmail队列中的电子邮件并阻止它们回来?

我在这里有一个非常烦人的问题。 我一直在testing一个应用程序,并创build了一些testing电子邮件伪造的电子邮件地址(更不用说我的服务器没有真正设置发送电子邮件)。 当然, sendmail不能发送这些消息,他们一直在sendmail队列中卡住。 我想手动删除已经在队列中build立的消息,而不是等待sendmail通常停止重试的5天。

我使用的是Ubuntu 10.04,而/var/spool/mqueue/是我读过的每一个/var/spool/mqueue/的目录,表示保留了排队的电子邮件。 当我删除这个目录中的文件时, sendmail停止尝试处理电子邮件,直到看起来是一个cron脚本运行,并用我不想发送的消息重新填充这个目录。 以下是我的syslog中的一些行:

 Jun 2 17:35:19 sajo-laptop sm-mta [9367]:o530SlbK009365:to =,ctladdr =(33/33),delay = 00:06:27,xdelay = 00:06:22,mailer = esmtp, pri = 120418,relay = e.mx.mail.yahoo.com。  [67.195.168.230],dsn = 4.0.0,stat = Deferred:连接超时e.mx.mail.yahoo.com。
 Jun 2 17:35:48 sajo-laptop sm-mta [9149]:o4VHn3cw003597:to =,ctladdr =(33/33),delay = 2 + 06:46:45,xdelay = 00:34:12,mailer = esmtp,pri = 3540649,relay = mx2.hotmail.com。  [65.54.188.94],dsn = 4.0.0,stat = Deferred:连接超时mx2.hotmail.com。
 (root)CMD([-x / usr / lib / php5 / maxlifetime] && [-d / var / lib / php5] && find / var / lib / php5 / -type f -cmin + $(/ usr / lib / php5 / maxlifetime)-print0 | xargs -n 200 -r -0 rm)
 Jun 2 17:39:43 sajo-laptop sm-mta [9372]:o52LHK4s007585:to =,ctladdr =(33/33),delay = 03:22:18,xdelay = 00:06:28,mailer = esmtp, pri = 1470404,relay = c.mx.mail.yahoo.com。  [206.190.54.127],dsn = 4.0.0,stat = Deferred:连接超时c.mx.mail.yahoo.com。
 Jun 2 17:39:50 sajo-laptop sm-mta [9149]:o51I8ieV004377:to =,ctladdr =(33/33),delay = 1 + 06:31:06,xdelay = 00:03:57,mailer = esmtp,pri = 6601668,relay = alt4.gmail-smtp-in.l.google.com。  [74.125.79.114],dsn = 4.0.0,stat = Deferred:连接超时了alt4.gmail-smtp-in.l.google.com。
 Jun 2 17:40:01 sajo-laptop CRON [9523] :( smmsp)CMD(test -x /etc/init.d/sendmail && / usr / share / sendmail / sendmail cron-msp)

有谁知道我可以永久摆脱这些消息? 作为一个便笺,我也想知道是否有一种方法来设置sendmail来“发送”电子邮件。 在那儿?

    已发送或试图发送的消息存储在/var/spool/mqueue 。 Sendmail尚未尝试排队的消息可以在/var/spool/mqueue-client

    所以试试这个(我假设你想摆脱队列中的所有消息):

    • 停止sendmail
    • rm /var/spool/mqueue/*
    • 如果你想在等待中删除消息, rm /var/spool/mqueue-client/*
    • 启动sendmail

    这将清除我们的队列文件夹,直到系统收到另一条消息。 您可以通过运行mailq (两个队列文件夹)或sendmail -bp (仅限于队列文件夹)进行双重检查。

    注: 对于大多数Linux发行版,您可以使用service sendmail <start|stop|restart>/etc/init.d/sendmail <start|stop|restart>来启动/停止服务。 这两个选项都有许多其他状态标志,可以通过在命令和服务中input状态标志来查看。

    您经常会发现从Sendmail的mqueue目录中删除文件的build议,例如rm /var/spool/mqueue/*或更糟糕的( rm -rf等)。 恕我直言,这是很危险的。 它会在很多情况下工作,但我build议系好安全带。 简单地从mqueue中删除所有文件可能会删除合法的消息。

    在删除队列消息之前停止Sendmail是一个很好的build议,特别是如果需要删除很多消息。 但是,如果只有less数消息被删除,或者如果定期清理队列,例如通过cron作业,则实际上不需要停止Sendmail。 在最坏的情况下,其中一条消息将重新排队,当您再次尝试时几乎肯定会被删除。

    相反,停止Sendmail(例如,在service sendmail stop Ubuntu中)可能是不够的。 即使停止了一些(子)进程可能仍然在运行。 人们必须等到他们完成(推荐)或杀死他们。

    为了安全地从mqueue中删除消息,您需要消息的队列ID。 这些ID显示在“sm-mta [:]:”之后的日志中。 您的日志摘录中的ID是o530SlbK009365o4VHn3cw003597 ,…对于每个ID,2个文件存储在mqueue中,一个以“qf”开头,另一个以“df”开头。

    mailq通常用于列出队列的内容。 它显示第一列中的ID。 此外,您应该咨询mailq的输出,因为它还显示消息是否处于活动状态/当前正在处理中。 例如

     -----Q-ID----- --Size-- -----Q-Time----- ------------Sender/Recipient---------- oBDDuKAB023946* 1058 Mon Dec 13 14:56 <[email protected] (Deferred: 450-4.2.1 The user you are trying to contact is re) <[email protected]> oBAEMuV8000429 1058 Fri Dec 10 15:22 <[email protected] (Deferred: 450-4.2.1 The user you are trying to contact is re) <[email protected]> 

    在此示例中,ID为oBDDuKAB023946的消息正在处理中,如附加星号所示。 其他消息是安全的被删除。 例如,为了删除ID为oBAEMuV8000429的消息使用

     rm /var/spool/mqueue/{d,q}foBAEMuV8000429 

    Brandon Hutchinson在从邮件队列中删除邮件中提供了一种更通用的删除排队邮件的方法。 Brandon还包括基于域名部分,电子邮件地址等删除邮件的脚本。布兰登的脚本对定期清理或大规模删除非常有帮助。

    尽pipe如此,即使是布兰登的剧本也没有关注消息的状态。 但是,很容易添加。 包括在他的脚本的开头

     # Get current mailq status my $mailq = `mailq`; 

    然后,在子例程“想要”的开始处添加一个检查来跳过活动消息,例如

     # skip if file is currently processed by MTA if ($mailq =~ /\n$queue_id\*/) { $debug && print "$queue_id is locked.\n"; last; } 

    HTH。 而且,请记住做备份:-)

    我有这个相同的问题,发现有2个文件夹排队消息。 / var / spool / clientmqueue /文件夹中的消息如果传递失败,则会以/ var / spool / mqueue /结尾。 从两个文件夹中删除文件是解决问题所必需的。

    rm -f / var / spool / clientmqueue / * rm -f / var / spool / mqueue / *

    我不认为这是一个cron脚本的工作,更可能是一个应用程序问题,或者与sendmail本身相关的东西; 无论如何,为了排除任何cron的工作,你可以暂停crond一段时间,看看这是否继续下去。

    我设法通过使用这个bash脚本来做到这一点

     for i in `sudo ls /var/spool/mqueue` do sudo rm -rv `echo /var/spool/mqueue/$i` done 

    对于只想从特定电子邮件地址(这里是[email protected] )中删除邮件的情况,这个命令适用于我:

     mailq | \ tail -n +2 | \ awk 'BEGIN { RS = "" } / mail@example\.com$/ { print $1 }' | \ tr -d '*!' | \ postsuper -d - 

    取自howtoforge.com的评论 。 看到相关的解决scheme和命令在一行。 (为了便于阅读,我使用了bash行连续)。

    一个非常类似的命令,允许删除取决于地址是否显示为发件人,收件人等在man postsuperfind,它说关于-d

    例如,要删除具有一个收件人[email protected]的所有邮件:

     mailq | tail -n +2 | grep -v '^ *(' | awk ´BEGIN { RS = "" } # $7=sender, $8=recipient1, $9=recipient2 { if ($8 == "[email protected]" && $9 == "") print $1 } ´ | tr -d '*!' | postsuper -d - 

    (我把报价改为使用tail -n +2 ,因为至less在一些现代化的系统上,它们的tail +2不再起作用了。)