ฉันจะล้างกล่องจดหมาย linux ด้วยอีเมลจำนวนมากได้อย่างไร [ปิด]


193

ฉันตั้งค่างาน cron แล้วและพวกเขาส่งผล crons ไปยังอีเมล ในช่วงหลายเดือนที่ผ่านมาฉันได้สะสมอีเมลจำนวนมาก

ตอนนี้คำถามของฉันคือฉันจะกำจัดอีเมลทั้งหมดเหล่านั้นจากกล่องจดหมายของฉันได้อย่างไร


1
ในกรณีที่คุณต้องการทำความสะอาดเฉพาะข้อความ cron และไม่ใช่ข้อความอื่น ๆ ให้ดูที่นี่: unix.stackexchange.com/questions/217143/…
Erel Segal-Halevi

3
ปิดเป็นหัวข้อนอก แต่มีประโยชน์มหาศาล
unfa

คำตอบ:


150

คุณสามารถลบ/var/mail/usernameไฟล์เพื่อลบอีเมลทั้งหมดสำหรับผู้ใช้ที่ต้องการ นอกจากนี้ยังอีเมลที่มีการส่งออก /var/spool/mqueueแต่ยังไม่ได้รับการส่งจะถูกเก็บไว้ใน


อีเมลที่สงสัยว่าได้รับอีเมล cron ทั้งหมดนั้นคือ cron_results@site.com ฉันแค่ต้องการกำจัดอีเมลทั้งหมดที่ได้รับในอีเมลนี้ทิ้งคนอื่นไว้เหมือนเดิม การลบ / var / www / ชื่อผู้ใช้จะเป็นการลบทั้งหมดใช่ไหม
anjan

3
usernameจะต้องถูกแทนที่ด้วยผู้ใช้ที่คุณต้องการลบอีเมล ในกรณีของคุณอีเมลที่ถูกส่งไปยังผู้ใช้ที่เรียกว่าดังนั้นคุณจะต้องลบcron_results /var/www/cron_results
EdoDodo

5
ไม่ใช่การจัดการข้อมูล Praxis ที่ดีจากภายนอกแอปพลิเคชัน หากมีตัวเลือกหรือคำสั่งที่สามารถทำงานได้ดีกว่าที่จะใช้ ตามที่ @timaschew ตอบแล้วคุณสามารถใช้คำสั่ง 'd' ในเครื่องมือจดหมาย
pocjoc

1
มีประโยชน์มากเมื่อ 'เมล' ตอบกลับด้วย 'หน่วยความจำไม่เพียงพอ - ถูกยกเลิก'
Herbert Van-Vliet

398

ทางเลือก:

mail -N
d *
quit

-Nยับยั้งการแสดงเริ่มต้นของส่วนหัวของข้อความเมื่ออ่านเมลหรือแก้ไขโฟลเดอร์เมล
d *ลบเมลทั้งหมด


6
ใช้งานไม่ได้กับ Debian 7
karatedog

4
มันใช้งานได้สำหรับฉันในเกือบ Debian 7.5 หรืออีกวิธีหนึ่งอาจต้องการลบอีเมลที่บันทึกไว้ทั้งหมดด้วยการพิมพ์> mboxในโฮมไดเร็กตอรี่นี่แค่ตัดทอนไฟล์ mbox
Ciantic

4
@andreas: เพียงแค่เพิ่มมันทำงานได้สำเร็จบน CentOS 6.5
Guillaume G.

3
ยังทำงานให้ฉันใน Debian Wheezy (7.6)
yuikonnu

2
ทำงานบนเซิร์ฟเวอร์ Ubuntu 14.04
นักเรียน

60

เพียงใช้:

mail
d 1-15
quit

ซึ่งจะลบข้อความทั้งหมดระหว่างหมายเลข 1 และ 15 d *ลบทั้งหมดใช้

ฉันเพิ่งใช้มันด้วยตัวเองบน Ubuntu 12.04.4 และมันใช้งานได้อย่างมีเสน่ห์

ตัวอย่างเช่น:

eric@dev ~ $ mail
Heirloom Mail version 12.4 7/29/08.  Type ? for help.
"/var/spool/mail/eric": 2 messages 2 new
>N  1 Cron Daemon           Tue Jul 29 17:43  23/1016  "Cron <eric@ip-10-0-1-51> /usr/bin/php /var/www/sandbox/eric/c"
 N  2 Cron Daemon           Tue Jul 29 17:44  23/1016  "Cron <eric@ip-10-0-1-51> /usr/bin/php /var/www/sandbox/eric/c"
& d *
& quit

จากนั้นตรวจสอบอีเมลของคุณอีกครั้ง:

eric@dev ~ $ mail
No mail for eric
eric@dev ~ $

สิ่งที่ทำให้คุณสะดุดคือคุณกำลังใช้งานxหรือexitออกจากการทำงานที่ย้อนกลับการเปลี่ยนแปลงระหว่างเซสชันนั้น


1
ไม่มีที่ว่างระหว่างเป็นอย่างน้อยในd* CentOS 7
CodeMed

7
ใช้exitแทนการquitสะดุดฉัน exitจะยกเลิกเซสชันดังนั้นอีเมลที่รอการลบจะยังคงสภาพเหมือนเดิม quitจะเขียนการเปลี่ยนแปลงกลับดังนั้นอีเมลที่ถูกลบจะถูกส่งไปที่จุดนั้น
Jason

d 1-15ทำงานบนเดเบียน 8 ขอบคุณ!
Tadej

ไม่ทำงานใน Red Hat d 1-15 ให้ 'ตัวเลขผิดกฎหมาย' ดังนั้น d *
Salvador Valencia Valencia

23

แทนที่จะลบฉันคิดว่าเราสามารถลบล้างไฟล์ได้เนื่องจากไฟล์จะถูกสร้างขึ้นหากบริการอีเมลยังคงเปิดอยู่ สิ่งต่อไปนี้จะทำงาน

cat /dev/null >/var/spool/mail/tomlinuxusr

และใช่ขอโทษที่ปลุกด้ายเก่านี้ขึ้นมา แต่ฉันรู้สึกว่าฉันสามารถมีส่วนร่วมได้


3
สำหรับคนขี้เกียจเพียงพิมพ์งานนี้ด้วย:> / var / spool / mail / unixuser
Salvador Valencia


6

ใน UNIX / Linux / Mac OS X คุณสามารถคัดลอกและแทนที่ไฟล์ได้ใช่ไหม? ดังนั้นวิธีแก้ปัญหานี้:

cp /dev/null /var/mail/root

2

หากคุณใช้ cyrus / sasl / imap บนเมลเซิร์ฟเวอร์ของคุณดังนั้นวิธีที่รวดเร็วและมีประสิทธิภาพในการล้างทุกอย่างในกล่องจดหมายที่เก่ากว่าจำนวนวันที่ระบุคือการใช้คำสั่งcyrus / imap ipurge ยกตัวอย่างเช่นที่นี่เป็นตัวอย่างที่เอาทุกอย่าง (ระวัง !!) เก่าแล้ว 30 วันนับจากผู้ใช้vleo ขอให้สังเกตว่าคุณต้องเข้าสู่ระบบในฐานะผู้ใช้cyrus (ผู้ดูแลระบบอีเมล imap):

[cyrus@mailserver ~]$ /usr/lib/cyrus-imapd/ipurge -f -d 30 user.vleo Working on user.vleo... total messages 4 total bytes 113183 Deleted messages 0 Deleted bytes 0 Remaining messages 4 Remaining bytes 113183


1

แทนที่จะใช้ "d" ทำไมไม่ "p" ฉันไม่แน่ใจว่า "p *" จะใช้งานได้หรือไม่ ฉันไม่ได้ลอง คุณสามารถ; อย่างไรก็ตามให้ใช้สคริปต์ต่อไปนี้ "

#!/bin/bash
#

MAIL_INDEX=$(printf 'h a\nq\n' | mail | egrep -o '[0-9]* unread' | awk '{print $1}')

markAllRead=
for (( i=1; i<=$MAIL_INDEX; i++ ))
do
   markAllRead=$markAllRead"p $i\n"
done
markAllRead=$markAllRead"q\n"
printf "$markAllRead" | mail

สำหรับผู้ที่มีความอยากรู้อยากเห็น "p" ย่อมาจาก "print"
Isius
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.