The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"EXIM Пересылка одному из списка"
Отправлено DeadMorose, 16-Авг-21 09:53 
>[оверквотинг удален]
>   condition = ${lookup sqlite {UPDATE table ........} {yes} {yes}}
>   transport = delivery_rr
>   no_verify
>   no_more
> Этот роутер нужно разместить в секции "begin routers" непосредственно ПЕРЕД финальной доставкой
> почты (обычно local_user), т.к. для роутеров порядок имеет значение
> Т.к. роутеры на этапе приема запускаются дважды (при проверке и при доставке)
> мы указываем no_verify (не запускать при проверке), что-бы исключить двойное срабатывание.
> После срабатывания этого роутера нормальная (local_user) доставка уже не нужна - используем
> no_more

Сделал по аналогии с system_aliases

roundrobin_aliases:
  driver = redirect
  allow_fail
  allow_defer
  data = ${lookup mysql{servers=post.******.ru; SELECT rrAliasAddress('${quote_mysql:$local_part@${domain}}')}{$value}fail}
  headers_remove = "Subject"
  headers_add = "Subject: $h_subject ${lookup mysql{SELECT address FROM rrAddresses WHERE id = (SELECT lastAddressId FROM rrAliases WHERE alias = '${local_part}@${domain}')}}"
  user = mailnull
  group = mail
  file_transport = address_file
  pipe_transport = address_pipe
  skip_syntax_errors
  no_verify

Здесь rrAliasAddress - хранимая функция на сервере MySQL, в которой и происходит перебор адресов

Кроме того, потребовалось добавить пользователей, которые всегда получают такие письма (ответственные за конкретные задачи), и соответственно пришлось добавлять в заголовок инфу о том, кто конкретно получил письмо

CREATE DEFINER=`mail_admin`@`%` FUNCTION `rrAliasAddress`(rrAlias VARCHAR(128)) RETURNS varchar(128) CHARSET utf8
BEGIN
    DECLARE aliasAddress VARCHAR(128);
    DECLARE StaticUsers VARCHAR(256);
    DECLARE curraliasId INT;
    DECLARE nextAddressId INT;
    DECLARE currAddressId INT;
    
    SET aliasAddress = (SELECT `address` FROM `rrAddresses` WHERE `id` = (SELECT `currentAddressId` FROM `rrAliases` WHERE `alias` = rrAlias));
    IF (aliasAddress IS NULL) THEN
        SET aliasAddress = '';
    ELSE
        SET curraliasId = (SELECT `id` FROM `rrAliases` WHERE `alias` = rrAlias);
        SET currAddressId = (SELECT `currentAddressId` FROM `rrAliases` WHERE `id` = curraliasId);
        SET nextAddressId = (SELECT MIN(`id`) FROM `rrAddresses` WHERE ((`aliasId` = curraliasId) AND (`id` > currAddressId)));
        IF (nextAddressId IS NULL) THEN
            SET nextAddressId = (SELECT MIN(`id`) FROM `rrAddresses` WHERE `aliasId` = curraliasId);
        END IF;
        UPDATE `rrAliases` SET `currentAddressId` = nextAddressId, `lastAddressId` = currAddressId WHERE `id` = curraliasId;
    END IF;
    SET StaticUsers = (SELECT `userlist` FROM `rrStaticUsers` WHERE `id` = curraliasId);
    IF (StaticUsers IS NOT NULL) THEN
        SET aliasAddress = concat_ws(',', StaticUsers, aliasAddress);
    end if;
    RETURN aliasAddress;
END

Созданы 3 таблицы:
rrAliases -
id int(11) AI PK - идентификатор списка рассылки (1,2,3..... )
alias varchar(128) - адрес списка рассылки (типа sales@ourcompany.ru) обязательно должен существовать и не быть пустым!
currentAddressId int(11) - идентификатор получателя следующего письма
lastAddressId int(11) - идентификатор получателя предыдущего письма

rrAddresses -
id int(11) AI PK - идентификатор получателя (нумерация сквозная для всех списков)
aliasId int(11) - идентификатор списка рассылки
address varchar(128) - e-mail получателя

rrStaticUsers -
id int(11) PK - идентификатор списка рассылки
userlist varchar(256) - список "руководителей", через запятую

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
  Введите код, изображенный на картинке: КОД
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру