- EXIM Пересылка одному из списка, universite, 21:34 , 30-Июн-21 (1)
Попросите менеджера уточнить ТЗ и бюджет. Разработка нового функционала почтовика может дорого обойтись.
- EXIM Пересылка одному из списка, Аноним, 22:42 , 30-Июн-21 (2)
> Появилась задача настроить Exim так, чтобы в одной группе письма распределялись получателям > последовательно - первое письмо - первому в группе, второе - второму > и т.д.Звучит как бред, поэтому может быть, объясните, чего именно желаете добиться таким странным способом?
- EXIM Пересылка одному из списка, DiabloPC_пробегал, 23:27 , 30-Июн-21 (3)
>> Появилась задача настроить Exim так, чтобы в одной группе письма распределялись получателям >> последовательно - первое письмо - первому в группе, второе - второму >> и т.д. > Звучит как бред, поэтому может быть, объясните, чего именно желаете добиться таким > странным способом?Юзкейс элементарный: скажем отдача заказов в интернет магазине манагерам по очереди.
- EXIM Пересылка одному из списка, DeerFriend, 02:47 , 01-Июл-21 (4)
> Юзкейс элементарный: скажем отдача заказов в интернет магазине манагерам по очереди.Для таких задач давно придумали Message Queue. А почта это не самый удобный инструмент для отслеживания событий.
- EXIM Пересылка одному из списка, DeadMorose, 03:28 , 01-Июл-21 (5)
> Юзкейс элементарный: скажем отдача заказов в интернет магазине манагерам по очереди.Да, что-то вроде, нужно равномерно загружать менеджеров. С телефонией на астериске никаких проблем нет - там это стандартный функционал. А вот в почте что-то никак. Есть мысль использовать router и queryprogram для конктретного адреса, типа zakaz@company.ru
- EXIM Пересылка одному из списка, Аноним, 06:57 , 01-Июл-21 (6)
>> Юзкейс элементарный: скажем отдача заказов в интернет магазине манагерам по очереди. > Да, что-то вроде, нужно равномерно загружать менеджеров. > С телефонией на астериске никаких проблем нет - там это стандартный функционал. > А вот в почте что-то никак.Боюсь, что реализовать такое средствами smtp-сервера (без написания собственных обработчиков почтовой очереди) будет немножко сложно. Можно попробовать извратиться через агентов доставки типа procmail или maildrop, но за успех такого предприятия лично я не поручусь. - EXIM Пересылка одному из списка, Pahanivo пробегал, 08:20 , 01-Июл-21 (7)
>> Юзкейс элементарный: скажем отдача заказов в интернет магазине манагерам по очереди. > Да, что-то вроде, нужно равномерно загружать менеджеров. > С телефонией на астериске никаких проблем нет - там это стандартный функционал. Сравним дак сравнил .... > А вот в почте что-то никак. > Есть мысль использовать router и queryprogram для конктретного адреса, типа zakaz@company.ru Выгребай ящик консольным почтовым клиентом и далее делай с письмом что хочешь. Вернее куда очередная шиза заведет если уж так хочется.
- EXIM Пересылка одному из списка, Аноним, 13:56 , 02-Июл-21 (14)
> С телефонией на астериске никаких проблем нет - там это стандартный функционал. Телефония на астериске, если менеджер не пришел/заболел/курит, отправит звонок другому. Вы же загоните письмо одному человеку, не зная, прочтет он его или нет - хоп и минус клиент.
- EXIM Пересылка одному из списка, Andrey, 08:49 , 01-Июл-21 (8)
>>> Появилась задача настроить Exim так, чтобы в одной группе письма распределялись получателям >>> последовательно - первое письмо - первому в группе, второе - второму >>> и т.д. >> Звучит как бред, поэтому может быть, объясните, чего именно желаете добиться таким >> странным способом? > Юзкейс элементарный: скажем отдача заказов в интернет магазине манагерам по очереди.Вам нужна ERP/CRM, а не почта.
- EXIM Пересылка одному из списка, Тот самый, 20:01 , 01-Июл-21 (9)
DeadMorose не слушайте весь этот бред про доработку exim, или установку CRM. Все решается значительно проще - через конфиг exim (весь необходимый функционал уже есть)Детально прорабатывать команды я не буду (сами справитесь). Предлагаю общую идею. Таблица - id(порядковый номер),address(e-mail),is_current(должен получить текущее письмо) подойдет.
- EXIM Пересылка одному из списка, Тот самый, 20:12 , 01-Июл-21 (10)
1) Потребуется создать новый транспорт. Например:delivery_rr: driver = pipe command = /usr/sbin/dovecot/deliver -d "${lookup sqlite \ {SELECT address FROM table WHERE is_current=1;}}" log_output = true return_output = false delivery_date_add = true envelope_to_add = true return_path_add = true Размещение этого блока в секции "begin transports" значения не имеет. Я использую Dovecot deliver в качестве LDA. Доставку легко можно изменить на Exim LDA (сами справитесь) - EXIM Пересылка одному из списка, Тот самый, 20:38 , 01-Июл-21 (11)
2) Создаем роутер для получателя mail_rr@domain.com:round_robin: driver = accept domains = +local_domains local_parts = mail_rr condition = ${lookup sqlite {UPDATE table SET is_current=1 WHERE bla_bla;} {yes} {yes}} condition = ${lookup sqlite {UPDATE table ........} {yes} {yes}} transport = delivery_rr no_verify no_more Этот роутер нужно разместить в секции "begin routers" непосредственно ПЕРЕД финальной доставкой почты (обычно local_user), т.к. для роутеров порядок имеет значение Т.к. роутеры на этапе приема запускаются дважды (при проверке и при доставке) мы указываем no_verify (не запускать при проверке), что-бы исключить двойное срабатывание. После срабатывания этого роутера нормальная (local_user) доставка уже не нужна - используем no_more
- EXIM Пересылка одному из списка, Тот самый, 20:49 , 01-Июл-21 (12)
Самое интересноеcondition = ${lookup sqlite {UPDATE table SET is_current=1 WHERE bla_bla;} {yes} {yes}} condition = ${lookup sqlite {UPDATE table ........} {yes} {yes}} Это по логике - условие для срабатывания роутера. НО, финальные {yes} {yes} делают эти условия всегда истинными. Таким образом здесь по сути не проверяются условия, а исполняются SQL манипуляции над базой.
Таких condition = ${lookup sqlite {SQL statement} {yes} {yes}} в роутере может быть много Сделать циклический перебор поля is_current=1 после каждого срабатывания роутера (т.е. доставки) в таблице средствами SQL надеюсь сами сможете - EXIM Пересылка одному из списка, Тот самый, 22:18 , 01-Июл-21 (13)
Небольшое добавлениеТ.к. роутер round_robin мы исключили из предварительной проверки при получении, то в этом случае сработает проверка в local_user. А там проверяется физическое наличие почтового ящика. Т.е. у пользователя, для которого организуется циклическая пересылка (в нашел случае mail_rr@domain.com), обязательно должен быть локальный почтовый ящик (в него ни чего не будет попадать, но быть он должен)
- EXIM Пересылка одному из списка, Ilugar, 14:15 , 04-Июл-21 (15)
> Небольшое добавление > Т.к. роутер round_robin мы исключили из предварительной проверки при получении, то в > этом случае сработает проверка в local_user. А там проверяется физическое наличие > почтового ящика. Т.е. у пользователя, для которого организуется циклическая пересылка > (в нашел случае mail_rr@domain.com), обязательно должен быть локальный почтовый ящик (в > него ни чего не будет попадать, но быть он должен) а для чего он тогда? протсо потому что так должно быть ?
- EXIM Пересылка одному из списка, DeadMorose, 09:53 , 16-Авг-21 (16)
>[оверквотинг удален] > 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) - список "руководителей", через запятую
- EXIM Пересылка одному из списка, xm, 23:28 , 21-Авг-21 (17)
> Появилась задача настроить Exim так, чтобы в одной группе письма распределялись получателям > последовательно - первое письмо - первому в группе, второе - второму > и т.д. > В БД создал таблицу - id(порядковый номер),address(e-mail),is_current(должен получить > текущее письмо) В Exim это делается элементарно в одностроковое выражение или в несколько строк роутером redirect. Всё таки Тьюринг-полный язык под капотом.
|