删除 mailx/BSD 邮件中特定来源的电子邮件

删除 mailx/BSD 邮件中特定来源的电子邮件

我需要删除特定来源的所有电子邮件。我可以使用列出所有电子邮件,但我不得不将其转储到 awk 之类的程序中,然后再转回邮件...或者单独复制所有电子邮件标题编号。f [email protected]

有没有更快的方法或集成到程序中可以自动完成的方法?

答案1

procmail软件包包含一个名为 的便捷工具formail,它允许用户迭代传统 mbox 样式邮箱中的单个邮件。我处理此类任务的方法是将 mbox 拆分为单个邮件,使用标准 UNIX 工具(grep、rm)处理邮件,然后重新组装邮箱。当然,这需要在sendmail停止进程的情况下完成,以便在您工作时不会收到新邮件。只需短暂停机即可。

你没有说你使用的是哪个 BSD,但我假设是 FreeBSD。我还假设你使用的是bashshell,并且你对机器有 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

相关内容