如何永久删除 sendmail 队列中的电子邮件并防止它们再次出现?

Ste*_*ley 21 sendmail queue

我这里有一个很烦人的问题。我一直在测试一个应用程序并创建了一些测试电子邮件到伪造的电子邮件地址(更不用说我的服务器并没有真正设置为发送电子邮件)。当然,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“假”发送电子邮件。在那儿?

wee*_*avy 30

已发送或正在尝试发送的消息存储在/var/spool/mqueue. Sendmail 尚未尝试排队的邮件可以在 中找到/var/spool/mqueue-client

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

  • 停止发送邮件
  • rm /var/spool/mqueue/*
  • 如果要删除等待中的消息,rm /var/spool/mqueue-client/*.
  • 启动发送邮件

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

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


xeb*_*che 10

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

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

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

为了安全地从 mqueue 中删除消息,您需要消息的队列 ID。ID 显示在日志中“sm-mta[...]:”之后。您的日志摘录中的 ID 是o530SlbK009365, o4VHn3cw003597, ... 对于每个 ID,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>
Run Code Online (Sandbox Code Playgroud)

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

rm /var/spool/mqueue/{d,q}foBAEMuV8000429
Run Code Online (Sandbox Code Playgroud)

Brandon Hutchinson 在从邮件队列删除邮件中提供了一种更通用的方法来删除排队的邮件。Brandon 还包括根据域部分、电子邮件地址等删除邮件的脚本。Brandon 的脚本对于定期清理或批量删除非常有帮助。

尽管如此,即使是 Brandon 的脚本也没有处理消息的状态。但是,添加很容易。包括在他的脚本的开头

# Get current mailq status
my $mailq = `mailq`;
Run Code Online (Sandbox Code Playgroud)

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

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

哈。而且,记得备份:-)