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


18

我这里有一个很烦人的问题。我一直在测试一个应用程序,并为伪造的电子邮件地址创建了一些测试电子邮件(更不用说我的服务器实际上并未设置为可以发送电子邮件)。当然,sendmail无法发送这些消息,并且它们一直卡在sendmail队列中。我想手动删除已在队列中累积的邮件,而不是等待sendmail通常要停止重试的5天。

我正在使用Ubuntu 10.04,/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: Connection timed out with 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: Connection timed out with mx2.hotmail.com.
Jun  2 17:39:02 sajo-laptop CRON[9510]: (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: Connection timed out with 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: Connection timed out with 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为“伪造”发送电子邮件。在那儿?


好吧,我仍然没有找到解决这个问题的任何方法。看起来肯定是某种cron脚本导致了它的发生,但我不知道它在哪里存储排队的消息……
Steven Oxley 2010年

Answers:


28

已发送或正在尝试发送的消息存储在中/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>。这两个选项都有许多其他状态标志,可以通过在不带状态标志的情况下键入命令和服务来观察。


他说他已经这样做了,但是消息又出现了……
Massimo 2010年

1
但是,没有先停止sendmail,这就是重点。
weeheavy 2010年

好吧,看来您可能已经踏上了我错过的那一步。
史蒂芬·奥克斯利2010年

在Fedora 19上,我看到了/ var / spool / clientmqueue(以及/ var / spool / mqueue)
TomG 2013年

由于某种原因,即使使用sudo,这对我也不起作用(它会说no matches found)。因此,我chmod将文件夹编辑到了其中777,然后便可以删除其中的内容。
Sridhar Sarnobat 2014年

9

您通常会发现建议从Sendmail的mqueue目录中删除文件的建议,例如rm /var/spool/mqueue/*或更糟(rm -rf等)。恕我直言,这很危险。在许多情况下都可以使用,但我建议您系紧安全带。简单地从mqueue中删除所有文件可能会删除合法消息。

在删除排队的邮件之前停止Sendmail是一个好建议,尤其是在需要删除许多邮件的情况下。但是,如果只删除少量消息,或者定期清理队列(例如通过cron作业),则实际上无需停止Sendmail。在最坏的情况下,其中一条消息将被重新排队,当您再次尝试时,几乎可以肯定将其删除。

相反,停止Sendmail(例如在Ubuntu中使用service sendmail stop)可能不够。即使停止,某些(子)进程可能仍在运行。人们将不得不等到他们完成(推荐)或杀死他们。

为了安全地从消息队列中删除消息,您需要消息的队列ID。ID在日志中显示为“ sm-mta [...]:”之后。从你的日志摘录的ID是o530SlbK009365o4VHn3cw003597,...对于每一标识2个文件存储在mqueue中,一开始以“QF”,其他的开始“DF”。

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

-----Q-ID----- --Size-- -----Q-Time----- ------------Sender/Recipient----------
oBDDuKAB023946*    1058 Mon Dec 13 14:56 <vfn-l-bounces+so=example.com@fam.tuwi
                 (Deferred: 450-4.2.1 The user you are trying to contact is re)
                                         <so@example.com>
oBAEMuV8000429     1058 Fri Dec 10 15:22 <vfn-l-bounces+sby=example.com@fam.tuw
                 (Deferred: 450-4.2.1 The user you are trying to contact is re)
                                         <so@example.com>

在此示例中,oBDDuKAB023946当前正在处理ID 为ID的消息,由附加的星号表示。其他消息可以安全删除。例如,为了删除具有ID的消息,请oBAEMuV8000429使用

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

布兰登·哈钦森(Brandon Hutchinson)在“ 从邮件队列删除邮件”中提供了一种更加通用的方法来删除排队的邮件。Brandon还包括用于根据域部分,电子邮件地址等删除邮件的脚本。Brandon的脚本对于定期清理或大量删除非常有用。

但是,即使是Brandon的脚本也无法处理邮件的状态。但是,添加起来很容易。包括在他的脚本的开头

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

然后,在子例程“ wand”的开始处添加检查以跳过活动消息,例如

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

HTH。并且,请记住进行备份:-)


4

我遇到了同样的问题,发现有2个带有排队消息的文件夹。如果无法传递,则文件夹/ var / spool / clientmqueue /包含以/ var / spool / mqueue /结尾的消息。要解决此问题,必须从两个文件夹中删除文件。

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


0

我不认为这是cron脚本的工作,它更可能是应用程序问题,或者与sendmail本身有关的事情。无论如何,要排除执行此任务的任何cron作业,您可以停crond一会儿,看看这种情况是否一直在发生。


0

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

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

因此,您打开一个子Shell只是为了调用echo和检索said的输出以echo用作的参数rm。即使忽略了sudo和的免费分支rm,该子外壳也很浪费。
Felix Frank

好吧,如果您有一个更“可接受”的解决方案,那将不会浪费时间来解释您的解决方案,而不仅仅是显示注释可能没有用。在此先感谢
Shu Hikari 2015年

2
很抱歉,如果遇到冒犯和自大的想法。更经济的方法是sudo find /var/spool/mqueue -maxdepth 1 -delete。我没有找到它必须指出什么是你特别的脚本问题。抱歉,缺乏机智。
菲利克斯·弗兰克

2
是的,但是现在您解释了您的观点,我完全理解了。道歉被接受,不用担心。谢谢:D
Shu Hikari 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.