Как я могу применить мои фильтры procmail ко входящей почте в maildir?

9

Прошлой ночью я подписался на список рассылки и обнаружил сегодня утром, что мой фильтр procmail не применяется ко многим сообщениям списка рассылки. Теперь у меня есть множество менее важных сообщений в списке рассылки, перемежающихся с более важными рабочими электронными письмами, которые находятся в моем почтовом ящике.

Можно ли повторно выполнить все электронные письма в моем почтовом ящике через мои фильтры procmail?

Примечание: я использую формат maildir

Кори Кляйн
источник
1
взгляните на lists.debian.org/debian-user/2006/06/msg00716.html
Ульрих
Это представляет собой частичное решение. В этом случае некоторые электронные письма будут определенно перенаправлены обратно в папку «Входящие». Кажется, что уже должно быть какое-то решение * nux для этой проблемы, о котором я просто не знаю, вместо того, чтобы писать скрипт для имитации существующего процесса доставки почты.
Кори Кляйн
Проблема в том, что procmail работает только с почтовыми сообщениями, он не работает с папками, mbox или чем-то еще - это означает, что вам придется либо имитировать доставку, либо использовать что-то вроде thunderbird и фильтровать его там.
Ульрих Дангел

Ответы:

3

Я верю, что это сработает. Вам нужно запустить, formailчтобы переформатировать почту и отправить ее обратно procmail.

Из каталога Maildir:

cat * | formail -s procmail

Джордж М
источник
3
Это на самом деле работает? Не оставит ли он все старые сообщения там, где они были?
CNST
2

Вы можете сделать это на месте, например так:

$ for m in Mail/{cur,new}/*; do echo $m; procmail <$m; rm $m; done

После этого вы должны удалить каждое оригинальное письмо, иначе procmail продублирует его.

Он также будет записывать все как новое. Я не уверен в хорошем способе справиться с этим.

Джейк
источник
Это может показаться расточительным на диске io: фильтрация procmail обычно выполняется только на основе заголовков, но такой конвейер приведет к тому, что все сообщение будет прочитано и снова записано на диск. Кроме того, если в procmail не хватит памяти или возникнут другие проблемы, вы все равно безоговорочно удалите файл (ой!), Что тоже выглядит довольно страшно. Я бы сказал, что это совершенно неприемлемое решение для maildir.
CNST
1
Это может быть улучшено постепенно, procmail < $m && rm $mвместо procmail < $m ; rm $mэтого, по крайней мере, сообщение не удаляется в случае сбоя procmail.
rrauenza
2

Если вы используете Mutt, вы можете направить письмо через procmail, а также удалить оригинал из папки «Входящие» с помощью ключевой команды, например:

Muttrc:

macro index y '<enter-command>unset wait_key<enter><tag-prefix><pipe-entry>/usr/bin/procmail /home/user/.procmailrc<enter><tag-prefix><delete-message><enter-command>set wait_key<enter>'

macro pager y '<enter-command>unset wait_key<enter><pipe-entry>/usr/bin/procmail /home/user/.procmailrc<enter><delete-message><enter-command>set wait_key<enter>'

найдено на https://mikeburnscoder.wordpress.com/2011/06/12/one-big-mutt-inbox-filtered-after-the-fact-using-procmail/

user3630647
источник
1

Кажется, что для этого нет хорошего решения: procmail, похоже, принимает только входящие сообщения stdin, что ограничивает возможности приложений maildir.

Я столкнулся с подобной ситуацией, и лучшим решением, которое соответствовало моим потребностям, было просто дублирование того, что я хотел procmailсделать, но чего он совершенно определенно не может сделать, с моим собственным небольшим сценарием, которого должно быть достаточно, если у вас есть только одно или два простых правила что вам нужно позаботиться о:

cd ~/Maildir/
sh -c 'for i in `egrep -l "^Delivered-To: perforce@freebsd.org" cur/*`; \
    do mv $i .FreeBSD.perforce/$i; done'

Это также не является оптимальным, но, по крайней мере, оно не должно страдать от ненужного ввода-вывода и потенциальных проблем с потерей данных.

CNST
источник