Удалить письма из определенного источника в mailx/BSD mail

Мне нужно удалить все письма из определенного источника. Я могу перечислить все электронные письма с f source@emailaddress.com но мне нужно выбросить его в нечто вроде awk и обратно в почту... или скопировать все номера заголовков писем по отдельности.

Есть ли более быстрый способ или способ, встроенный в программу, который сделает это автоматически?

2 ответа

procmail Пакет включает в себя удобный инструмент под названием formail который позволяет пользователю перебирать отдельные сообщения традиционного почтового ящика в стиле mbox. Мой подход к таким задачам состоял в том, чтобы разбить mbox на отдельные сообщения, использовать стандартные инструменты UNIX (grep, rm) для обработки сообщений, а затем повторно собрать почтовый ящик. Естественно, это должно быть сделано с sendmail процесс остановлен, поэтому новая почта не приходит во время работы. Необходимо только короткое время простоя.

Вы не говорите, на каком BSD вы работаете, но я возьму FreeBSD. Я также предполагаю, что вы используете bash для вашей оболочки, и что у вас есть 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: spammer@example.com' msg*.txt
$ (use less to spot-check a few or all of them)

Если файлы сообщений определены grep действительно сообщения, которые вы хотите удалить, тогда:

$ grep -lF '^From: spammer@example.com' 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/

Я думаю, что мы делаем это намного сложнее, чем должно быть; по крайней мере, когда дело доходит до OpenBSD 7.2, версии OpenBSD, которую я использую, и системы, в которой я выполнил следующую команду:mail(1)чтобы удалить электронную почту с определенного адреса:

      d source@emailaddress.com

Неинтерактивно:

      echo "d source@emailaddress.com" | mail -f
Другие вопросы по тегам