Назад | Перейти на главную страницу

procmailrc - изменить тему письма

Я хочу изменить тему для всех писем со списком подписок, добавив [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 сравнивать две строки действительно, действительно неэффективно и вообще ужасно.