Удалить письма из определенного источника в 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