Таблица для 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-ов получателей';
Код: Выделить всё
# Список наших доменов у меня хранится в базе mysql (себе можете делать что угодно)
MYSQL_DOMAINS = SELECT domain FROM domains WHERE domain='${quote_mysql:$domain}' AND active='Y' LIMIT 1
# Белый список 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'
Должно получиться следующее:
Код: Выделить всё
warn set acl_m3 = ${lookup mysql{MYSQL_DOMAINS}}
set acl_m4 = $local_part
set acl_m5 = $domain
...
...
...
# Принимаем аутентифицированных для нашего домена
accept authenticated = *
domains = +local_domains
endpass
message = "Unknown user"
verify = recipient
# Проверяем, существует ли домен получателя
deny log_message = Recipient verify failed
authenticated = *
!verify = recipient
# Для наших пользователей записываем наш $sender_address и адрес получателя($local_part@$domain).
# Существуют записи для данной пары src-dst email? Если нет, вернёт 0.
warn
authenticated = *
set acl_m19 = ${lookup mysql{MYSQL_TESTMYLIST}{$value}{0}}
# Если существует, изменяем поле record_expire
warn
authenticated = *
condition = ${if and {{eq{$acl_m3}{}}{!eq{$acl_m19}{0}}}{yes}{no}}
set acl_m19 = ${lookup mysql{MYSQL_UPDATEMYLIST}}
# Если не существует такой записи, добавляем в базу.
warn
authenticated = *
condition = ${if and {{eq{$acl_m3}{}}{eq{$acl_m19}{0}}}{yes}{no}}
set acl_m19 = ${lookup mysql{MYSQL_MYLIST}}
...
...
Код: Выделить всё
# Белые списки
# Принимаем от пользователей (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
Код: Выделить всё
# Очищаем в 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. Можно сделать лучше. Руки не доходят.