Procmail Заменить / добавить тему в пустое поле темы - PullRequest
0 голосов
/ 12 июня 2019

У меня есть рецепт, который, кажется, не может соответствовать адресу.

Я пробовал это:

* ^From.*address9\@gmail\.com

* ^From.*address9@gmail.com

* ^From.*address\[0-9\]\@gmail\.com

* ^From.*address\d\@gmail\.com

* ^From.*address\d@gmail.com

, но ни одна из вышеупомянутых работ ... Я полностью потерян.Похоже, регулярные выражения имеют собственную логику и шаблоны в procmail.

Вот мой полный рецепт.Адрес для сопоставления имеет 9 в конце, и это gmail.com. Когда я помещаю любой другой адрес электронной почты в это поле * ^ From. *, Он работает нормально, но этот не ... Вот мой полный рецепт.Условия для соответствия: добавить тег [Новый отчет], когда он приходит с address9@gmail.com, а поле темы пусто.Я был бы очень благодарен, если бы кто-то мог посоветовать, пожалуйста, так как я собираюсь сходить с ума, пытаясь понять, в чем здесь ошибка.Заранее большое спасибо!

Заголовок выглядит так:

From: Name Lastname <address9@gmail.com>
Date: Wed, 12 Jun 2019 20:37:17 +1200
Message-ID<CADxD3vdy5cW55mogOK5+543ngU7iFKjJcpDV3Q4YL772F=LdQ@mail.gmail.com>
Subject: 

1 Ответ

0 голосов
/ 12 июня 2019

Регулярные выражения довольно просты. Почти каждый персонаж просто соответствует самому себе. Так что если у вас есть (начало строки) F r o m :, за которым следует что-либо, за которым следует a d d r e s s 9 ... это должно совпадать.

Procmail не поддерживает различные расширения Perl, такие как \d или \t, и, конечно, нет необходимости использовать символы обратной косой черты, которые не имеют специального значения в регулярном выражении, например @. Если вы хотите сопоставить одну цифру, то есть [0-9] без каких-либо обратных слешей (они превратят [ и ] обратно в буквальные совпадения).

^Subject:\/.+ проверяет наличие хотя бы одного символа в заголовке Subject: и собирает все это в $MATCH. Этот не проверяет, что объект пуст. Возможно, вы хотите что-то вроде

# \t is not supported, replace with a literal tab character
* ^Subject:[ \t]+$

, где \t следует заменить буквенной вкладкой. Каждое сообщение должно содержать заголовок Subject:, поэтому оно всегда будет там, но если его значение полностью состоит из пробелов, это считается пустой темой. И, конечно, если заголовок пуст, нет необходимости захватывать его содержимое.

Сказав это, ваше выражение будет совпадать, если после двоеточия в Subject: будет хотя бы один пробел, так что, опять же, оно действительно должно совпадать в вашем тестовом примере, если в действительности нет абсолютно ничего в заголовок Subject:.

Так или иначе, если бы это была ваша проблема, рецепт From: мог бы действительно соответствовать, но условие Subject не совпадало. При ведении журнала Procmail VERBOSE каждое регулярное выражение с "соответствием" или "отсутствием совпадения" будет отображаться в файле журнала.

:0 fhw
* ^From.*address9@gmail\.com 
* ^Subject:[    ]*$
| /usr/bin/formail -i "Subject: [New Report]"

Или, возможно, вы хотите сделать это с любым заголовком Subject:? (На этот раз я использую правильную буквенную вкладку - проверьте, правильно ли вы копируете / вставляете это! Должен быть пробел и вкладка между [ и ].)

:0 fhw
* ^From.*address9@gmail\.com 
* ^Subject:[    ]*\/.*$
| /usr/bin/formail -i "Subject: [New Report] $MATCH"

Для устранения неполадок, возможно, взгляните на http://www.iki.fi/era/mail/procmail-debug.html

Переполнение стека Минимальный воспроизводимый пример Руководство также полезно. Вкратце, постарайтесь свести проблему к простейшему входному сообщению и простейшему рецепту, который ведет себя не так, как вы ожидаете, а затем, если вы не сможете уменьшить его дальше, внимательно взгляните на то, что у вас осталось. Общие причины путаницы включают

  • искаженные входные сообщения
    • Пустые строки в заголовках?
    • Заголовки, заключенные в несколько физических строк?
    • Pesky управляющие символы там, где их не должно быть, ни в сообщении, ни в вашем скрипте Procmail (не используйте редакторы Windows ^W)
  • необоснованные предположения
    • Regex не работает, как вы думали?
    • Регулярный диалект Procmail отличается, например, от В Perl? Онлайновые тестеры регулярных выражений обычно принимают набор функций регулярных выражений Perl (или иногда Javascript)
    • По умолчанию Procmail сопоставляет только заголовки; некоторые начинающие упускают это и удивляются, когда не находят строку, которая явно присутствует только в теле
    • MIME-кодирование передачи контента скрывает контент, который, как вы думаете, вы знали, был там?
    • Ваше регулярное выражение действительно должно соответствовать буквальному фрагменту текста в сообщении; Procmail не нормализует, например Извлечь только адрес отправителя в удобной форме для сопоставления.

... Да, и все любимые: убедитесь, что вы установили SHELL=/bin/sh прямо в верхней части вашего файла рецепта. За эти годы это стало источником многих совершенно загадочных неудач.

Вот короткая демонстрация, демонстрирующая, что ваш тестовый пример работает на меня:

tripleee@debian$ cat >test.msg
From: Name Lastname <address9@gmail.com>
Date: Wed, 12 Jun 2019 20:37:17 +1200
Message-ID<CADxD3vdy5cW55mogOK5+543ngU7iFKjJcpDV3Q4YL772F=LdQ@mail.gmail.com>
Subject: 

No fooling
^D

tripleee@debian$ cat >test.rc
SHELL=/bin/sh
DEFAULT=/dev/null
VERBOSE=yes

:0 fhw
* ^From.*address9\@gmail\.com 
* ^Subject:\/.+
| /usr/bin/formail -i "Subject: [New Report]$MATCH"
^D

tripleee@debian$ procmail -m test.rc <test.msg 
procmail: [3717] Wed Jun 12 13:38:55 2019
procmail: Match on "^From.*address9\@gmail\.com"
procmail: Assigning "MATCH="
procmail: Matched " "
procmail: Match on "^Subject:\/.+"
procmail: Executing " /usr/bin/formail -i "Subject: [New Report]$MATCH""
procmail: Assigning "LASTFOLDER=/dev/null"
procmail: Opening "/dev/null"
From address9@gmail.com  Wed Jun 12 13:38:55 2019
 Subject: [New Report] 
  Folder: /dev/null                             253
...