У меня тут довольно неприятная проблема. Я тестировал приложение и создал несколько тестовых писем на поддельные адреса электронной почты (не говоря уже о том, что мой сервер на самом деле не настроен для отправки электронной почты). Конечно, sendmail
не может отправлять эти сообщения, и они застревали в sendmail
очередь. Я хочу вручную удалить сообщения, которые накапливались в очереди, вместо того, чтобы ждать 5 дней, которые sendmail
обычно требуется, чтобы остановить повторные попытки.
Я использую 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
на "фальшивую" отправку электронной почты. Здесь?
Сообщения, которые были отправлены или которые пытаются отправить, хранятся в /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>
. Обе опции имеют много других флагов состояния, которые можно увидеть, набрав команду и службу без флагов состояния.
Вы часто найдете предложение удалить файлы из каталога mqueue Sendmail, например, с помощью rm /var/spool/mqueue/*
или хуже (rm -rf
и т.д.). ИМХО, это просто опасно. Это сработает во многих случаях, но я рекомендую пристегнуть ремни безопасности. Простое удаление всех файлов из mqueue может привести к удалению легитимных сообщений.
Остановить Sendmail перед удалением сообщений из очереди - хороший совет, особенно если нужно удалить много сообщений. Однако, если нужно удалить только несколько сообщений или если очередь очищается на регулярной основе, например с помощью задания cron на самом деле нет необходимости останавливать Sendmail. В худшем случае одно из сообщений будет повторно поставлено в очередь, которое почти наверняка будет удалено при повторной попытке.
Напротив, остановка Sendmail (например, в Ubuntu с service sendmail stop
) может быть недостаточно. Даже после остановки некоторые (дочерние) процессы могут все еще работать. Придется подождать, пока они закончат (рекомендуется), или убить их.
Для безопасного удаления сообщений из mqueue вам понадобятся идентификаторы очереди сообщений. Идентификаторы отображаются в журнале после «sm-mta [...]:». Идентификаторы из выдержки из журнала: o530SlbK009365
, o4VHn3cw003597
, ... Для каждого из идентификаторов в mqueue хранятся 2 файла, один из которых начинается с «qf», а другой - с «df».
mailq
обычно используется для вывода списка содержимого очереди. Он показывает идентификаторы в первом столбце. Кроме того, вам следует проконсультироваться 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>
В этом примере сообщение с ID oBDDuKAB023946
в настоящее время обрабатывается, отображается звездочкой. Остальные сообщения можно безопасно удалить. Например, чтобы удалить сообщение с ID oBAEMuV8000429
использовать
rm /var/spool/mqueue/{d,q}foBAEMuV8000429
Брэндон Хатчинсон предлагает более универсальный подход к удалению сообщений из очереди. Удаление почты из почтовой очереди. Brandon также включает скрипты для удаления сообщений на основе доменной части, адреса электронной почты и т. Д. Скрипты Brandon очень полезны для регулярной очистки или массового удаления.
Тем не менее, даже скрипты Брэндона не заботятся о статусе сообщений. Однако добавить легко. Включите в начало его скриптов
# 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