dnl dnl Доставка в виртуальные maildir'ы в /var/vmail/$domain dnl dnl локальная доставка (список) dnl MBOX - доставка в mailbox'ы в /var/mail dnl с MBOX можно указывать через пробел: dnl FILTERS - использование .forward в качестве фильтров dnl PROCMAIL - использование .procmailrc в качестве фильтров dnl MDIR_USER - доставка в maildir'ы в $home/Maildir (еще не работает) dnl с MDIR_USER можно указывать через пробел: dnl FILTERS - использование .forward в качестве фильтров dnl PROCMAIL - использование .procmailrc в качестве фильтров dnl MDIR_VIRTUAL - доставка в виртуальные maildir'ы в /var/vmail/$domain dnl с MDIR_USER и MDIR_VIRTUAL можно указывать через пробел: dnl FILTERS - использование .forward в качестве фильтров dnl PROCMAIL - использование .procmailrc в качестве фильтров dnl PIPE - использование внешнего LDA dnl PIPE-LMTP - доставка через внешний LDA по LMTP dnl define(`confDELIVERY_TO', `MDIR_VIRTUAL FILTERS') dnl dnl dnl dnl при наличии MDIR_VIRTUAL в confDELIVERY_TO: dnl dnl корневой каталог Maildir'ов виртуальных доменов dnl define(`confVIRT_MDIR_ROOT', `/var/vmail') dnl dnl dnl пользователь, от имени которого доставляется почта в virtual maildir'ы dnl define(`confVIRT_MDIR_USER', `mailnull') dnl dnl группа, от имени которой доставляется почта в virtual maildir'ы dnl define(`confVIRT_MDIR_GROUP', `mail') dnl dnl dnl место хранение списка пользователей dnl SINGLE_FILE - хранение списка пользователей в файле типа passwd dnl DOMAINS_FILES - хранение списка пользователей в отдельных файлах для каждого домена dnl MYSQL - хранение списка пользователей в БД MySQL dnl PGSQL - хранение списка пользователей в БД PgSQL dnl SQLITE - хранение списка пользователей в БД SQLite dnl define(`confVIRT_MDIR_USERLIST', `DOMAINS_FILES') dnl dnl dnl путь к файлу типа passwd (если confVIRT_MDIR_USERLIST содержит SINGLE_FILE) dnl define(`confVIRT_MDIR_USERLIST_SINGLE', `/usr/local/etc/passwd.imap') dnl dnl dnl путь к отдельным файлам для каждого домена (если confVIRT_MDIR_USERLIST содержит DOMAINS_FILES) dnl определяется как confVIRT_MDIR_DOMAIN_SETTINGS/${domain}/passwd dnl dnl синтаксис SQL запроса к MySQL (если confVIRT_MDIR_USERLIST=MYSQL) dnl define(`confVIRT_MDIR_MYSQL', `SELECT id, maildir as home, maildir as maildir FROM passwd WHERE id="${quote_mysql:$local_part@$domain}"') dnl dnl define(`confVIRT_MDIR_MYSQL', `SELECT userid FROM dbmail_users WHERE userid="${quote_mysql:$local_part@$domain}"') dnl dnl define(`confVIRT_MDIR_MYSQL2', `SELECT alias FROM dbmail_aliases WHERE alias="${quote_mysql:$local_part@$domain}" OR alias="${quote_mysql:@$domain}"') dnl dnl dnl синтаксис SQL запроса к PgSQL (если confVIRT_MDIR_USERLIST=PGSQL) dnl changequote(<<, >>) dnl define(<>, <>)dnl dnl changequote dnl dnl синтаксис SQL запроса к SQLite (если confVIRT_MDIR_USERLIST=SQLITE) dnl define(`confVIRT_MDIR_SQLITE', `SELECT id, maildir as home, maildir as maildir FROM passwd WHERE id="${quote_sqlite:$local_part@$domain}"') dnl dnl define(`confVIRT_MDIR_SQLITE', `SELECT userid as id FROM dbmail_users WHERE userid="${quote_mysql:$local_part@$domain}"') dnl dnl define(`confVIRT_MDIR_SQLITE2', `SELECT alias FROM dbmail_aliases WHERE alias="${quote_mysql:$local_part@$domain}" OR alias="${quote_mysql:@$domain}"') dnl dnl dnl синтаксис LDAP запроса (если confVIRT_MDIR_USERLIST=LDAP) и преобразование результата выполнения запроса dnl confVIRT_MDIR_LDAP в путь к maildir получателя: dnl пример 1: dnl define(`confVIRT_MDIR_LDAP', `user="cn=Manager,dc=domain,dc=tld" pass=xxxxxxxx ldap://127.0.0.1/cn=Users,dc=domain,dc=tld?uid?sub?(uid=$local_part@$domain)') dnl dnl define(`confVIRT_MDIR_PATH_LDAP', confVIRT_MDIR_ROOT`/$acl_m_domain/$acl_m_local_part') dnl пример 2: dnl define(`confVIRT_MDIR_LDAP', `user="cn=Manager,dc=domain,dc=tld" pass=xxxxxxxx ldap://127.0.0.1/cn=Users,dc=domain,dc=tld?uid,homeDirectory?sub?(uid=$local_part@$domain)') dnl dnl define(`confVIRT_MDIR_PATH_LDAP', `/var/vmail/${extract{homeDirectory}{$address_data}}') dnl dnl пример 3 (AD): dnl define(`confVIRT_MDIR_LDAP', `user="user@domain.tld" pass=xxxxxxxx ldap://192.168.0.1/cn=Users,dc=domain,dc=tld?sAMAccountName?sub?(sAMAccountName=$local_part)') dnl dnl define(`confVIRT_MDIR_PATH_LDAP', `/var/vmail/AD/$address_data/') dnl dnl dnl права на maildir'ы и файлы с письмами dnl define(`confVIRT_MDIR_DIR_MODE', `0750') dnl dnl define(`confVIRT_MDIR_FILE_MODE', `0640') dnl dnl dnl место хранения алиасов: dnl SINGLE_FILE - хранение алиасов в текстовом файле virt_aliases dnl SINGLE_DBM - хранение алиасов в DBM файле virt_aliases.db dnl DOMAINS_FILES - хранение алиасов в отдельных текстовых файлах для каждого домена dnl DOMAINS_DBM - хранение алиасов в отдельных DBM файлах для каждого домена dnl MYSQL - хранение алиасов в БД MySQL (только при confVIRT_MDIR_USERLIST==MYSQL) dnl SQLITE - хранение алиасов в БД SQLite (только при confVIRT_MDIR_USERLIST==SQLITE) dnl define(`confVIRT_MDIR_ALIASES', `DOMAINS_DBM') dnl dnl dnl define(`confVIRT_MDIR_ALIASES_SINGLE', `CONFDIR/virt_aliases') dnl dnl define(`confVIRT_MDIR_MYSQL_ALIAS', `SELECT address FROM aliases WHERE alias="${quote_mysql:$local_part@$domain}"') dnl dnl define(`confVIRT_MDIR_SQLITE_ALIAS', `SELECT address FROM aliases WHERE alias="${quote_sqlite:$local_part@$domain}"') dnl dnl define(`confVIRT_MDIR_LDAP_ALIAS', `user="ldapuser@ad.domain.tld" pass=xxxxxxxxxxx \ dnl ldap://dc.ad.domain.tld/dc=ad,dc=domain,dc=tld?sAMAccountName?sub?\ dnl (&\ dnl (memberOf=CN=Mail Users,OU=Mail,DC=ad,DC=domain,DC=tld)\ dnl (memberOf=CN=alias_${local_part},OU=Mail,DC=ad,DC=domain,DC=tld)\ dnl )') dnl dnl define(`confVIRT_MDIR_LDAP_ALIAS2', `user="ldapuser@ad.domain.tld" pass=xxxxxxxxxxx \ dnl ldap://dc.ad.domain.tld/dc=ad,dc=domain,dc=tld?sAMAccountName?sub?\ dnl (&\ dnl (objectClass=user)\ dnl (sAMAccountName=$local_part)\ dnl (memberOf=CN=Mail Users,OU=Mail,DC=ad,DC=domain,DC=tld)\ dnl )') dnl dnl dnl путь к отдельным файлам для каждого домена (если confVIRT_MDIR_ALIASES содержит DOMAINS_FILES или DOMAINS_DBM) dnl определяется как confVIRT_MDIR_DOMAIN_SETTINGS/${domain}/aliases или dnl confVIRT_MDIR_DOMAIN_SETTINGS/${domain}/aliases.db соответственно dnl dnl использование квоты dnl NO - не использовать проверку квоты dnl TRANSPORT_MAILDIRSIZE - проверять квоту на этапе доставки с использованием файла maildirsize dnl TRANSPORT - проверять квоту на этапе доставки, каждый раз расчитывая размер maildir'а пользователя dnl VERIFY_RCPT_MAILDIRSIZE_DEFER - проверять квоту на этапе RCPT TO с использованием файла maildirsize; dnl в случае превышения квоты возвращать defer dnl VERIFY_RCPT_MAILDIRSIZE_REJECT - проверять квоту на этапе RCPT TO с использованием файла maildirsize; dnl в случае превышения квоты возвращать reject/deny dnl VERIFY_RCPT_CUSTOM_DEFER - проверять квоту на этапе RCPT TO; dnl в случае превышения квоты возвращать defer dnl VERIFY_RCPT_CUSTOM_REJECT - проверять квоту на этапе RCPT TO; dnl в случае превышения квоты возвращать reject/deny dnl define(`confVIRT_MDIR_QUOTA', `NO') dnl dnl dnl регулярное выражение для ограничения набора каталогов для подсчета dnl размера maildir'а при использовании TRANSPORT_MAILDIRSIZE в качестве dnl значения confVIRT_MDIR_QUOTA dnl define(`confVIRT_MDIR_QUOTA_DIR_REGEX', `^(?:cur|new|\.(?!Trash).*)$')dnl dnl dnl пользовательское условие проверки квоты, используется при указании dnl VERIFY_RCPT_CUSTOM_DEFER или VERIFY_RCPT_CUSTOM_REJECT в качестве dnl значения confVIRT_MDIR_QUOTA dnl define(`confVIRT_MDIR_QUOTA_CUSTOM_CONDITION', `${lookup mysql{SELECT passwd.quota_limit_bytes-quota.bytes AS free FROM passwd, quota WHERE passwd.id = "${quote_mysql:$local_part@$domain}" AND quota.username = "${quote_mysql:$local_part@$domain}"}{${if <{${eval:$value-${if <{$message_size}{1}{10k}{$message_size}}}}{0}{yes}{no}}}{no}}')dnl dnl dnl вычисление размера квоты: dnl define(`confVIRT_MDIR_QUOTA_SIZE', `0') dnl dnl define(`confVIRT_MDIR_QUOTA_SIZE', `100M') dnl dnl define(`confVIRT_MDIR_QUOTA_SIZE', `${if eq{$domain}{some.domain}{20M}{300M}}') dnl dnl define(`confVIRT_MDIR_QUOTA_SIZE', `${lookup mysql{SELECT quota FROM users WHERE user="${quote_mysql:$local_part@$domain}"}{$value}fail}') dnl dnl define(`confVIRT_MDIR_QUOTA_SIZE', `${lookup mysql{SELECT quota FROM users WHERE user="${quote_mysql:$local_part@$domain}"}{$value}{0}}') dnl dnl при TRANSPORT_MAILDIRSIZE и TRANSPORT нулевой размер квоты означает отсутствие квоты dnl временно: при VERIFY_RCPT_MAILDIRSIZE_DEFER и VERIFY_RCPT_MAILDIRSIZE_REJECT нулевой размер квоты означает превышение квоты dnl dnl при наличии MDIR_VIRTUAL и PIPE в confDELIVERY_TO: dnl dnl командная строка для запуска LDA: dnl define(`confVIRT_MDIR_PIPE', `/usr/local/libexec/dovecot/deliver -d $local_part@$domain') dnl dnl define(`confVIRT_MDIR_PIPE', `/usr/local/sbin/dbmail-smtp -d $local_part@$domain') dnl dnl dnl LDA будет запущен от имени пользователя, указанного в confVIRT_MDIR_USER, и от имени группы, указанной в confVIRT_MDIR_GROUP dnl dnl dnl типа карантина dnl SYSTEM - использовать общесистемный каратин dnl PERSONAL - использовать персональные карантины dnl define(`confCONTENT_SCANNING_QUARANTINE', `SYSTEM') dnl dnl dnl фолдер для доставки писем в персональные карантины dnl define(`confCONTENT_SCANNING_PERSONAL_QUARANTINE_FOLDER', `.spam') dnl dnl dnl командная строка для запуска LDA при доставке письма в персональный карантин: dnl define(`confVIRT_MDIR_PIPE_PERSONAL_QUARANTINE', `/usr/local/libexec/dovecot/deliver -d $local_part@$domain -m spam') dnl dnl dnl ############################## routers ############################## dnl # ifelse(SECTION, `ROUTERS', `dnl dnl ifdef(`confVIRT_MDIR_PATH',`',`define(`confVIRT_MDIR_PATH', confVIRT_MDIR_ROOT`/$domain/$local_part')') dnl ifdef(`confVIRT_MDIR_PATH',`',`define(`confVIRT_MDIR_PATH', `${lookup{$local_part}dsearch,ret=full,filter=subdir{${lookup{$domain}dsearch,ret=full,filter=dir{confVIRT_MDIR_ROOT}}}}')') dnl ifdef(`confVIRT_MDIR_PATH',`',`define(`confVIRT_MDIR_PATH', confVIRT_MDIR_ROOT`/$acl_m_domain/$acl_m_local_part')') ifdef(`confVIRT_MDIR_PATH',`',`define(`confVIRT_MDIR_PATH', confVIRT_MDIR_ROOT`/$domain_data/$local_part_data')') ifelse_strstr(confVIRT_MDIR_USERLIST, `LDAP', `dnl dnl ifdef(`confVIRT_MDIR_PATH_LDAP',`',`define(`confVIRT_MDIR_PATH_LDAP', confVIRT_MDIR_ROOT`/$domain/$local_part')') dnl ifdef(`confVIRT_MDIR_PATH_LDAP',`',`define(`confVIRT_MDIR_PATH_LDAP', `${lookup{$local_part}dsearch,ret=full,filter=subdir{${lookup{$domain}dsearch,ret=full,filter=dir{confVIRT_MDIR_ROOT}}}}')') dnl ifdef(`confVIRT_MDIR_PATH_LDAP',`',`define(`confVIRT_MDIR_PATH_LDAP', confVIRT_MDIR_ROOT`/$acl_m_domain/$acl_m_local_part')') ifdef(`confVIRT_MDIR_PATH_LDAP',`',`define(`confVIRT_MDIR_PATH_LDAP', confVIRT_MDIR_ROOT`/$acl_m_domain/$local_part_data')') ') # delivery to virtual maildirs DELIVERY(`virtual_aliases') dnl DELIVERY(`backup_remote_smtp') dnl DELIVERY(`backup_incoming') dnl sinclude(confSITE_DIR`/configure.backup_incoming_custom_router')dnl DELIVERY(`procmail') dnl DELIVERY(`virtual_filters') dnl ifdef(`confMAILERTABLE', `ifelse(confMAILERTABLE, `NO', `dnl', `dnl define(`SECTION', `ROUTERS_LOCAL')dnl DELIVERY(`mailertable')dnl define(`SECTION', `ROUTERS')dnl ')') define(`_TRANSPORT_PERSONAL_QUARANTINE_', `NO') ifelse_strstr(confCONTENT_SCANNING_QUARANTINE, `PERSONAL', `dnl ifelse_strstr(confDELIVERY_TO, `PIPE', `dnl ifdef(`confVIRT_MDIR_PIPE_PERSONAL_QUARANTINE', `ifelse(X`'confVIRT_MDIR_PIPE_PERSONAL_QUARANTINE, `X', `', `dnl define(`_TRANSPORT_PERSONAL_QUARANTINE_', `YES') ')') dnl ifdef(`confVIRT_MDIR_PIPE_PERSONAL_QUARANTINE', `ifelse(X`'confVIRT_MDIR_PIPE_PERSONAL_QUARANTINE, `X', `', `')') ',` dnl ifelse_strstr(confDELIVERY_TO, `PIPE', `') ifdef(`confCONTENT_SCANNING_PERSONAL_QUARANTINE_FOLDER', `ifelse(X`'confCONTENT_SCANNING_PERSONAL_QUARANTINE_FOLDER, `X', `', `dnl define(`_TRANSPORT_PERSONAL_QUARANTINE_', `YES') ')') dnl ifdef(`confCONTENT_SCANNING_PERSONAL_QUARANTINE_FOLDER', `ifelse(X`'confCONTENT_SCANNING_PERSONAL_QUARANTINE_FOLDER, `X', `', `')') ') dnl ifelse_strstr(confDELIVERY_TO, `PIPE', `') ') dnl ifelse_strstr(confCONTENT_SCANNING_QUARANTINE, `PERSONAL', `') ifelse_strstr(confVIRT_MDIR_USERLIST, `SINGLE_FILE', `dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_MAILDIRSIZE', `dnl virtual_domains_check_quota: driver = redirect domains = +local_domains # domains = lsearch,ret=key;CONFDIR/domains-local ### local_parts = ${lookup{$local_part@$domain}lsearch{confVIRT_MDIR_USERLIST_SINGLE}{$local_part}{}} ## local_parts = ${lookup{$local_part@$domain}lsearch{confVIRT_MDIR_USERLIST_SINGLE}{${sg{${sg{${extract{5}{:}{$value}}}{\N/$\N}{}}}{\N^.+/\N}{}}}{}} # local_parts = ${sg{${sg{${extract{5}{:}{$address_data}}}{\N/$\N}{}}}{\N^.+/\N}{}} local_parts = ${lookup{$local_part@$domain}lsearch,ret=key{confVIRT_MDIR_USERLIST_SINGLE}{${extract{1}{@}{$value}}}{}} condition = \ # ${lookup{$local_part@$domain}lsearch{confVIRT_MDIR_USERLIST_SINGLE}{\ ${if exists{confVIRT_MDIR_PATH/maildirsize}{\ ${if >=\ {${eval:\ ${sg{${sg{${readfile{confVIRT_MDIR_PATH/maildirsize}{\n}}}{\N^.+?\n\N}{}}}{\N(?s)\s+-?\d+\n\N}{+}}\ ${if <{$message_size}{1}{10k}{$message_size}}\ }}\ {confVIRT_MDIR_QUOTA_SIZE}\ {yes}{no}}\ }{no}}\ # }{yes}} ifdef(`confLOCAL_PART_SUFFIX', `ifelse(confLOCAL_PART_SUFFIX, `NO', `dnl', `dnl local_part_suffix = confLOCAL_PART_SUFFIX local_part_suffix_optional ')') group = confVIRT_MDIR_GROUP user = confVIRT_MDIR_USER verify_only allow_fail ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_MAILDIRSIZE_DEFER', `dnl allow_defer data = ${lookup{$local_part@$domain}lsearch{confVIRT_MDIR_USERLIST_SINGLE}{:defer:Over quota}{:fail:User $local_part@$domain is unknown}} ', ` data = ${lookup{$local_part@$domain}lsearch{confVIRT_MDIR_USERLIST_SINGLE}{:fail:Over quota}{:fail:User $local_part@$domain is unknown}} ') dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_MAILDIRSIZE_DEFER', `') ') dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_MAILDIRSIZE', `') ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_CUSTOM', `dnl virtual_domains_check_quota: driver = redirect domains = +local_domains # domains = lsearch,ret=key;CONFDIR/domains-local ### local_parts = ${lookup{$local_part@$domain}lsearch{confVIRT_MDIR_USERLIST_SINGLE}{$local_part}{}} ## local_parts = ${lookup{$local_part@$domain}lsearch{confVIRT_MDIR_USERLIST_SINGLE}{${sg{${sg{${extract{5}{:}{$value}}}{\N/$\N}{}}}{\N^.+/\N}{}}}{}} # local_parts = ${sg{${sg{${extract{5}{:}{$address_data}}}{\N/$\N}{}}}{\N^.+/\N}{}} local_parts = ${lookup{$local_part@$domain}lsearch,ret=key{confVIRT_MDIR_USERLIST_SINGLE}{${extract{1}{@}{$value}}}{}} condition = confVIRT_MDIR_QUOTA_CUSTOM_CONDITION ifdef(`confLOCAL_PART_SUFFIX', `ifelse(confLOCAL_PART_SUFFIX, `NO', `dnl', `dnl local_part_suffix = confLOCAL_PART_SUFFIX local_part_suffix_optional ')') group = confVIRT_MDIR_GROUP user = confVIRT_MDIR_USER verify_only allow_fail ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_CUSTOM_DEFER', `dnl allow_defer data = ${lookup{$local_part@$domain}lsearch{confVIRT_MDIR_USERLIST_SINGLE}{:defer:Over quota}{:fail:User $local_part@$domain is unknown}} ', ` data = ${lookup{$local_part@$domain}lsearch{confVIRT_MDIR_USERLIST_SINGLE}{:fail:Over quota}{:fail:User $local_part@$domain is unknown}} ') dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_CUSTOM_DEFER', `') ') dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_CUSTOM', `') virtual_domains: debug_print = "R: virtual_domains; domain: $domain; domain_data: $domain_data; local_part: $local_part; local_part_data: $local_part_data; address_data: $address_data" driver = accept ifelse(_TRANSPORT_PERSONAL_QUARANTINE_, `YES', `dnl # transport = ${if eq{$acl_m_quarantined}{}{delivery_to_virt_domain}{delivery_to_virt_domain_personal_quarantine}} transport = ${if and{\ {!eq{$h_X-Quarantined}{YES}}\ {!match{$h_X-Spam-Action:}{quarantined}}\ {eq{$acl_m_quarantined}{}}\ {!match{$h_X-Spam-Report:}{already_read}}\ {!forany{${sg{$acl_m_quarantined_per_rcpt}{, }{:}}}{eq{$item}{$local_part@$domain}}}\ }{delivery_to_virt_domain}{delivery_to_virt_domain_personal_quarantine}} ',`dnl ifelse(_TRANSPORT_PERSONAL_QUARANTINE_, `YES', `') transport = delivery_to_virt_domain ') dnl ifelse(_TRANSPORT_PERSONAL_QUARANTINE_, `YES', `') domains = +local_domains # domains = lsearch,ret=key;CONFDIR/domains-local ### local_parts = ${lookup{$local_part@$domain}lsearch{confVIRT_MDIR_USERLIST_SINGLE}{$local_part}{}} ## local_parts = ${lookup{$local_part@$domain}lsearch{confVIRT_MDIR_USERLIST_SINGLE}{${sg{${sg{${extract{5}{:}{$value}}}{\N/$\N}{}}}{\N^.+/\N}{}}}{}} local_parts = ${lookup{$local_part@$domain}lsearch,ret=key{confVIRT_MDIR_USERLIST_SINGLE}{${extract{1}{@}{$value}}}{}} # local_parts = ${sg{${sg{${extract{6}{:}{$address_data}}}{\N/$\N}{}}}{\N^.+/\N}{}} ## condition = ${lookup{$local_part@$domain}lsearch{confVIRT_MDIR_USERLIST_SINGLE}{yes}{no}} ## condition = ${if eq{$local_part_data}{}{no}{yes}} # condition = ${if eq{$address_data}{}{no}{yes}} address_data = ${lookup{$local_part@$domain}lsearch{confVIRT_MDIR_USERLIST_SINGLE}{$local_part_data@$domain_data:$value}{}} ifdef(`confLOCAL_PART_SUFFIX', `ifelse(confLOCAL_PART_SUFFIX, `NO', `dnl', `dnl local_part_suffix = confLOCAL_PART_SUFFIX local_part_suffix_optional ')') dnl ifdef(`confHEADERS_REMOVE_VIRTUAL_DOMAINS', ` headers_remove = confHEADERS_REMOVE_VIRTUAL_DOMAINS ') dnl log_as_local = false ') dnl ifelse_strstr(confVIRT_MDIR_USERLIST, `SINGLE_FILE', `') ifelse_strstr(confVIRT_MDIR_USERLIST, `DOMAINS_FILES', `dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_MAILDIRSIZE', `dnl virtual_domains_perdomain_check_quota: driver = redirect domains = +local_domains # domains = lsearch,ret=key;CONFDIR/domains-local ## local_parts = ${lookup{$local_part}lsearch{confVIRT_MDIR_DOMAIN_SETTINGS/$domain/passwd}{$local_part}{}} # local_parts = lsearch;confVIRT_MDIR_DOMAIN_SETTINGS/$domain/passwd local_parts = lsearch,ret=key;confVIRT_MDIR_DOMAIN_SETTINGS/$domain_data/passwd # require_files = confVIRT_MDIR_DOMAIN_SETTINGS/$domain/passwd require_files = confVIRT_MDIR_DOMAIN_SETTINGS/$domain_data/passwd condition = \ # ${lookup{$local_part}lsearch{confVIRT_MDIR_DOMAIN_SETTINGS/$domain_data/passwd}{\ ${if exists{confVIRT_MDIR_PATH/maildirsize}{\ ${if >=\ {${eval:\ ${sg{${sg{${readfile{confVIRT_MDIR_PATH/maildirsize}{\n}}}{\N^.+?\n\N}{}}}{\N(?s)\s+-?\d+\n\N}{+}}\ ${if <{$message_size}{1}{10k}{$message_size}}\ }}\ {confVIRT_MDIR_QUOTA_SIZE}\ {yes}{no}}\ }{no}}\ # }{yes}} ifdef(`confLOCAL_PART_SUFFIX', `ifelse(confLOCAL_PART_SUFFIX, `NO', `dnl', `dnl local_part_suffix = confLOCAL_PART_SUFFIX local_part_suffix_optional ')') group = confVIRT_MDIR_GROUP user = confVIRT_MDIR_USER verify_only allow_fail ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_MAILDIRSIZE_DEFER', `dnl allow_defer data = ${lookup{$local_part}lsearch{confVIRT_MDIR_DOMAIN_SETTINGS/$domain_data/passwd}{:defer:Over quota}{:fail:User $local_part@$domain is unknown}} ', ` data = ${lookup{$local_part}lsearch{confVIRT_MDIR_DOMAIN_SETTINGS/$domain_data/passwd}{:fail:Over quota}{:fail:User $local_part@$domain is unknown}} ') dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_MAILDIRSIZE_DEFER', `') ') dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_MAILDIRSIZE', `') ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_CUSTOM', `dnl virtual_domains_perdomain_check_quota: driver = redirect domains = +local_domains # domains = lsearch,ret=key;CONFDIR/domains-local ## local_parts = ${lookup{$local_part}lsearch{confVIRT_MDIR_DOMAIN_SETTINGS/$domain/passwd}{$local_part}{}} # local_parts = lsearch;confVIRT_MDIR_DOMAIN_SETTINGS/$domain/passwd local_parts = lsearch,ret=key;confVIRT_MDIR_DOMAIN_SETTINGS/$domain_data/passwd # require_files = confVIRT_MDIR_DOMAIN_SETTINGS/$domain/passwd require_files = confVIRT_MDIR_DOMAIN_SETTINGS/$domain_data/passwd condition = confVIRT_MDIR_QUOTA_CUSTOM_CONDITION ifdef(`confLOCAL_PART_SUFFIX', `ifelse(confLOCAL_PART_SUFFIX, `NO', `dnl', `dnl local_part_suffix = confLOCAL_PART_SUFFIX local_part_suffix_optional ')') group = confVIRT_MDIR_GROUP user = confVIRT_MDIR_USER verify_only allow_fail ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_CUSTOM_DEFER', `dnl allow_defer data = ${lookup{$local_part}lsearch{confVIRT_MDIR_DOMAIN_SETTINGS/$domain_data/passwd}{:defer:Over quota}{:fail:User $local_part@$domain is unknown}} ', ` data = ${lookup{$local_part}lsearch{confVIRT_MDIR_DOMAIN_SETTINGS/$domain_data/passwd}{:fail:Over quota}{:fail:User $local_part@$domain is unknown}} ') dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_CUSTOM_DEFER', `') ') dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_CUSTOM', `') virtual_domains_perdomain: driver = accept # transport = delivery_to_virt_domain transport = ${if and{\ {!eq{$h_X-Quarantined}{YES}}\ {!match{$h_X-Spam-Action:}{quarantined}}\ {eq{$acl_m_quarantined}{}}\ {!match{$h_X-Spam-Report:}{already_read}}\ {!forany{${sg{$acl_m_quarantined_per_rcpt}{, }{:}}}{eq{$item}{$local_part@$domain}}}\ }{delivery_to_virt_domain}{delivery_to_virt_domain_personal_quarantine}} domains = +local_domains # domains = lsearch,ret=key;CONFDIR/domains-local ## local_parts = ${lookup{$local_part}lsearch{confVIRT_MDIR_DOMAIN_SETTINGS/$domain/passwd}{$local_part}{}} # local_parts = lsearch;confVIRT_MDIR_DOMAIN_SETTINGS/$domain/passwd local_parts = lsearch,ret=key;confVIRT_MDIR_DOMAIN_SETTINGS/$domain_data/passwd # require_files = confVIRT_MDIR_DOMAIN_SETTINGS/$domain/passwd require_files = confVIRT_MDIR_DOMAIN_SETTINGS/$domain_data/passwd address_data = ${lookup{$local_part}lsearch{confVIRT_MDIR_DOMAIN_SETTINGS/$domain/passwd}{$local_part_data@$domain_data:$value}{}} ifdef(`confLOCAL_PART_SUFFIX', `ifelse(confLOCAL_PART_SUFFIX, `NO', `dnl', `dnl local_part_suffix = confLOCAL_PART_SUFFIX local_part_suffix_optional ')') dnl ifdef(`confHEADERS_REMOVE_VIRTUAL_DOMAINS', ` headers_remove = confHEADERS_REMOVE_VIRTUAL_DOMAINS ') dnl log_as_local = false ') dnl ifelse_strstr(confVIRT_MDIR_USERLIST, `DOMAINS_FILES', `') ifelse_strstr(confVIRT_MDIR_USERLIST, `CYRUS-IMAPD', `dnl virtual_domains_cyrus_imapd: driver = accept ifelse(_TRANSPORT_PERSONAL_QUARANTINE_, `YES', `dnl # transport = ${if eq{$acl_m_quarantined}{}{delivery_to_virt_domain}{delivery_to_virt_domain_personal_quarantine}} transport = ${if and{\ {!eq{$h_X-Quarantined}{YES}}\ {!match{$h_X-Spam-Action:}{quarantined}}\ {eq{$acl_m_quarantined}{}}\ {!match{$h_X-Spam-Report:}{already_read}}\ {!forany{${sg{$acl_m_quarantined_per_rcpt}{, }{:}}}{eq{$item}{$local_part@$domain}}}\ }{delivery_to_virt_domain}{delivery_to_virt_domain_personal_quarantine}} ',`dnl ifelse(_TRANSPORT_PERSONAL_QUARANTINE_, `YES', `') transport = delivery_to_virt_domain ') dnl ifelse(_TRANSPORT_PERSONAL_QUARANTINE_, `YES', `') domains = +local_domains # domains = lsearch,ret=key;CONFDIR/domains-local require_files = confVIRT_MDIR_CYRUS_MBPATH_PATH condition = ${run {confVIRT_MDIR_CYRUS_MBPATH_PATH -q -s user.${lc:$local_part@$domain}}{yes}{no}} ifdef(`confLOCAL_PART_SUFFIX', `ifelse(confLOCAL_PART_SUFFIX, `NO', `dnl', `dnl local_part_suffix = confLOCAL_PART_SUFFIX local_part_suffix_optional ')')dnl user = confVIRT_MDIR_USER group = confVIRT_MDIR_GROUP ') dnl ifelse_strstr(confVIRT_MDIR_USERLIST, `CYRUS-IMAPD', `') ifelse_strstr(confVIRT_MDIR_USERLIST, `MYSQL', `dnl define(`_ADDRESS_DATA_', `${lookup mysql{ \ confVIRT_MDIR_MYSQL \ }{$value}ifdef(`confVIRT_MDIR_MYSQL2', `ifelse(`X'confVIRT_MDIR_MYSQL2, `X', `fail', `{${lookup mysql{ \ confVIRT_MDIR_MYSQL2 \ }{$value}fail}}')',`fail')}')dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_MAILDIRSIZE', `dnl virtual_domains_mysql_check_quota: driver = redirect domains = +local_domains # domains = lsearch,ret=key;CONFDIR/domains-local # local_parts = ${sg{${sg{${extract{home}{$address_data}}}{\N/$\N}{}}}{\N^.+/\N}{}} local_parts = ${extract{1}{@}{${extract{id}{_ADDRESS_DATA_}}}} condition = \ # ${lookup mysql{confVIRT_MDIR_MYSQL}{ ${if exists{${extract{maildir}{${lookup mysql{confVIRT_MDIR_MYSQL}}}}/maildirsize}{\ ${if >=\ {${eval:\ ${sg{${sg{${readfile{${extract{maildir}{${lookup mysql{confVIRT_MDIR_MYSQL}}}}/maildirsize}{\n}}}{\N^.+?\n\N}{}}}{\N(?s)\s+-?\d+\n\N}{+}}\ ${if <{$message_size}{1}{10k}{$message_size}}\ }}\ {confVIRT_MDIR_QUOTA_SIZE}\ {yes}{no}}\ }{no}}\ # }{yes}} ifdef(`confLOCAL_PART_SUFFIX', `ifelse(confLOCAL_PART_SUFFIX, `NO', `dnl', `dnl local_part_suffix = confLOCAL_PART_SUFFIX local_part_suffix_optional ')') group = confVIRT_MDIR_GROUP user = confVIRT_MDIR_USER verify_only allow_fail ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_MAILDIRSIZE_DEFER', `dnl allow_defer data = ${lookup mysql{confVIRT_MDIR_MYSQL}{:defer:Over quota}{:fail:User $local_part@$domain is unknown}} ', ` data = ${lookup mysql{confVIRT_MDIR_MYSQL}{:fail:Over quota}{:fail:User $local_part@$domain is unknown}} ') dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_MAILDIRSIZE_DEFER', `') ') dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_MAILDIRSIZE', `') ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_CUSTOM', `dnl virtual_domains_mysql_check_quota: driver = redirect domains = +local_domains # domains = lsearch,ret=key;CONFDIR/domains-local # local_parts = ${sg{${sg{${extract{home}{$address_data}}}{\N/$\N}{}}}{\N^.+/\N}{}} local_parts = ${extract{1}{@}{${extract{id}{_ADDRESS_DATA_}}}} condition = confVIRT_MDIR_QUOTA_CUSTOM_CONDITION ifdef(`confLOCAL_PART_SUFFIX', `ifelse(confLOCAL_PART_SUFFIX, `NO', `dnl', `dnl local_part_suffix = confLOCAL_PART_SUFFIX local_part_suffix_optional ')') group = confVIRT_MDIR_GROUP user = confVIRT_MDIR_USER verify_only allow_fail ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_CUSTOM_DEFER', `dnl allow_defer data = ${lookup mysql{confVIRT_MDIR_MYSQL}{:defer:Over quota}{:fail:User $local_part@$domain is unknown}} ', ` data = ${lookup mysql{confVIRT_MDIR_MYSQL}{:fail:Over quota}{:fail:User $local_part@$domain is unknown}} ') dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_CUSTOM_DEFER', `') ') dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_CUSTOM', `') sinclude(confSITE_DIR`/configure.routers.virtual_domains_mysql_pre') virtual_domains_mysql: driver = accept ifelse(_TRANSPORT_PERSONAL_QUARANTINE_, `YES', `dnl # transport = ${if eq{$acl_m_quarantined}{}{delivery_to_virt_domain}{delivery_to_virt_domain_personal_quarantine}} transport = ${if and{\ {!eq{$h_X-Quarantined}{YES}}\ {!match{$h_X-Spam-Action:}{quarantined}}\ {eq{$acl_m_quarantined}{}}\ {!match{$h_X-Spam-Report:}{already_read}}\ {!forany{${sg{$acl_m_quarantined_per_rcpt}{, }{:}}}{eq{$item}{$local_part@$domain}}}\ }{delivery_to_virt_domain}{delivery_to_virt_domain_personal_quarantine}} ',`dnl ifelse(_TRANSPORT_PERSONAL_QUARANTINE_, `YES', `') transport = delivery_to_virt_domain ') dnl ifelse(_TRANSPORT_PERSONAL_QUARANTINE_, `YES', `') domains = +local_domains # domains = lsearch,ret=key;CONFDIR/domains-local # local_parts = ${sg{${sg{${extract{home}{$address_data}}}{\N/$\N}{}}}{\N^.+/\N}{}} local_parts = ${extract{1}{@}{${extract{id}{_ADDRESS_DATA_}}}} address_data = ${lookup mysql{ \ confVIRT_MDIR_MYSQL \ }{$value}ifdef(`confVIRT_MDIR_MYSQL2', `ifelse(`X'confVIRT_MDIR_MYSQL2, `X', `fail', `{${lookup mysql{ \ confVIRT_MDIR_MYSQL2 \ }{$value}fail}}')',`fail')} ifdef(`confLOCAL_PART_SUFFIX', `ifelse(confLOCAL_PART_SUFFIX, `NO', `dnl', `dnl local_part_suffix = confLOCAL_PART_SUFFIX local_part_suffix_optional ')') ifdef(`confHEADERS_REMOVE_VIRTUAL_DOMAINS', ` headers_remove = confHEADERS_REMOVE_VIRTUAL_DOMAINS ') log_as_local = false ') dnl ifelse_strstr(confVIRT_MDIR_USERLIST, `MYSQL', `') ifelse_strstr(confVIRT_MDIR_USERLIST, `PGSQL', `dnl define(`_ADDRESS_DATA_', `${lookup pgsql{ \ confVIRT_MDIR_PGSQL \ }{$value}ifdef(`confVIRT_MDIR_PGSQL2', `ifelse(`X'confVIRT_MDIR_PGSQL2, `X', `fail', `{${lookup pgsql{ \ confVIRT_MDIR_PGSQL2 \ }{$value}fail}}')',`fail')}')dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_MAILDIRSIZE', `dnl virtual_domains_pgsql_check_quota: driver = redirect domains = +local_domains # domains = lsearch,ret=key;CONFDIR/domains-local # local_parts = ${sg{${sg{${extract{home}{$address_data}}}{\N/$\N}{}}}{\N^.+/\N}{}} local_parts = ${extract{1}{@}{${extract{id}{_ADDRESS_DATA_}}}} ifdef(`confLOCAL_PART_SUFFIX', `ifelse(confLOCAL_PART_SUFFIX, `NO', `dnl', `dnl local_part_suffix = confLOCAL_PART_SUFFIX local_part_suffix_optional ')') group = confVIRT_MDIR_GROUP user = confVIRT_MDIR_USER condition = \ # ${lookup pgsql{confVIRT_MDIR_PGSQL}{ ${if exists{${extract{maildir}{${lookup pgsql{confVIRT_MDIR_PGSQL}}}}/maildirsize}{\ ${if >=\ {${eval:\ ${sg{${sg{${readfile{${extract{maildir}{${lookup pgsql{confVIRT_MDIR_PGSQL}}}}/maildirsize}{\n}}}{\N^.+?\n\N}{}}}{\N(?s)\s+-?\d+\n\N}{+}}\ ${if <{$message_size}{1}{10k}{$message_size}}\ }}\ {confVIRT_MDIR_QUOTA_SIZE}\ {yes}{no}}\ }{no}}\ # }{yes}} verify_only allow_fail ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_MAILDIRSIZE_DEFER', `dnl allow_defer data = ${lookup pgsql{confVIRT_MDIR_PGSQL}{:defer:Over quota}{:fail:User $local_part@$domain is unknown}} ', ` data = ${lookup pgsql{confVIRT_MDIR_PGSQL}{:fail:Over quota}{:fail:User $local_part@$domain is unknown}} ') dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_MAILDIRSIZE_DEFER', `') ') dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_MAILDIRSIZE', `') ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_CUSTOM', `dnl virtual_domains_pgsql_check_quota: driver = redirect domains = +local_domains # domains = lsearch,ret=key;CONFDIR/domains-local # local_parts = ${sg{${sg{${extract{home}{$address_data}}}{\N/$\N}{}}}{\N^.+/\N}{}} local_parts = ${extract{1}{@}{${extract{id}{_ADDRESS_DATA_}}}} ifdef(`confLOCAL_PART_SUFFIX', `ifelse(confLOCAL_PART_SUFFIX, `NO', `dnl', `dnl local_part_suffix = confLOCAL_PART_SUFFIX local_part_suffix_optional ')') group = confVIRT_MDIR_GROUP user = confVIRT_MDIR_USER condition = confVIRT_MDIR_QUOTA_CUSTOM_CONDITION verify_only allow_fail ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_CUSTOM_DEFER', `dnl allow_defer data = ${lookup pgsql{confVIRT_MDIR_PGSQL}{:defer:Over quota}{:fail:User $local_part@$domain is unknown}} ', ` data = ${lookup pgsql{confVIRT_MDIR_PGSQL}{:fail:Over quota}{:fail:User $local_part@$domain is unknown}} ') dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_CUSTOM_DEFER', `') ') dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_CUSTOM', `') virtual_domains_pgsql: driver = accept ifelse(_TRANSPORT_PERSONAL_QUARANTINE_, `YES', `dnl # transport = ${if eq{$acl_m_quarantined}{}{delivery_to_virt_domain}{delivery_to_virt_domain_personal_quarantine}} transport = ${if and{\ {!eq{$h_X-Quarantined}{YES}}\ {!match{$h_X-Spam-Action:}{quarantined}}\ {eq{$acl_m_quarantined}{}}\ {!match{$h_X-Spam-Report:}{already_read}}\ {!forany{${sg{$acl_m_quarantined_per_rcpt}{, }{:}}}{eq{$item}{$local_part@$domain}}}\ }{delivery_to_virt_domain}{delivery_to_virt_domain_personal_quarantine}} ',`dnl ifelse(_TRANSPORT_PERSONAL_QUARANTINE_, `YES', `') transport = delivery_to_virt_domain ') dnl ifelse(_TRANSPORT_PERSONAL_QUARANTINE_, `YES', `') domains = +local_domains # domains = lsearch,ret=key;CONFDIR/domains-local # local_parts = ${sg{${sg{${extract{home}{$address_data}}}{\N/$\N}{}}}{\N^.+/\N}{}} local_parts = ${extract{1}{@}{${extract{id}{_ADDRESS_DATA_}}}} address_data = ${lookup pgsql{ \ confVIRT_MDIR_PGSQL \ }{$value}ifdef(`confVIRT_MDIR_PGSQL2', `ifelse(`X'confVIRT_MDIR_PGSQL2, `X', `fail', `{${lookup pgsql{ \ confVIRT_MDIR_PGSQL2 \ }{$value}fail}}')',`fail')} ifdef(`confLOCAL_PART_SUFFIX', `ifelse(confLOCAL_PART_SUFFIX, `NO', `dnl', `dnl local_part_suffix = confLOCAL_PART_SUFFIX local_part_suffix_optional ')') ifdef(`confHEADERS_REMOVE_VIRTUAL_DOMAINS', ` headers_remove = confHEADERS_REMOVE_VIRTUAL_DOMAINS ') log_as_local = false ') dnl ifelse_strstr(confVIRT_MDIR_USERLIST, `PGSQL', `') ifelse_strstr(confVIRT_MDIR_USERLIST, `SQLITE', `dnl define(`_ADDRESS_DATA_', `${lookup sqlite,file=confSQLITE{\ confVIRT_MDIR_SQLITE \ }{$value}ifdef(`confVIRT_MDIR_SQLITE2', `ifelse(`X'confVIRT_MDIR_SQLITE2, `X', `fail', `{${lookup sqlite,file=confSQLITE{\ confVIRT_MDIR_SQLITE2 \ }{$value}fail}}')',`fail')}')dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_MAILDIRSIZE', `dnl virtual_domains_sqlite_check_quota: driver = redirect domains = +local_domains # domains = lsearch,ret=key;CONFDIR/domains-local # local_parts = ${sg{${sg{${extract{home}{$address_data}}}{\N/$\N}{}}}{\N^.+/\N}{}} local_parts = ${extract{1}{@}{${extract{id}{_ADDRESS_DATA_}}}} ifdef(`confLOCAL_PART_SUFFIX', `ifelse(confLOCAL_PART_SUFFIX, `NO', `dnl', `dnl local_part_suffix = confLOCAL_PART_SUFFIX local_part_suffix_optional ')') group = confVIRT_MDIR_GROUP user = confVIRT_MDIR_USER condition = \ # ${lookup sqlite,file=confSQLITE{confVIRT_MDIR_SQLITE}{ ${if exists{${extract{maildir}{${lookup sqlite,file=confSQLITE{confVIRT_MDIR_SQLITE}}}}/maildirsize}{\ ${if >=\ {${eval:\ ${sg{${sg{${readfile{${extract{maildir}{${lookup sqlite,file=confSQLITE{confVIRT_MDIR_SQLITE}}}}/maildirsize}{\n}}}{\N^.+?\n\N}{}}}{\N(?s)\s+-?\d+\n\N}{+}}\ ${if <{$message_size}{1}{10k}{$message_size}}\ }}\ {confVIRT_MDIR_QUOTA_SIZE}\ {yes}{no}}\ }{no}}\ # }{yes}} verify_only allow_fail ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_MAILDIRSIZE_DEFER', `dnl allow_defer data = ${lookup sqlite,file=confSQLITE{confVIRT_MDIR_SQLITE}{:defer:Over quota}{:fail:User $local_part@$domain is unknown}} ', ` data = ${lookup sqlite,file=confSQLITE{confVIRT_MDIR_SQLITE}{:fail:Over quota}{:fail:User $local_part@$domain is unknown}} ') dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_MAILDIRSIZE_DEFER', `') ') dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_MAILDIRSIZE', `') ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_CUSTOM', `dnl virtual_domains_sqlite_check_quota: driver = redirect domains = +local_domains # domains = lsearch,ret=key;CONFDIR/domains-local # local_parts = ${sg{${sg{${extract{home}{$address_data}}}{\N/$\N}{}}}{\N^.+/\N}{}} local_parts = ${extract{1}{@}{${extract{id}{_ADDRESS_DATA_}}}} ifdef(`confLOCAL_PART_SUFFIX', `ifelse(confLOCAL_PART_SUFFIX, `NO', `dnl', `dnl local_part_suffix = confLOCAL_PART_SUFFIX local_part_suffix_optional ')') group = confVIRT_MDIR_GROUP user = confVIRT_MDIR_USER condition = confVIRT_MDIR_QUOTA_CUSTOM_CONDITION verify_only allow_fail ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_CUSTOM_DEFER', `dnl allow_defer data = ${lookup sqlite,file=confSQLITE{confVIRT_MDIR_SQLITE}{:defer:Over quota}{:fail:User $local_part@$domain is unknown}} ', ` data = ${lookup sqlite,file=confSQLITE{confVIRT_MDIR_SQLITE}{:fail:Over quota}{:fail:User $local_part@$domain is unknown}} ') dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_CUSTOM_DEFER', `') ') dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_CUSTOM', `') virtual_domains_sqlite: driver = accept ifelse(_TRANSPORT_PERSONAL_QUARANTINE_, `YES', `dnl # transport = ${if eq{$acl_m_quarantined}{}{delivery_to_virt_domain}{delivery_to_virt_domain_personal_quarantine}} transport = ${if and{\ {!eq{$h_X-Quarantined}{YES}}\ {!match{$h_X-Spam-Action:}{quarantined}}\ {eq{$acl_m_quarantined}{}}\ {!match{$h_X-Spam-Report:}{already_read}}\ {!forany{${sg{$acl_m_quarantined_per_rcpt}{, }{:}}}{eq{$item}{$local_part@$domain}}}\ }{delivery_to_virt_domain}{delivery_to_virt_domain_personal_quarantine}} ',`dnl ifelse(_TRANSPORT_PERSONAL_QUARANTINE_, `YES', `') transport = delivery_to_virt_domain ') dnl ifelse(_TRANSPORT_PERSONAL_QUARANTINE_, `YES', `') domains = +local_domains # domains = lsearch,ret=key;CONFDIR/domains-local # local_parts = ${sg{${sg{${extract{home}{$address_data}}}{\N/$\N}{}}}{\N^.+/\N}{}} local_parts = ${extract{1}{@}{${extract{id}{_ADDRESS_DATA_}}}} address_data = ${lookup sqlite,file=confSQLITE{\ confVIRT_MDIR_SQLITE \ }{$value}ifdef(`confVIRT_MDIR_SQLITE2', `ifelse(`X'confVIRT_MDIR_SQLITE2, `X', `fail', `{${lookup sqlite,file=confSQLITE{\ confVIRT_MDIR_SQLITE2 \ }{$value}fail}}')',`fail')} ifdef(`confLOCAL_PART_SUFFIX', `ifelse(confLOCAL_PART_SUFFIX, `NO', `dnl', `dnl local_part_suffix = confLOCAL_PART_SUFFIX local_part_suffix_optional ')') ifdef(`confHEADERS_REMOVE_VIRTUAL_DOMAINS', ` headers_remove = confHEADERS_REMOVE_VIRTUAL_DOMAINS ') log_as_local = false ') dnl ifelse_strstr(confVIRT_MDIR_USERLIST, `SQLITE', `') ifelse_strstr(confVIRT_MDIR_USERLIST, `LDAP', `dnl dnl ifdef(`confVIRT_MDIR_USERLIST_CHECK_ADDITIONAL', `ifelse(confVIRT_MDIR_USERLIST_CHECK_ADDITIONAL, `NO', `dnl', `dnl dnl virtual_domains_ldap_check_additional: dnl driver = accept dnl dnl domains = +local_domains dnl # domains = lsearch,ret=key;CONFDIR/domains-local dnl local_parts = ${extract{1}{@}{${extract{mail}{${lookup ldapm{\ dnl confVIRT_MDIR_USERLIST_CHECK_ADDITIONAL\ dnl }{${sg{${lc:$value}}{\N(\n.*)$\N}{}}}fail}}}}} dnl dnl address_data = ${lookup ldapm{\ dnl confVIRT_MDIR_USERLIST_CHECK_ADDITIONAL\ dnl }{\ dnl ${sg{$value}{\N(\n.*)$\N}{}}\ dnl }fail} dnl transport = delivery_to_virt_domain dnl log_as_local = false dnl verify_only dnl ')') dnl ifdef(`confVIRT_MDIR_USERLIST_CHECK_ADDITIONAL', `ifelse(confVIRT_MDIR_USERLIST_CHECK_ADDITIONAL, `NO', `', `')') ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_MAILDIRSIZE', `dnl virtual_domains_ldap_check_quota: driver = redirect domains = +local_domains # domains = lsearch,ret=key;CONFDIR/domains-local # local_parts = ${extract{1}{@}{${extract{mail}{${lookup ldapm{\ # confVIRT_MDIR_LDAP\ # }{${sg{${lc:$value}}{\N(\n.*)$\N}{}}}fail}}}}} local_parts = ${lookup ldapm{\ confVIRT_MDIR_LDAP\ }{\ ${if eq{${extract{mail}{$value}}}{}\ {$local_part}\ {\ ${extract{1}{@}{${extract{mail}{\ ${sg{${lc:$value}}{\N(\n.*)$\N}{}}\ }}}}\ }\ }\ }fail} condition = \ ${if exists{confVIRT_MDIR_PATH_LDAP/maildirsize}{\ ${if >=\ {${eval:\ ${sg{${sg{${readfile{confVIRT_MDIR_PATH_LDAP/maildirsize}{\n}}}{\N^.+?\n\N}{}}}{\N(?s)\s+-?\d+\n\N}{+}}\ ${if <{$message_size}{1}{10k}{$message_size}}\ }}\ {confVIRT_MDIR_QUOTA_SIZE}\ {yes}{no}}\ }{no}}\ # }{yes}} ifdef(`confLOCAL_PART_SUFFIX', `ifelse(confLOCAL_PART_SUFFIX, `NO', `dnl', `dnl local_part_suffix = confLOCAL_PART_SUFFIX local_part_suffix_optional ')') group = confVIRT_MDIR_GROUP user = confVIRT_MDIR_USER verify_only allow_fail ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_MAILDIRSIZE_DEFER', `dnl allow_defer data = :defer:Over quota ', ` data = :fail:Over quota ') dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_MAILDIRSIZE_DEFER', `') ') dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_MAILDIRSIZE', `') ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_CUSTOM', `dnl virtual_domains_ldap_check_quota: driver = redirect domains = +local_domains # domains = lsearch,ret=key;CONFDIR/domains-local # local_parts = ${extract{1}{@}{${extract{mail}{${lookup ldapm{\ # confVIRT_MDIR_LDAP\ # }{${sg{${lc:$value}}{\N(\n.*)$\N}{}}}fail}}}}} local_parts = ${lookup ldapm{\ confVIRT_MDIR_LDAP\ }{\ ${if eq{${extract{mail}{$value}}}{}\ {$local_part}\ {\ ${extract{1}{@}{${extract{mail}{\ ${sg{${lc:$value}}{\N(\n.*)$\N}{}}\ }}}}\ }\ }\ }fail} ifdef(`confLOCAL_PART_SUFFIX', `ifelse(confLOCAL_PART_SUFFIX, `NO', `dnl', `dnl local_part_suffix = confLOCAL_PART_SUFFIX local_part_suffix_optional ')') group = confVIRT_MDIR_GROUP user = confVIRT_MDIR_USER condition = confVIRT_MDIR_QUOTA_CUSTOM_CONDITION verify_only allow_fail ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_CUSTOM_DEFER', `dnl allow_defer data = :defer:Over quota ', ` data = :fail:Over quota ') dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_CUSTOM_DEFER', `') ') dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_CUSTOM', `') sinclude(confSITE_DIR`/configure.routers.virtual_domains_ldap_pre') virtual_domains_ldap: driver = accept domains = +local_domains # domains = lsearch,ret=key;CONFDIR/domains-local # local_parts = ${extract{1}{@}{${extract{mail}{${lookup ldapm{\ # confVIRT_MDIR_LDAP\ # }{${sg{${lc:$value}}{\N(\n.*)$\N}{}}}fail}}}}} local_parts = ${lookup ldapm{\ confVIRT_MDIR_LDAP\ }{\ ${if eq{${extract{mail}{$value}}}{}\ {$local_part}\ {\ ${extract{1}{@}{${extract{mail}{\ ${sg{${lc:$value}}{\N(\n.*)$\N}{}}\ }}}}\ }\ }\ }fail} ifdef(`confLOCAL_PART_SUFFIX', `ifelse(confLOCAL_PART_SUFFIX, `NO', `dnl', `dnl local_part_suffix = confLOCAL_PART_SUFFIX local_part_suffix_optional ')') # address_data = ${lookup ldapm{\ # confVIRT_MDIR_LDAP\ # }{\ # ${sg{${lc:$value}}{\N(\n.*)$\N}{}}\ # }fail} address_data = ${lookup ldapm{\ confVIRT_MDIR_LDAP\ }{\ ${if eq{${extract{address_data}{$value}}}{}\ {\ ${sg{${lc:$value}}{\N(\n.*)$\N}{}}\ }\ {\ ${extract{address_data}{\ ${sg{${lc:$value}}{\N(\n.*)$\N}{}}\ }}\ }\ }\ }fail} ifdef(`confHEADERS_REMOVE_VIRTUAL_DOMAINS', ` headers_remove = confHEADERS_REMOVE_VIRTUAL_DOMAINS ') ifelse(_TRANSPORT_PERSONAL_QUARANTINE_, `YES', `dnl # transport = ${if eq{$acl_m_quarantined}{}{delivery_to_virt_domain}{delivery_to_virt_domain_personal_quarantine}} transport = ${if and{\ {!eq{$h_X-Quarantined}{YES}}\ {!match{$h_X-Spam-Action:}{quarantined}}\ {eq{$acl_m_quarantined}{}}\ {!match{$h_X-Spam-Report:}{already_read}}\ {!forany{${sg{$acl_m_quarantined_per_rcpt}{, }{:}}}{eq{$item}{$local_part@$domain}}}\ }{delivery_to_virt_domain}{delivery_to_virt_domain_personal_quarantine}} ',`dnl ifelse(_TRANSPORT_PERSONAL_QUARANTINE_, `YES', `') transport = delivery_to_virt_domain ') dnl ifelse(_TRANSPORT_PERSONAL_QUARANTINE_, `YES', `') log_as_local = false ') dnl ifelse_strstr(confVIRT_MDIR_USERLIST, `LDAP', `') ') dnl ifelse(SECTION, `ROUTERS', `') dnl # dnl ############################## routers ############################## dnl ############################## transports ############################## dnl # ifelse(SECTION, `TRANSPORTS', `dnl DELIVERY(`backup_maildir_delivery') dnl DELIVERY(`virtual_filters') dnl ifelse_strstr(confDELIVERY_TO, `PIPE', ` ifelse(_TRANSPORT_PERSONAL_QUARANTINE_, `YES', `dnl DELIVERY(`maildir_virtual_transport_delivery_to_virt_domain_pipe', `delivery_to_virt_domain_personal_quarantine', `confVIRT_MDIR_PIPE_PERSONAL_QUARANTINE', `Disposition-Notification-To : Return-Receipt-To') ') dnl ifelse(_TRANSPORT_PERSONAL_QUARANTINE_, `YES', `') sinclude(confSITE_DIR`/configure.transports.delivery_to_virt_domain_pre') DELIVERY(`maildir_virtual_transport_delivery_to_virt_domain_pipe', `delivery_to_virt_domain', `confVIRT_MDIR_PIPE') ', ` dnl ifelse_strstr(confDELIVERY_TO, `PIPE', `') ifelse(_TRANSPORT_PERSONAL_QUARANTINE_, `YES', `dnl DELIVERY(`maildir_virtual_transport_delivery_to_virt_domain_appendfile', `delivery_to_virt_domain_personal_quarantine', `/confCONTENT_SCANNING_PERSONAL_QUARANTINE_FOLDER', `Disposition-Notification-To : Return-Receipt-To') ') dnl ifelse(_TRANSPORT_PERSONAL_QUARANTINE_, `YES', `') sinclude(confSITE_DIR`/configure.transports.delivery_to_virt_domain_pre') DELIVERY(`maildir_virtual_transport_delivery_to_virt_domain_appendfile', `delivery_to_virt_domain', `') ') dnl ifelse_strstr(confDELIVERY_TO, `PIPE', `') ') dnl ifelse(SECTION, `TRANSPORTS', `') dnl # dnl ############################## transports ##############################