Таблица для Mysql:
Код: Выделить всё
# Создаём таблицу для запоминания E-Mail'ов получателей
DROP TABLE IF EXISTS `mylist`;
CREATE TABLE `mylist` (
`src_email` varchar(50) default NULL,
`dst_email` varchar(50) default NULL,
`record_expires` datetime NOT NULL,
PRIMARY KEY (`src_email`,`dst_email`)
) ENGINE=InnoDB DEFAULT CHARSET=koi8r COMMENT='Таблица E-Mail-ов получателей';
Определяем макросы в основном конфиге:
Код: Выделить всё
# Белый список E-Mail'ов
MYSQL_MYLIST = INSERT INTO mylist(src_email,dst_email,record_expires) VALUES ('$sender_address','$acl_m4@$acl_m5',DATE_ADD(now(), INTERVAL 10 DAY))
MYSQL_UPDATEMYLIST = UPDATE mylist SET record_expires=DATE_ADD(now(), INTERVAL 10 DAY) WHERE src_email='$sender_address' AND dst_email='$acl_m4@$acl_m5'
MYSQL_DELMYLISTEXPIRED = DELETE FROM mylist WHERE record_expires < now()
MYSQL_TESTMYLIST = SELECT CASE WHEN now() - record_expires > 0 THEN 2 ELSE 1 END FROM mylist WHERE src_email='$sender_address' AND dst_email='$acl_m4@$acl_m5'
MYSQL_TESTCLIENTMYLIST = SELECT CASE WHEN now() - record_expires > 0 THEN 2 ELSE 1 END FROM mylist WHERE dst_email='$sender_address' AND src_email='$local_part@$domain'
Далее добавляем в acl_smtp_data:
Код: Выделить всё
# Для наших пользователей записываем наш $sender_address и адрес получателя($local_part@$domain).
# Существуют записи для данной пары src-dst email? Если нет, вернёт 0.
warn
set acl_m19 = ${lookup mysql{MYSQL_TESTMYLIST}{$value}{0}}
# Если существует, изменяем поле record_expire
warn
condition = ${if and {{eq{$acl_m3}{}}{!eq{$acl_m19}{0}}}{yes}{no}}
set acl_m19 = ${lookup mysql{MYSQL_UPDATEMYLIST}}
# Если не существует такой записи, добавляем в базу.
warn
condition = ${if and {{eq{$acl_m3}{}}{eq{$acl_m19}{0}}}{yes}{no}}
set acl_m19 = ${lookup mysql{MYSQL_MYLIST}}
И правим acl_smtp_rcpt для принятия от клиентов в auto_whitelist:
Код: Выделить всё
# В acl_check_data: не работает проверка доменов. В переменной будет домен, если он наш, иначе пустая.
warn set acl_m3 = ${lookup mysql{MYSQL_DOMAINS}}
# В acl_check_data: не работает $local_part.
warn set acl_m4 = $local_part
warn set acl_m5 = $domain
# Белые списки
# Принимаем от пользователей (E-Mail'ов), которым мы посылали сообщения (10 дней максимум) 0 - Нет записи, 1 - Принимаем, 2 - Срок истёк.
warn set acl_m19 = ${lookup mysql{MYSQL_TESTCLIENTMYLIST}{$value}{0}}
accept domains = +local_domains
condition = ${if eq{$acl_m19}{1}{yes}{no}}
endpass
message = "Unknown user"
verify = recipient
Я сделал очистку с помощью exim(acl_smtp_rcpt - В конец):
Код: Выделить всё
# Очищаем в 12 часов список mylist c устаревшими записями каждого 1-го числа месяца
warn
set acl_m19 = ${substr{6}{4}{$tod_zulu}}
condition = ${if eq{$acl_m19}{0112}{yes}{no}}
set acl_m19 = ${lookup mysql{MYSQL_DELMYLISTEXPIRED}}
# Остальных прибиваем
deny message = relay not permitted
Остальное выше.
P.S. Делал так, т.к. не знал как делать поиск в поле datetime. Можно сделать лучше. Руки не доходят.