我需要删除特定来源的所有电子邮件。我可以使用列出所有电子邮件,但我不得不将其转储到 awk 之类的程序中,然后再转回邮件...或者单独复制所有电子邮件标题编号。f [email protected]
有没有更快的方法或集成到程序中可以自动完成的方法?
答案1
该procmail
软件包包含一个名为 的便捷工具formail
,它允许用户迭代传统 mbox 样式邮箱中的单个邮件。我处理此类任务的方法是将 mbox 拆分为单个邮件,使用标准 UNIX 工具(grep、rm)处理邮件,然后重新组装邮箱。当然,这需要在sendmail
停止进程的情况下完成,以便在您工作时不会收到新邮件。只需短暂停机即可。
你没有说你使用的是哪个 BSD,但我假设是 FreeBSD。我还假设你使用的是bash
shell,并且你对机器有 root 访问权限,或者至少有足够的 sudo 权限来启动/停止sendmail
你机器上的实例,并直接写入你的邮箱/var/mail/$USER
。
安装该procmail
包并阅读formail
手册页。
$ sudo pkg install procmail
$ man formail
创建一个干净的工作空间:
$ mkdir ~/work
$ cd ~/work
创建一个简单的脚本并使其可执行:
$ cat << EOF > cat-msg.sh
#!/bin/sh
cat > msg-$FILENO.txt
EOF
$ chmod 755 cat-msg.sh
另一个:
$ cat << EOF > split-mbox.sh
#!/bin/sh
export FILENO="00000"
formail -s cat-msg.sh < "$@"
EOF
$ chmod 755 split-mbox.sh
停止邮件服务器:
$ sudo service sendmail stop
将您的 mbox 拆分为当前目录中的多个文件:
./split-mbox.sh /var/mail/$USER
该命令会读取您的邮箱,并msg-#####.txt
在当前目录中创建文件。它不会写入或删除您的/var/mail/$USER
邮箱,因此不会造成任何损害。
使用grep
,确定msg-*.txt
要删除的文件,并检查其中几个文件,以确保您的正则表达式正确地仅针对要删除的消息。可以使用多个正则表达式传递,但必须确保每个正则表达式都没有任何误报。
$ grep -lF '^From: [email protected]' msg*.txt
$ (use less to spot-check a few or all of them)
如果所标识的消息文件grep
确实是您要删除的消息,则:
$ grep -lF '^From: [email protected]' msg*.txt | xargs rm -v
如果您想使用多个正则表达式来查找要删除的消息,您可以反复grep
使用不同的正则表达式并抽查这些匹配项等。
成功删除所有有问题的消息后,备份您的邮箱,将剩余的msg*.txt
文件写入您的邮箱,然后重新启动邮件服务器:
$ cp -vp /var/mail/$USER mbox-$USER
$ cat msg*.txt > /var/mail/$USER
$ sudo service sendmail start
如果您发现这些工具很方便,并希望保留它们以供将来使用,那么:
$ sudo mv -vi split-mbox.sh cat-msg.sh /usr/local/bin/
答案2
我认为我们把这件事搞得比实际需要的要复杂得多;至少对于 OpenBSD 7.2 来说是这样,这是我使用的 OpenBSD 版本,我在系统中运行以下命令来mail(1)
删除来自特定地址的电子邮件:
d [email protected]
非交互方式:
echo "d [email protected]" | mail -f