[exim-conf] увеличено количество запросов к БД MySQL при проверке комбинаций адресов отправителя и получателя

Victor Ustugov victor на corvax.kiev.ua
Сб Авг 31 02:29:32 EEST 2013


приветствую

количество запросов к БД MySQL при проверке комбинаций адресов
отправителя и получателя (значение `MYSQL' в переменной
confCHECK_ACCESS_COMPAT_BACKEND) увеличено с двух до четырех запросов.

в реальной жизни это понадобилось при написании плагина для roundcube
для добавления адресов отправителей в персональные черные/белые
списки, хранящиеся в MySQL.

первый запрос просто проверяет пару адресов отправителя и получателя.

второй запрос ищет адрес получателя среди identities пользователей
roundcube, потом ищет соответствующий ему адрес пользователя в таблице
users и уже его ищет в персональных черных/белых списках как адрес
получателя.

третий запрос идентичен первому с той лишь разницей, что в качестве
почтового ящика отправителя используется звездочка. это дает возможность
получателям добавлять в персональные черные/белые списки домены целиком.

четвертый запрос идентичен второму, лишь как и в третьем, в нем в
качестве мейлбокса отправителя указана звездочка.

на практике это выглядит громоздко, но оно вполне работает:


define(`confCHECK_ACCESS_COMPAT_MYSQL_QUERY', `SELECT CONCAT(result,
":", message, ":", log_message) FROM personal_access_list WHERE
recipient_address = "${quote_mysql:$local_part@$domain}" AND
sender_address = "${quote_mysql:$sender_address}"')dnl

define(`confCHECK_ACCESS_COMPAT_MYSQL_QUERY2', `SELECT
CONCAT(mail.personal_access_list.result, ":",
mail.personal_access_list.message, ":",
mail.personal_access_list.log_message) FROM mail.personal_access_list,
roundcube.identities, roundcube.users WHERE roundcube.identities.email =
"${quote_mysql:$local_part@$domain}" AND roundcube.identities.user_id =
roundcube.users.user_id AND roundcube.users.username =
mail.personal_access_list.recipient_address AND
mail.personal_access_list.sender_address =
"${quote_mysql:$sender_address}"')dnl

define(`confCHECK_ACCESS_COMPAT_MYSQL_QUERY3', `SELECT CONCAT(result,
":", message, ":", log_message) FROM personal_access_list WHERE
recipient_address = "${quote_mysql:$local_part@$domain}" AND
sender_address = "${quote_mysql:*@$sender_address_domain}"')dnl

define(`confCHECK_ACCESS_COMPAT_MYSQL_QUERY4',  `SELECT
CONCAT(mail.personal_access_list.result, ":",
mail.personal_access_list.message, ":",
mail.personal_access_list.log_message) FROM mail.personal_access_list,
roundcube.identities, roundcube.users WHERE roundcube.identities.email =
"${quote_mysql:$local_part@$domain}" AND roundcube.identities.user_id =
roundcube.users.user_id AND roundcube.users.username =
mail.personal_access_list.recipient_address AND mail.personal_acc
ess_list.sender_address = "${quote_mysql:*@$sender_address_domain}"')dnl


во втором и четвертом запросах есть только один ньюанс - запросы
выполняются к таблицам сразу двух баз данных, поэтому перед названиями
таблиц нужно указать названия баз данных. ну и пользователь, от имени
которого exim коннектится к mysqld, должен иметь права на чтение из
таблиц identities и users БД roundcube.

структура таблиц identities и users из базы roundcube штатная.

структура таблицы для хранения персональных черных/белых списков
простенькая:

CREATE TABLE `personal_access_list` (
  `sender_address` varchar(64) NOT NULL,
  `recipient_address` varchar(64) NOT NULL,
  `result` varchar(64) NOT NULL,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `message` varchar(256) NOT NULL,
  `log_message` varchar(256) NOT NULL,
  PRIMARY KEY (`recipient_address`,`sender_address`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


в результате запроса должно получить всего одно сборное поле (действие,
сообщение SMTP клиенту и сообщение в лог файл, разделенные двоеточиями),
которое идентично по формату настройкам для проверки комбинацией адресов
отправителя и получателя при их хранении в текстовом файле access-compat
(см. confCHECK_ACCESS_COMPAT и confCHECK_ACCESS_COMPAT_BACKEND в
m4/conf.default)

-- 
Best wishes Victor Ustugov  mailto:victor на corvax.kiev.ua
public GnuPG/PGP key:       http://victor.corvax.kiev.ua/corvax.asc
ICQ UIN: 371808614          JID: corvax на corvax.kiev.ua
nic-handle: CRV-UANIC



Подробная информация о списке рассылки exim-conf