Настройте procmail для соответствия внешнему списку адресов электронной почты при фильтрации писем
Мои скрипты fetchmail извлекают электронные письма из почтового ящика и помещают их в файл с именем mario, а затем выгружают в мою папку /var/mail/. Я пытаюсь настроить скрипт procmail для обработки mario; Под обработкой я имею в виду следующее: сценарий procmail должен фильтровать внешний текстовый файл (из списка), содержащий список известных адресов электронной почты. После совпадения mario / fromlist сообщение извлекается из mario и сохраняется в моей локальной папке входящих сообщений / папке.
В сети я нашел фрагмент кода, включая рецепт, который я ввел в свой контрольный файл procmail (.procmailrc), но, похоже, он не работает. Это код:
FROMFL=$MAIL/fromlist
FROMLS=formail -xFrom: | sed -e 's/*(.*)//;s/>.*//;s/.*[:]*//'`
:0
* ? fgrep -xi $FROMLS $FROMFL
$MAIL/inbox
Я думаю, что я обратился к sed
(см. мой вопрос о команде Sed и неизвестных шаблонах, найденных в сети), но я до сих пор не смог рассмотреть части formail и fgrep. Поэтому, когда я запускаю сценарий procmail, я получаю следующие журналы:
$ mailstat var/log/procmail.log
/bin/sh: 0: Can't open fgrep
/bin/sh: 1: grep: not found
/bin/sh: 1: sed: not found
/home/user/var/mail/reginbox/
procmail: [6880] Sat Jun 16 16:57:32 2018
procmail: Acquiring kernel-lock
procmail: Assigning "FROMFL=/home/user/var/mail/fromlist"
procmail: Assigning "FROMLS="
procmail: Assigning "LASTFOLDER=/home/user/var/mail/reginbox/msg.XXX"
procmail: Assigning "SHELL=/bin/sh"
procmail: Executing "fgrep,-xi,/home/user/var/mail/fromlist"
procmail: Executing "formail -xFrom: | sed -e `'s/.*<//; s/>.*//'`"
procmail: No match on "fgrep -xi /home/user/var/mail/fromlist"
procmail: Non-zero exitcode (127) from "fgrep"
procmail: Notified comsat: "user@0:/home/user/var/mail/reginbox/msg.XXX"
procmail: Opening "/home/user/var/mail/reginbox/msg.XXX"
Похоже, что formail не может полностью извлечь строки, в которых находится "From:", что означает, что адреса электронной почты в этих строках не выделяются из остальных командой SED и не сравниваются с текстовым файлом со списком электронные письма (из списка), поэтому в журнале отображается сообщение "Нет совпадения".
Пожалуйста, вы можете помочь выяснить, где все это ломается?
1 ответ
Синтаксис для запуска внешней команды
VARIABLE=`command to run`
Вам не хватает начального обратного удара, поэтому вы работаете эффективно
FROMLS="formail"
-xFrom: | sed etc is a syntax error
В любом случае, рецепт для извлечения отправителя немного неточный, потому что он не справляется с различными вариациями форматов адресов электронной почты. Более надежное, но немного сложное для понимания решение
FROMLS=`formail -rtzxTo:`
что делает formail
генерировать ответ -rt
затем из сгенерированного ответа извлечь To:
адрес, который, конечно, теперь указывает на первоначального отправителя. По дизайну, formail
только помещает фактический адрес электронной почты отправителя входного сообщения в To:
заголовок, когда он генерирует ответ, так что это то, что вы будете извлекать.
При этом ваш сценарий должен технически работать до такой степени, что он сможет извлечь соответствующие сообщения и скопировать их в нужную папку назначения. Вот короткая демонстрация:
tripleee$ cd /tmp
tripleee$ echo moo@example.com >fromlist
tripleee$ cat one.rc
# temporary hack
SHELL=/bin/sh
MAILDIR=/tmp
MAIL=.
VERBOSE=yes
FROMFL=$MAIL/fromlist
FROMLS=`formail -rtzxTo:`
:0
* ? fgrep -xi "$FROMLS" "$FROMFL"
$MAIL/inbox
tripleee$ procmail -m one.rc <<\:
From: ick@example.com
To: poo@example.org
Subject: no match
hello
:
procmail: [16406] Wed Jun 27 13:41:35 2018
procmail: Assigning "FROMFL=./fromlist"
procmail: Executing "formail,-rtzxTo:"
procmail: Assigning "FROMLS=ick@example.com"
procmail: Executing "fgrep,-xi,ick@example.com,./fromlist"
procmail: Non-zero exitcode (1) from "fgrep"
procmail: No match on "fgrep -xi ick@example.com ./fromlist"
Subject: no match
Folder: **Bounced** 61
tripleee$ procmail -m one.rc <<\:
From: moo@example.com
To: poo@example.org
Subject: match
hello
:
procmail: [16410] Wed Jun 27 13:41:37 2018
procmail: Assigning "FROMFL=./fromlist"
procmail: Executing "formail,-rtzxTo:"
procmail: Assigning "FROMLS=moo@example.com"
procmail: Executing "fgrep,-xi,moo@example.com,./fromlist"
procmail: Match on "fgrep -xi moo@example.com ./fromlist"
procmail: Assigning "LASTFOLDER=./inbox"
procmail: Opening "./inbox"
procmail: Acquiring kernel-lock
Subject: match
Folder: ./inbox 68
Там нет никакого способа для procmail
удалить что-нибудь из входной папки. Если вы хотите сделать это, обычное решение - Procmail записывает несовпадающие сообщения в другую выходную папку, а затем копирует их обратно во входной файл. Чистый эффект состоит в том, что сообщения из исходной входной папки теперь разбиты на два файла, один с соответствующими и один с несоответствующими сообщениями.