ฉันจะลบข้อความอีเมลในคิว sendmail อย่างถาวรและป้องกันไม่ให้กลับมาได้อย่างไร


18

ฉันมีปัญหาที่น่ารำคาญที่นี่ ฉันได้ทำการทดสอบแอปพลิเคชั่นและได้สร้างอีเมลทดสอบไปยังที่อยู่อีเมลปลอม (ไม่ต้องพูดถึงว่าเซิร์ฟเวอร์ของฉันไม่ได้ตั้งค่าให้ส่งอีเมลจริง ๆ ) แน่นอน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การส่งอีเมล "ปลอม" หรือไม่ มีอะไรบ้าง


ฉันยังไม่พบวิธีแก้ไขปัญหานี้ ดูเหมือนว่าจะเป็นสคริปต์ cron บางประเภทที่ทำให้เกิดขึ้น แต่ฉันไม่สามารถทราบได้ว่าจะเก็บข้อความที่อยู่ในคิวไว้ที่ไหน ...
Steven Oxley

คำตอบ:


28

/var/spool/mqueueข้อความที่ได้รับการส่งหรือกำลังพยายามที่จะถูกส่งไปเก็บไว้ใน ข้อความที่ Sendmail ยังไม่ได้พยายามเข้าคิวสามารถพบ/var/spool/mqueue-clientได้

ดังนั้นให้ลอง (ฉันคิดว่าคุณต้องการกำจัดข้อความทั้งหมดในคิว):

  • หยุด sendmail
  • rm /var/spool/mqueue/*
  • rm /var/spool/mqueue-client/*หากคุณต้องการที่จะลบข้อความที่อยู่ในการรอคอย
  • เริ่ม sendmail

วิธีนี้จะล้างโฟลเดอร์คิวของเราจนกว่าระบบจะได้รับข้อความอื่น คุณสามารถตรวจสอบซ้ำได้โดยเรียกใช้mailq(ทั้งโฟลเดอร์คิว) หรือsendmail -bp(เฉพาะโฟลเดอร์คิว)

หมายเหตุ: ด้วยลินุกซ์ที่สุดที่คุณสามารถเริ่ม / หยุดบริการด้วยด้วยหรือservice sendmail <start|stop|restart> /etc/init.d/sendmail <start|stop|restart>ตัวเลือกทั้งสองมีการตั้งค่าสถานะอื่น ๆ อีกมากมายซึ่งสามารถสังเกตได้โดยการพิมพ์คำสั่งและการบริการโดยไม่ต้องตั้งค่าสถานะ


เขาบอกว่าเขาทำมาแล้ว แต่ข้อความปรากฏตัวอีกครั้ง ...
มัสซิโม

1
แต่ถ้าไม่หยุด sendmail ก่อนนั่นเป็นประเด็น
weeheavy

ดูเหมือนว่าคุณอาจหลงตามขั้นตอนที่ฉันพลาดไป
Steven Oxley

ใน Fedora 19 ฉันเห็น / var / spool / clientmqueue (รวมถึง / var / spool / mqueue)
TomG

ด้วยเหตุผลบางอย่างแม้จะมี sudo นี้จะไม่ทำงานสำหรับฉัน (มันจะบอกว่าno matches found) ดังนั้นฉันจึงchmodแก้ไขโฟลเดอร์777และสามารถลบเนื้อหาได้
Sridhar Sarnobat

9

คุณมักจะพบข้อเสนอแนะในการลบไฟล์ออกจากไดเรกทอรี mqueue ของ Sendmail เช่นrm /var/spool/mqueue/*หรือแย่กว่านั้น ( rm -rfฯลฯ ) IMHO นี่เป็นอันตรายธรรมดา มันจะทำงานได้ในหลายกรณี แต่ฉันแนะนำให้คาดเข็มขัดนิรภัย เพียงแค่ลบไฟล์ทั้งหมดออกจาก mqueue อาจลบข้อความที่ถูกต้อง

หากต้องการหยุด Sendmail ก่อนที่จะลบข้อความที่อยู่ในคิวคำแนะนำที่ดีโดยเฉพาะถ้าจำเป็นต้องลบข้อความจำนวนมาก อย่างไรก็ตามหากมีเพียงไม่กี่ข้อความที่จะถูกลบออกหรือหากคิวถูกทำความสะอาดเป็นประจำเช่นโดยวิธีการทำงานของ cron ก็ไม่จำเป็นต้องหยุด Sendmail ในกรณีที่เลวร้ายที่สุดข้อความหนึ่งจะถูกจัดคิวใหม่ซึ่งจะถูกลบเกือบแน่นอนเมื่อคุณลองอีกครั้ง

ในทางตรงกันข้ามการหยุด Sendmail (เช่นใน Ubuntu ด้วยservice sendmail stop) อาจไม่เพียงพอ แม้ว่าเมื่อหยุดกระบวนการบางอย่าง (ลูก) อาจยังทำงานอยู่ ใครจะต้องรอจนกว่าพวกเขาจะเสร็จสิ้น (แนะนำ) หรือฆ่าพวกเขา

ในการลบข้อความออกจาก mqueue อย่างปลอดภัยคุณต้องมี ID คิวของข้อความ ID จะแสดงในบันทึกหลังจาก "sm-mta [... ]:" ID จากข้อความที่ตัดตอนมาของคุณคือo530SlbK009365,, o4VHn3cw003597... สำหรับไฟล์ IDs 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กำลังถูกประมวลผลแสดงโดยเครื่องหมายดอกจันที่ต่อท้าย ข้อความอื่น ๆ ปลอดภัยที่จะลบ ตัวอย่างเช่นเพื่อลบข้อความที่มีการoBAEMuV8000429ใช้ID

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

วิธีการที่หลากหลายมากขึ้นในการลบข้อความที่ถูกจัดคิวให้บริการโดยแบรนดอนฮัทชินสันในจดหมายลบจากคิวจดหมาย แบรนดอนยังรวมถึงสคริปต์เพื่อลบข้อความตามส่วนของโดเมนที่อยู่อีเมล ฯลฯ สคริปต์ของแบรนดอนนั้นมีประโยชน์อย่างมากสำหรับการล้างข้อมูลปกติหรือการกำจัดจำนวนมาก

อย่างไรก็ตามสคริปต์ของแบรนดอนยังไม่ได้รับการดูแลสถานะของข้อความ อย่างไรก็ตามมันง่ายที่จะเพิ่ม รวมที่จุดเริ่มต้นของสคริปต์ของเขา

# 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 และอย่าลืมทำการสำรองข้อมูล :-)


4

ฉันมีปัญหาเดียวกันนี้และพบว่ามี 2 โฟลเดอร์ที่มีข้อความที่อยู่ในคิว โฟลเดอร์ / var / spool / clientmqueue / มีข้อความที่ลงท้ายด้วย / var / spool / mqueue / หากไม่สามารถส่งได้ การลบไฟล์จากทั้งสองโฟลเดอร์นั้นเป็นสิ่งจำเป็นในการแก้ปัญหา

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


0

ฉันไม่คิดว่านี่เป็นงานของสคริปต์ cron มีแนวโน้มที่จะเป็นปัญหาเกี่ยวกับแอปพลิเคชันหรือสิ่งที่เกี่ยวข้องกับ sendmail เอง อย่างไรก็ตามเพื่อแยกแยะงาน cron ใด ๆ ที่ทำเช่นนี้คุณสามารถหยุดcrondชั่วขณะหนึ่งแล้วดูว่าสิ่งนี้ยังคงเกิดขึ้นอยู่หรือไม่


0

ฉันจัดการทำได้โดยใช้สคริปต์ทุบตีนี้

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

ดังนั้นคุณเปิด subshell เพียงเพื่อเรียกใช้echoและเรียกการส่งออกของกล่าวว่าสำหรับการใช้งานเป็นพารามิเตอร์ไปecho rmแม้จะไม่สนใจส้อมที่ไม่มีค่าของsudoและrmการแบ่งย่อยนี้ก็สิ้นเปลืองเปล่า ๆ
เฟลิกซ์แฟรงก์

ถ้าคุณมีวิธีการแก้ปัญหาที่ 'ยอมรับได้' จะไม่เสียเวลาในการอธิบายวิธีการแก้ปัญหาของคุณแทนที่จะแสดงให้เห็นว่าการแสดงความคิดเห็นที่ไร้ประโยชน์นั้นเป็นอย่างไร ขอบคุณล่วงหน้า
Shu Hikari

2
ขออภัยถ้าสิ่งนี้เกิดความไม่พอใจและหยิ่งผยอง sudo find /var/spool/mqueue -maxdepth 1 -deleteวิธีการทางเศรษฐกิจมากขึ้นจะเป็น ฉันพบว่าสิ่งสำคัญคือการชี้ให้เห็นว่าสคริปต์ของคุณมีปัญหาอะไร ขออภัยในการขาดไหวพริบ
เฟลิกซ์แฟรงค์

2
ใช่ แต่ตอนนี้คุณอธิบายประเด็นของคุณและฉันเข้าใจมันอย่างสมบูรณ์ และยอมรับคำขอโทษไม่ต้องกังวล ขอบคุณ: D
Shu Hikari
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.