Jak trwale usunąć wiadomości e-mail z kolejki sendmail i zapobiec ich ponownemu pojawieniu się?

18

Mam tutaj dość irytujący problem. Testowałem aplikację i stworzyłem kilka testowych wiadomości e-mail na fałszywe adresy e-mail (nie wspominając o tym, że mój serwer tak naprawdę nie jest skonfigurowany do wysyłania wiadomości e-mail). Oczywiście sendmailnie jest w stanie wysłać tych wiadomości i utknęły w sendmailkolejce. Chcę ręcznie usunąć wiadomości, które gromadzą się w kolejce, zamiast czekać 5 dni, które sendmailzwykle kończą się ponowną próbą.

Korzystam z systemu Ubuntu 10.04 i /var/spool/mqueue/jest to katalog, w którym każde przeczytane instrukcje mówią, że wiadomości e-mail w kolejce są przechowywane. Kiedy usuwam pliki w tym katalogu, sendmailprzestaję przetwarzać wiadomości e-mail, dopóki nie zostanie uruchomiony skrypt, który wydaje się być cronem, i ponownie zapełni ten katalog wiadomościami, których nie chcę wysyłać. Oto kilka wierszy z mojego 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)

Czy ktoś wie, jak mogę trwale pozbyć się tych wiadomości? Na marginesie chciałbym również wiedzieć, czy istnieje sposób skonfigurowania sendmail„fałszywego” wysyłania wiadomości e-mail. Jest tu?

Steven Oxley
źródło
Nadal nie znalazłem rozwiązania tego problemu. Zdecydowanie wygląda na to, że jest to jakiś skrypt cron, który powoduje, że tak się dzieje, ale nie mogę zrozumieć, gdzie przechowuje kolejkowane wiadomości ...
Steven Oxley

Odpowiedzi:

28

Wiadomości, które zostały wysłane lub próbują zostać wysłane, są przechowywane w /var/spool/mqueue. Wiadomości, których Sendmail jeszcze nie próbował w kolejce, można znaleźć w /var/spool/mqueue-client.

Więc spróbuj tego (zakładam, że chcesz pozbyć się wszystkich wiadomości w kolejce):

  • Zatrzymaj sendmaila
  • rm /var/spool/mqueue/*
  • Jeśli chcesz usunąć wiadomości oczekujących, rm /var/spool/mqueue-client/*.
  • Uruchom sendmail

Spowoduje to wyczyszczenie folderów w kolejce, dopóki system nie otrzyma kolejnej wiadomości. Możesz sprawdzić dwukrotnie, uruchamiając mailq(oba foldery w kolejce) lub sendmail -bp(tylko folder w kolejce).

UWAGA: W przypadku większości dystrybucji Linuksa usługi można uruchamiać / zatrzymywać za pomocą service sendmail <start|stop|restart>lub /etc/init.d/sendmail <start|stop|restart>. Obie opcje mają wiele innych flag stanu, które można zaobserwować, wpisując polecenie i usługę bez flag statusu.

weeheavy
źródło
Powiedział, że już to zrobił, ale wiadomości pojawiły się ponownie ...
Massimo,
1
Ale nie zatrzymując najpierw sendmaila, o to chodzi.
weeheavy
Wygląda na to, że uderzyłeś o krok, za którym tęskniłem.
Steven Oxley,
W Fedorze 19 widzę / var / spool / clientmqueue (a także / var / spool / mqueue)
TomG
Z jakiegoś powodu nawet w przypadku sudo nie zadziałałoby to dla mnie (powiedziałoby no matches found). Udostępniłem więc chmodfoldery 777i mogłem usunąć zawartość.
Sridhar Sarnobat
9

Często znajdziesz sugestię, aby usunąć pliki z katalogu mqueue Sendmaila, na przykład rm /var/spool/mqueue/*lub gorzej ( rm -rfitp.). IMHO, to jest po prostu niebezpieczne. Będzie działać w wielu przypadkach, ale zalecamy zapięcie pasów bezpieczeństwa. Proste usunięcie wszystkich plików z mqueue może usunąć wiarygodne wiadomości.

Zatrzymanie Sendmaila przed usunięciem wiadomości oczekujących w kolejce jest dobrą radą, zwłaszcza jeśli trzeba usunąć wiele wiadomości. Jednak jeśli tylko kilka wiadomości ma zostać usuniętych lub jeśli kolejka jest regularnie czyszczona, np. Za pomocą zadania cron, w rzeczywistości nie ma potrzeby zatrzymywania Sendmaila. W najgorszym przypadku jedna z wiadomości zostanie ponownie umieszczona w kolejce, która prawie na pewno zostanie usunięta przy ponownej próbie.

Przeciwnie, zatrzymanie Sendmaila (np. W Ubuntu z service sendmail stop) może nie być wystarczające. Nawet po zatrzymaniu niektóre (potomne) procesy mogą nadal działać. Trzeba będzie poczekać, aż skończą (zalecane) lub zabić ich.

Aby bezpiecznie usunąć wiadomości z mqueue, potrzebujesz identyfikatorów kolejki wiadomości. Identyfikatory są wyświetlane w dzienniku po „sm-mta [...]:”. Identyfikatory z fragmentu dziennika to o530SlbK009365, o4VHn3cw003597... Dla każdego z identyfikatorów 2 pliki są przechowywane w mqueue, jeden zaczynający się na „qf”, a drugi na „df”.

mailqsłuży zwykle do wyświetlania zawartości kolejki. Pokazuje identyfikatory w pierwszej kolumnie. Co więcej, powinieneś skonsultować mailqwyniki, ponieważ pokazuje również, czy komunikat jest aktywny / jest aktualnie przetwarzany. Na przykład

-----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]>

W tym przykładzie wiadomość z identyfikatorem oBDDuKAB023946jest obecnie przetwarzana, pokazana przez dołączoną gwiazdkę. Inne wiadomości można bezpiecznie usunąć. Na przykład, aby usunąć wiadomość z oBAEMuV8000429użyciem identyfikatora

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

Bardziej wszechstronne podejście do usuwania wiadomości w kolejce zapewnia Brandon Hutchinson w sekcji Usuwanie poczty z kolejki pocztowej . Brandon zawiera również skrypty do usuwania wiadomości opartych na części domeny, adresie e-mail itp. Skrypty Brandona są bardzo pomocne przy regularnym czyszczeniu lub masowym usuwaniu.

Niemniej jednak nawet skrypty Brandona nie dbają o status wiadomości. Łatwo to jednak dodać. Uwzględnij na początku jego scenariuszy

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

Następnie na początku podprogramu „chciał” dodać zaznaczenie, aby pominąć aktywne wiadomości, np. Za pomocą

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

HTH. I pamiętaj, aby tworzyć kopie zapasowe :-)

xebeche
źródło
4

Miałem ten sam problem i stwierdziłem, że były 2 foldery z kolejkami wiadomości. Folder / var / spool / clientmqueue / zawierał wiadomości, które kończyły się w / var / spool / mqueue /, jeśli nie zostały dostarczone. Usunięcie plików z obu folderów było konieczne do rozwiązania problemu.

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


źródło
0

Nie sądzę, że jest to dzieło skryptu cron, bardziej prawdopodobne jest, że jest to problem z aplikacją lub coś związanego z samym sendmailem; tak czy inaczej, aby wykluczyć jakąkolwiek pracę crona, robiąc to, możesz po prostu zatrzymać się crondna chwilę i sprawdzić, czy tak się dzieje.

Massimo
źródło
0

Udało mi się to zrobić za pomocą tego skryptu bash

for i in `sudo ls /var/spool/mqueue`
do
    sudo rm -rv `echo /var/spool/mqueue/$i`
done
Shu Hikari
źródło
Więc otwieracie podpowłokę tylko po to, aby wywołać echoi pobrać dane wyjściowe wspomnianego echodo użycia jako parametr do rm. Nawet ignorowanie darmowych widelców sudoi rmta podpowłoka jest po prostu marnotrawstwem.
Felix Frank,
Cóż, jeśli masz bardziej „akceptowalne” rozwiązanie, wyjaśnienie swojego rozwiązania nie będzie stratą czasu, a nie tylko pokazanie, jak bezużyteczny może być komentarz. Z góry dziękuję
Shu Hikari
2
Przepraszam, jeśli spotkało cię to obraźliwie i arogancko. Byłoby bardziej ekonomiczne podejście sudo find /var/spool/mqueue -maxdepth 1 -delete. Uważam, że ważne jest wskazanie, co jest szczególnie problematyczne w twoim skrypcie. Przepraszamy za brak taktu.
Felix Frank
2
Tak, ale teraz wyjaśniłeś swój punkt widzenia i całkowicie go zrozumiałem. I przeprosiny przyjęte, nie martw się. Dzięki: D
Shu Hikari,