Код: Выделить всё
warn set acl_m3 = ${lookup mysql{MYSQL_DOMAINS}}
set acl_m4 = $local_part
set acl_m5 = $domain
Модератор: xM
Код: Выделить всё
warn set acl_m3 = ${lookup mysql{MYSQL_DOMAINS}}
set acl_m4 = $local_part
set acl_m5 = $domain
Завтра добавлю в скрипты и тебе отпишусь сюда.А макрос MYSQL_DOMAINS нигде до этого не определен, в результате чего экзим при загрузке ругается на неправильный SQL-запрос. Это ошибка или я чего-то пропустил?
Нет, т.к. данный запрос (SELECT ... ) никаких изменений в базе данных не производит.Я наугад поставил туда MYSQL_TESTCLIENTMYLIST, может ли у меня поэтому в бд в поле dst_email писаться просто "@" без локальной части и имени домена?
Не знаю.. Вполне может быть.Или это какие-то проблемы с присвоением значений set acl_m4 и set acl_m5?
]dikens3 писал(а):Нет, т.к. данный запрос (SELECT ... ) никаких изменений в базе данных не производит.
Код: Выделить всё
MYSQL_DOMAINS = SELECT domain FROM domains WHERE domain='${quote_mysql:$domain}' AND active='Y' LIMIT 1
Код: Выделить всё
warn
authenticated = *
set acl_m19 = ${lookup mysql{MYSQL_TESTMYLIST}{$value}{0}}
Код: Выделить всё
mysql> SELECT CASE WHEN now() - record_expires > 0 THEN 2 ELSE 1 END FROM mylist WHERE src_email='user@domain.ru' AND dst_email='user@bk.ru';
+--------------------------------------------------------+
| CASE WHEN now() - record_expires > 0 THEN 2 ELSE 1 END |
+--------------------------------------------------------+
| 2 |
+--------------------------------------------------------+
1 row in set (0.00 sec)
Код: Выделить всё
# Если существует, изменяем поле record_expire
warn
authenticated = *
condition = ${if and {{eq{$acl_m3}{}}{!eq{$acl_m19}{0}}}{yes}{no}}
set acl_m19 = ${lookup mysql{MYSQL_UPDATEMYLIST}}
Код: Выделить всё
# Эти правила срабатывают для каждого получателя
acl_check_rcpt:
# устанавливаем переменныя для белого списка
warn set acl_m3 = ${lookup mysql{MYSQL_TESTCLIENTMYLIST}}
set acl_m4 = $local_part
set acl_m5 = $domain
accept hosts = :
deny message = "Недопустимые символы в адресе"
domains = +local_domains
local_parts = ^[.] : ^.*[@%!/|]
deny message = "Недопустимые символы в адресе"
domains = !+local_domains
local_parts = ^[./|] : ^.*[@%!] : ^.*/\\.\\./
accept local_parts = postmaster
domains = +local_domains
require verify = sender
deny message = "HELO/EHLO обязано быть по SMTP RFC"
condition = ${if eq{$sender_helo_name}{}{yes}{no}}
# Принимаем сообщения от тех, кто аутентифицировался
accept authenticated = *
domains = +local_domains
endpass
message = "Неизвестный пользователь"
verify = recipient
# Проверяем, существует ли домен получателя
deny log_message = "Получателя не существует"
authenticated = *
!verify = recipient
# Белые списки:
# Для наших пользователей записываем наш $sender_address и адрес получателя($lo
# Существуют записи для данной пары 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_WHITELIST}}
# Рубаем нах, тех, кто подставляет свой IP в HELO
deny message = "Не надо пихать свой IP в качестве HELO!"
hosts = *:!+relay_from_hosts
condition = ${if eq{$sender_helo_name}\
{$sender_host_address}{true}{false}}
# Рубаем тех, кто в HELO пихает мой IP
deny condition = ${if eq{$sender_helo_name}\
{$interface_address}{yes}{no}}
hosts = !127.0.0.1 : !localhost : *
message = "Это мой IP-адрес! Пшёл прочь!"
# Рубаем тех, кто в HELO пихает только цифры
deny condition = ${if match{$sender_helo_name}\
{\N^\d+$\N}{yes}{no}}
hosts = !127.0.0.1:!localhost:*
message = "В HELO не могут быть тока цифры!"
# Рубаем хосты типа *adsl*; *dialup*; *pool*;....
deny message = "Не нравится мне Ваш хост..."
condition = ${if match{$sender_host_name} \
{adsl|dialup|pool|peer|dhcp} \
{yes}{no}}
# Рубаем тех, кто в блэк-листах.
deny message = "Ваш адрес в блэклисте - $dnslist_domain \n $dnslist_
dnslists = opm.blitzed.org : \
proxies.blackholes.easynet.nl : \
cbl.abuseat.org : \
bl.spamcop.net : \
bl.csma.biz : \
dynablock.njabl.org : \
# Задержка.
warn
# ставим дефолтовую задержку в 20 секунд
set acl_m0 = 15s
warn
# ставим задержку в 0 секунд своим хостам и
# дружественным сетям (соседняя контора :))
hosts = +relay_from_hosts : spaceweb.ru
set acl_m0 = 0s
warn
# пишем в логи задержку (если оно вам надо)
logwrite = Delay $acl_m0 for $sender_host_name \
[$sender_host_address] with HELO=$sender_helo_name. Mail \
from $sender_address to $local_part@$domain.
delay = $acl_m0
# Проверка получателя в локальных доменах.
accept domains = +local_domains
endpass
message = "В этом домене нет такого пользователя"
verify = recipient
# Проверяем получателя в релейных доменах
accept domains = +relay_to_domains
endpass
endpass
message = "В этом домене нет такого пользователя"
verify = recipient
# Проверяем получателя в релейных доменах
accept domains = +relay_to_domains
endpass
message = "Моя сервера не знать маршрут на этот хост..."
verify = recipient
# Разрешаем почту от доменов в списке relay_from_hosts
accept hosts = +relay_from_hosts
# Белые списки
warn set acl_m19 = ${lookup mysql{MYSQL_TESTCLIENTMYLIST}{$value}{0}}
accept domains = +local_domains
condition = ${if eq{$acl_m19}{1}{yes}{no}}
endpass
message = "Неизвестный пользователь"
verify = recipient
# Белые списки
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 = "Свободен. Это тебе не ОпенРелей."
Код: Выделить всё
warn
logwrite = :panic: "Переменная acl_m3: $acl_m3"
Код: Выделить всё
#!/bin/sh
# Тестирование от mail.ru
(echo "EHLO mxs.mail.ru"; echo "MAIL FROM:user@mail.ru"; echo "RCPT TO: user@mydomain.ru"; echo "DATA"; echo "Subject: test"; echo "."; echo "QUIT";) | exim -d -bhc 194.67.23.20 > testlog 2>&1
Вставил в конфиг до и после присвоения значений переменной. Вот так:dikens3 писал(а):warn
logwrite = :panic: "Переменная acl_m3: $acl_m3"
Код: Выделить всё
warn
logwrite = :panic: "Переменная acl_m4: $acl_m4"
# устанавливаем переменныя для белого списка
warn set acl_m3 = ${lookup mysql{MYSQL_DOMAINS}}
set acl_m4 = $local_part
set acl_m5 = $domain
warn
logwrite = :panic: "Переменная acl_m4: $acl_m4"
Код: Выделить всё
2008-04-15 16:05:44 "\360\305\322\305\315\305\316\316\301\321 acl_m4: "
Код: Выделить всё
processing "warn"
search_open: mysql "NULL"
search_find: file="NULL"
key="SELECT domain FROM domains WHERE domain='mail.mydomain.ru' AND active='Y' LIMIT 1" partial=-1 affix=NULL star
LRU list:
internal_search_find: file="NULL"
type=mysql key="SELECT domain FROM domains WHERE domain='mail.mydomain.ru' AND active='Y' LIMIT 1"
database lookup required for SELECT domain FROM domains WHERE domain='mail.mydomain.ru' AND active='Y' LIMIT 1
MySQL query: SELECT domain FROM domains WHERE domain='mail.mydomain.ru' AND active='Y' LIMIT 1
MYSQL new connection: host=localhost port=0 socket=NULL database=exim user=exim
MYSQL: query failed: Table [b]'exim.domains' doesn't exist[/b]
lookup deferred: MYSQL: query failed: [b]Table 'exim.domains' doesn't exist[/b]
warn: condition test deferred
LOG: MAIN
Т.е., получается, что изначально причиной того, что конфиг не работал, было неправильное указание MYSQL_DOMAINS. Дикенс, большое спасибо за помощь, может быть, осенью буду в Нижнем, как что - с меня пиво .Если любое условие в утверждении “warn” не может быть завершено (т.е. своего рода отсрочка), строки заголовков не добавляются, и сконфигурированные строки логов не записываются. Никакие дальнейшие условия или модификаторы в утверждении “warn” не обрабатываются. Инцидент логгируется, но ACL продолжает обрабатываться, со следующего утверждения.