Сделал сам. Но тормозит. Появились ощутимые задержки доставки.
Но удобно пополнять базу. Но вернулся к размножению строк в maidroprc — быстрее работает.Код:
# путь к rc-файлу
# rc-файл инклюдом включен из корневого maildroprc
RC_PATH = "/usr/local/etc/courier/maildroprcs/bla-bla.ru/info/"
# завёл IMAP фолдер aMaildrop, от которого почкуются фолдеры для раскладки писем
# мне удобно так, но часть писем раскладывается в исторические фолдеры, для логики — все равно
SYSMSGS = ".aMaildrop.aSysmsgs/"
# имя файла БД с путем
# БД создается средствами makedat(1)
# из файла формата
# цифра(используется, как KEY) табуляция строка (используется, как VALUE)
# 1 apple.com
# 2 avaz.org
# ... и так далее
SUBJS_2SYSMSGS = $RC_PATH "subj2sysmsgs.gdbm"
# тут любая чушь и чтобы не пустая строка,
# пустая строка возвращается maildropgdbm как «ничего» при выборке из БД
# и используется c «ne» для контроля цикла выборки
GDBM_RESULT="NULL"
# ставим 0 перед каждым входом в цикл выборки из БД
GDBM_KEY = 0
# log для отладки
# лог-файл нужно определить в корневом maildroprc
log "Open DB file $SUBJS_2SYSMSGS"
CONN_RESULT=gdbmopen($SUBJS_2SYSMSGS, R)
log "Conn result is:$CONN_RESULT"
log "Key:$GDBM_KEY value:-$GDBM_RESULT-"
# начинаем цикл, выбирающий из БД значения по ключу
# ключ — цифра, значения — всяки тексты
# внутри цикла GDBM_KEY растет от 1 до конца файла БД
# когда GDBM_KEY больше числа записей, gdbmfetch вернет пустую строку
# и исполнение продлится дальше последней скобки цикла
# в GDBM_RESULT исходно заведомая чушь, исключающая false positives
while ($GDBM_RESULT ne "")
{
GDBM_KEY = $GDBM_KEY + 1
GDBM_RESULT=gdbmfetch($GDBM_KEY)
# для отладки, чё она там читает из БД
log "Key:$GDBM_KEY value:-$GDBM_RESULT-"
# тут выбираемые поштучно из базы значения
# можно сравнить с чем-нибудь из maildropfilter(7)
# скинуть письмо в куда-то и завершить таким образом rc-файл директивой «to»
# --------------------------------------------------
if (/^Subject:.*($GDBM_RESULT)/)
{
gdbmclose
log "Close current DB file $SUBJS_2SYSMSGS"
exception {
to $DEFAULT/$SYSMSGS
}
# there is nothing after "to", maildrop stops execution after "to" and exit
}
# эта фиг скобочка замыкает цикл
}
# если в этом цикле критерий не сработал -- фильтруем дальше,таким же циклом с БД
# или чем еще умеем, не забываем обнулять GDBM_KEY и заносить в GDBM_RESULT
# заведомую чушь перед началом цикла выборки из следующей БД