Bagaimana cara saya menghapus pesan email secara permanen di antrian sendmail dan mencegahnya kembali?

18

Saya punya masalah yang cukup menjengkelkan di sini. Saya telah menguji suatu aplikasi dan telah membuat beberapa e-mail percobaan ke alamat e-mail palsu (belum lagi server saya tidak benar-benar diatur untuk mengirim e-mail). Tentu saja, sendmailtidak dapat mengirim pesan-pesan ini dan mereka telah terjebak dalam sendmailantrian. Saya ingin menghapus secara manual pesan yang telah menumpuk di antrian alih-alih menunggu 5 hari yang sendmailbiasanya diperlukan untuk berhenti mencoba lagi.

Saya menggunakan Ubuntu 10,04 dan /var/spool/mqueue/merupakan direktori di mana setiap cara saya baca membaca email yang disimpan dalam antrian. Ketika saya menghapus file dalam direktori ini, sendmailberhenti mencoba memproses e-mail sampai apa yang tampak sebagai skrip cron berjalan dan mengisi kembali direktori ini dengan pesan yang tidak ingin saya kirim. Inilah beberapa baris dari saya 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)

Adakah yang tahu bagaimana saya bisa menyingkirkan pesan-pesan ini secara permanen? Sebagai catatan tambahan, saya juga ingin tahu apakah ada cara untuk mengatur sendmailpengiriman email "palsu". Disana?

Steven Oxley
sumber
Yah, saya masih belum menemukan solusi untuk masalah ini. Jelas terlihat seperti semacam skrip cron yang menyebabkannya terjadi, tapi saya tidak tahu di mana ia menyimpan pesan yang antri ...
Steven Oxley

Jawaban:

28

Pesan-pesan yang telah dikirim atau sedang mencoba dikirim disimpan di /var/spool/mqueue. Pesan-pesan yang belum dicoba dikirim oleh Sendmail dapat ditemukan di /var/spool/mqueue-client.

Jadi coba ini (saya berasumsi Anda ingin menyingkirkan semua pesan dalam antrian):

  • Hentikan sendmail
  • rm /var/spool/mqueue/*
  • Jika Anda ingin menghapus pesan dalam menunggu rm /var/spool/mqueue-client/*,.
  • Mulai sendmail

Ini akan menghapus folder antrian Anda hingga sistem menerima pesan lain. Anda dapat mengecek dengan menjalankan mailq(kedua folder antrian), atau sendmail -bp(hanya folder antrian).

CATATAN: Dengan sebagian besar distribusi Linux Anda dapat memulai / menghentikan layanan dengan service sendmail <start|stop|restart>atau /etc/init.d/sendmail <start|stop|restart>. Kedua opsi memiliki banyak flag status lain yang dapat diamati dengan mengetikkan perintah dan layanan tanpa flag status.

berat
sumber
Dia mengatakan dia sudah melakukan ini, tetapi pesan-pesan muncul kembali ...
Massimo
1
Tetapi tanpa menghentikan sendmail terlebih dahulu, itu intinya.
weeheavy
Nah, tampaknya Anda mungkin telah menemukan langkah yang saya lewatkan.
Steven Oxley
Pada Fedora 19, saya melihat / var / spool / clientmqueue (serta / var / spool / mqueue)
TomG
Untuk beberapa alasan bahkan dengan sudo ini tidak akan berhasil untuk saya (katanya no matches found). Jadi saya mengedit chmodfolder 777dan kemudian dapat menghapus isinya.
Sridhar Sarnobat
9

Anda akan sering menemukan saran untuk menghapus file dari direktori mqueue Sendmail misalnya rm /var/spool/mqueue/*atau lebih buruk ( rm -rfdll). IMHO, ini sangat berbahaya. Ini akan berfungsi dalam banyak kasus tetapi saya sarankan untuk mengikat sabuk pengaman Anda. Hanya menghapus semua file dari mqueue mungkin menghapus pesan yang sah.

Untuk menghentikan Sendmail sebelum menghapus pesan yang antri adalah saran yang bagus terutama jika banyak pesan yang perlu dihapus. Namun, jika hanya beberapa pesan yang akan dihapus atau jika antrian dibersihkan secara rutin misalnya dengan menggunakan tugas cron, sebenarnya tidak perlu menghentikan Sendmail. Dalam kasus terburuk, salah satu pesan akan dikirim ulang yang hampir pasti akan dihapus ketika Anda mencoba lagi.

Sebaliknya, menghentikan Sendmail (misalnya di Ubuntu dengan service sendmail stop) mungkin tidak cukup. Bahkan ketika dihentikan beberapa proses (anak) mungkin masih berjalan. Seseorang harus menunggu sampai mereka selesai (disarankan) atau membunuh mereka.

Untuk menghapus pesan dari mqueue dengan aman, Anda memerlukan ID antrian pesan. ID ditampilkan dalam log setelah "sm-mta [...]:". ID dari kutipan log Anda adalah o530SlbK009365,, o4VHn3cw003597... Untuk masing-masing file ID 2 disimpan dalam mqueue, satu dimulai dengan "qf", yang lain dimulai dengan "df".

mailqumumnya digunakan untuk membuat daftar konten antrian. Ini menunjukkan ID di kolom pertama. Selanjutnya, Anda harus berkonsultasi mailqdengan output karena juga menunjukkan apakah pesan sedang aktif / sedang diproses. Misalnya

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

Dalam contoh ini pesan dengan ID oBDDuKAB023946sedang diproses, ditunjukkan oleh tanda bintang yang ditambahkan. Pesan lain aman untuk dihapus. Misalnya, untuk menghapus pesan dengan oBAEMuV8000429penggunaan ID

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

Pendekatan yang lebih fleksibel untuk menghapus pesan yang antri disediakan oleh Brandon Hutchinson dalam Menghapus email dari antrian email . Brandon juga menyertakan skrip untuk menghapus pesan berdasarkan bagian domain, alamat email dll. Skrip Brandon sangat membantu untuk pembersihan rutin atau penghapusan massal.

Namun demikian, bahkan skrip Brandon tidak memperhatikan status pesan. Namun, mudah untuk ditambahkan. Sertakan di awal skripnya

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

Kemudian, pada awal sub rutin "ingin" tambahkan tanda centang untuk melewati pesan aktif, misalnya dengan

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

HTH. Dan, ingatlah untuk membuat cadangan :-)

xebeche
sumber
4

Saya memiliki masalah yang sama dan menemukan bahwa ada 2 folder dengan pesan yang antri. Folder / var / spool / clientmqueue / memiliki pesan yang berakhir di / var / spool / mqueue / jika gagal dikirim. Menghapus file dari kedua folder itu diperlukan untuk menyelesaikan masalah.

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


sumber
0

Saya tidak berpikir ini adalah karya skrip cron, ini lebih cenderung menjadi masalah aplikasi, atau sesuatu yang terkait dengan sendmail itu sendiri; Lagi pula, untuk mengesampingkan pekerjaan cron melakukan ini, Anda bisa berhenti crondsebentar dan melihat apakah ini terus terjadi.

Massimo
sumber
0

Saya berhasil melakukan ini dengan menggunakan skrip bash ini

for i in `sudo ls /var/spool/mqueue`
do
    sudo rm -rv `echo /var/spool/mqueue/$i`
done
Shu Hikari
sumber
Jadi Anda membuka subkulit hanya untuk memanggil echodan mengambil output dari kata echountuk digunakan sebagai parameter rm. Bahkan mengabaikan garpu gratis sudodan rm, subshelling ini sia-sia.
Felix Frank
Nah, jika Anda memiliki solusi yang lebih 'dapat diterima', itu tidak akan membuang waktu untuk menjelaskan solusi Anda alih-alih hanya menunjukkan betapa tidak bergunanya sebuah komentar. Terima kasih sebelumnya
Shu Hikari
2
Maaf jika ini dianggap ofensif dan sombong. Pendekatan yang lebih ekonomis sudo find /var/spool/mqueue -maxdepth 1 -delete. Saya memang merasa penting untuk menunjukkan apa yang bermasalah dengan skrip Anda secara khusus. Permintaan maaf karena kurangnya kebijaksanaan.
Felix Frank
2
Yap, tetapi sekarang Anda menjelaskan maksud Anda dan saya sepenuhnya memahaminya. Dan permintaan maaf diterima, jangan khawatir. Terima kasih: D
Shu Hikari