Настройки mysql для работы с postfixadmin

Материал из wiki.lissyara.su
Перейти к: навигация, поиск

Проверка, включена ли поддержка mysql:

[root@server /usr/local/etc/exim]# exim -bV | grep mysql
Lookups: dbm dbmnz mysql

Рекомендую вынести всё касающееся mysql в отдельный файл:

/usr/local/etc/exim /000.mysql.conf

# Как подключаться к серверу MYSQL (сокет, база, логин, пароль)
hide mysql_servers      = (/tmp/mysql.sock)/eximbase/eximuser/eximpassword

# Список доменов
MYSQL_DOMAINS           = SELECT domain FROM domain WHERE transport = 'virtual' AND active='1'

# Перенаправления для доменов
MYSQL_ALIASES_DOMAINS   = SELECT goto FROM alias WHERE address='${quote_mysql:@$domain}' LIMIT 1

# Список алиасов
MYSQL_ALIASES           = SELECT goto FROM alias WHERE \
                          address='${quote_mysql:$local_part@$domain}' LIMIT 1

# Список пользователей
MYSQL_USERS             = SELECT username FROM mailbox WHERE \
                          username='${quote_mysql:$local_part@$domain}' LIMIT 1

# Список всех E-Mail адресов для рассылки по адресу vsem
MYSQL_VSEM              = SELECT username FROM mailbox

В основной конфигурации потребуется этот файл подключить:

Configure

# Настройки для mysql
.include /usr/local/etc/exim/000.mysql.conf
…
…
# Наши домены ( @ - домен нашего компьютера)
domainlist local_domains = @ : ${sg{${lookup mysql{MYSQL_DOMAINS}}}{\n}{:}}
…
…
Остальные настройки
…
…

Секцию роутеров можно сделать аналогично:

600.routers.conf

dnslookup:
  driver = dnslookup
  domains = ! +local_domains
  transport = remote_smtp
  ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
  no_more

# Все адреса user@mydomain2.ru или user@mydomain1.ru отправляем на user@mydomain.ru
# все пользователи у нас в @mydomain.ru, чтобы постоянно алиасы не прописывать.
# Если есть желание, можно отказаться от этого роутера в пользу rewrite.
mysql_aliases_domains:
  driver = redirect
  domains = +local_domains
  allow_fail
  allow_defer
  condition = ${lookup mysql{MYSQL_ALIASES_DOMAINS}{yes}{no}}
  data = ${quote:$local_part}${lookup mysql{MYSQL_ALIASES_DOMAINS}}

# Рассылка всем адресатам разрешена только для postmaster@mydomain.ru
mysql_vsem:
  driver = redirect
  domains = +local_domains
  local_parts = vsem
  allow_fail
  allow_defer
  senders = postmaster@mydomain.ru
  data = ${lookup mysql{MYSQL_VSEM}}

mysql_aliases:
  driver = redirect
  allow_fail
  allow_defer
  data = ${lookup mysql{MYSQL_ALIASES}}

mysql_user:
  driver = accept
  condition = ${lookup mysql{MYSQL_USERS}{yes}{no}}
  transport = dovecot_delivery
  cannot_route_message = Unknown user

Конфигурация rewrite для внутридоменного перенаправления: Был один, стало 2 запроса в mysql:

# Нужно для перенаправления для доменов через rewrite, а не роутер (acl_m1 - это $domain)
MYSQL_ALIASES_DOMAINS2  = SELECT address FROM alias WHERE address='${quote_mysql:@$acl_m1}' LIMIT 1

# Перенаправления для доменов
MYSQL_ALIASES_DOMAINS   = SELECT goto FROM alias WHERE address='${quote_mysql:@$acl_m1}' LIMIT 1

acl_check_rcpt:
# rewrite работает в DATA и $domain там нет. (Хотя в первом варианте он работает :-()
warn    set     acl_m1  = $domain

begin rewrite
"${if !eq{${lookup mysql{MYSQL_ALIASES_DOMAINS}}}{}{*${lookup mysql{MYSQL_ALIASES_DOMAINS2}}}fail}" \
"${quote:$local_part}${lookup mysql{MYSQL_ALIASES_DOMAINS}}"  Eh

Тут есть баги:
exim -bt работать не будет, т.к. переменная acl_m1 у него пустая.

Testing dikens3@birnn.ru
search_open: mysql "NULL"
search_find: file="NULL"
 key="SELECT goto FROM alias WHERE address='@' LIMIT 1" partial=-1 affix=NULL starflags=0

и:
echo "Привет" | mail -s "Тема" user@mydomain.ru работать не будет для доменов-алиасов.
Может есть ещё какие баги, я в продакшен это не пускал.

Выкладываю только потому, что я полдня убил на рабочую конструкцию rewrite, а также для
демонстрации возможностей rewrite в exim.