Я хочу изменить тему для всех писем со списком подписок, добавив [BULK] в его. Похоже, что лучше всего это сделать в глобальном файле / etc / procmailrc. Но этот фильтр также отбрасывает все заголовки для некоторых писем (мои изменения разделены тире):
LOGFILE=/var/log/procmail.log
TRAP=/etc/webmin/virtual-server/procmail-logger.pl
:0wi
VIRTUALMIN=|/etc/webmin/virtual-server/lookup-domain.pl --exitcode 73 $LOGNAME
EXITCODE=$?
:0
* ?/bin/test "$EXITCODE" = "73"
/dev/null
EXITCODE=0
:0
* ?/bin/test "$VIRTUALMIN" != ""
{
INCLUDERC=/etc/webmin/virtual-server/procmail/$VIRTUALMIN
}
-----
:0
* ^List-Unsubscribe:.*
{
:0 hw
SUBJECT=| formail -xSubject:
:0 hfw
* ^List-Unsubscribe:.*
| /usr/bin/formail -i "Subject: [BULKMAIL] $SUBJECT"
}
-----
DEFAULT=$HOME/Maildir/
ORGMAIL=$HOME/Maildir/
DROPPRIVS=yes
Индивидуальный .procmailrc в правилах домашнего каталога пользователя с этим кодом работает отлично, но с ним трудно управлять.
Я не могу воспроизвести вашу проблему, и вы не публикуете никаких диагностических сообщений, но я могу предложить другой рецепт, который поможет избежать нескольких возможных ошибок.
Нет причин повторять List-Unsubscribe:
условия внутри фигурных скобок - если вы находитесь внутри фигурных скобок, вы знаете, что они совпадают.
Соглашение о жестком кодировании пути к formail
кажется неуклюжим (и вы не можете сделать это в одном из мест, где вы его вызываете), но если Procmail вызывается с действительно шатким PATH
это может быть причиной сбоя, если вы не указали полностью путь /usr/bin/formail
.
В любом случае, вы хотите, насколько это возможно, избегать внешних процессов. Procmail может извлекать заголовок Subject: в MATCH
и тогда вам просто понадобится сингл formail
вызов для успешного выполнения всего рецепта.
:0 hfw
* ^List-Unsubscribe:
* ^Subject:\/.+
| /usr/bin/formail -i "Subject: [BULKMAIL]$MATCH"
Специальный оператор \/
заставляет Procmail собирать соответствующую строку в переменную MATCH
, а затем мы используем это вместо внешнего formail -xSubject:
вы бежали. Вряд ли это важное изменение, но оно должно быть более эффективным, а также более простым для чтения и отладки.
(Завершающий подстановочный знак .*
является лишним в первом регулярном выражении; Procmail удовлетворен, если совпадение найдено в любом месте строки.)
Вы можете протестировать из командной строки (но это, конечно, требует, чтобы ваш файл рецепта не переопределял DEFAULT
):
root@vbvntv-docker:/# procmail DEFAULT=/dev/null VERBOSE=yes </tmp/nst.eml
procmail: [937] Thu Dec 1 06:57:20 2016
procmail: Rcfile: "/etc/procmailrc"
procmail: Assigning "PATH=/usr/local/bin:/usr/bin:/bin"
procmail: Match on "^List-Unsubscribe:"
procmail: Assigning "MATCH="
procmail: Matched " testing"
procmail: Match on "^Subject:\/.+"
procmail: Executing " /usr/bin/formail -i "Subject: [BULKMAIL]$MATCH""
procmail: Assigning "PATH=/root/bin:/usr/local/bin:/usr/bin:/bin"
procmail: Assigning "LASTFOLDER=/dev/null"
procmail: Opening "/dev/null"
procmail: Notified comsat: "root@0:/dev/null"
From foo@bar Thu Dec 1 06:57:20 2016
Subject: [BULKMAIL] testing
Folder: /dev/null 133
Если вы по-прежнему не можете заставить это работать, обновите свой вопрос аналогичной расшифровкой, что будет наиболее полезно. Дополнительные советы по устранению неполадок можно найти, например, в http://www.iki.fi/era/mail/procmail-debug.html
Когда вы убедитесь, что ваш код работает, возможно, вы захотите предпочесть formail -I
над formail -i
что делает сейчас довольно бесполезным Old-Subject:
в заголовках.
(Ваше описание прозы говорит BULK
но код говорит BULKMAIL
. Очевидно, что это легко изменить, если ваш код был неправильным.)
Материал Webmin действительно ужасен, но, очевидно, это не ваш собственный код. Кто-то должен сообщить ребятам из Webmin, что Procmail содержит механизм регулярных выражений, поэтому вызовите /bin/test
сравнивать две строки действительно, действительно неэффективно и вообще ужасно.