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', `/var/vmail/$domain/$local_part/') dnl 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 ifdef(`confVIRT_MDIR_PATH',`',`define(`confVIRT_MDIR_PATH', confVIRT_MDIR_ROOT`/${domain}/${local_part}')') # delivery to virtual maildirs DELIVERY(`virtual_aliases') dnl DELIVERY(`procmail') dnl DELIVERY(`backup_remote_smtp') dnl DELIVERY(`virtual_filters') dnl DELIVERY(`backup_incoming') dnl ifdef(`confMAILERTABLE', `ifelse(confMAILERTABLE, `NO', `dnl', `dnl define(`SECTION', `ROUTERS_LOCAL')dnl DELIVERY(`mailertable')dnl define(`SECTION', `ROUTERS')dnl ')') ifelse_strstr(confVIRT_MDIR_USERLIST, `DOMAINS_FILES', `dnl virtual_domains_perdomain: driver = accept domains = +local_domains ifdef(`confLOCAL_PART_SUFFIX', `ifelse(confLOCAL_PART_SUFFIX, `NO', `dnl', `dnl local_part_suffix = confLOCAL_PART_SUFFIX local_part_suffix_optional ')') require_files = confVIRT_MDIR_DOMAIN_SETTINGS/${domain}/passwd local_parts = lsearch;confVIRT_MDIR_DOMAIN_SETTINGS/${domain}/passwd ifdef(`confHEADERS_REMOVE_VIRTUAL_DOMAINS', ` headers_remove = confHEADERS_REMOVE_VIRTUAL_DOMAINS ') # 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}} log_as_local = false ') dnl ifelse_strstr(confVIRT_MDIR_USERLIST, `DOMAINS_FILES', `') 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 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 {${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}} 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:${local_part}@${domain}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 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 {${local_part}@${domain}}lsearch{confVIRT_MDIR_USERLIST_SINGLE}{:defer:Over quota}{:fail:${local_part}@${domain}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: driver = accept domains = +local_domains ifdef(`confLOCAL_PART_SUFFIX', `ifelse(confLOCAL_PART_SUFFIX, `NO', `dnl', `dnl local_part_suffix = confLOCAL_PART_SUFFIX local_part_suffix_optional ')') dnl condition = ${lookup {${local_part}@${domain}}lsearch{confVIRT_MDIR_USERLIST_SINGLE}{yes}{no}} ifdef(`confHEADERS_REMOVE_VIRTUAL_DOMAINS', ` headers_remove = confHEADERS_REMOVE_VIRTUAL_DOMAINS ') dnl 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, `SINGLE_FILE', `') ifelse_strstr(confVIRT_MDIR_USERLIST, `CYRUS-IMAPD', `dnl virtual_domains_cyrus_imapd: driver = accept domains = +local_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', `') ifdef(`confLOCAL_PART_SUFFIX', `ifelse(confLOCAL_PART_SUFFIX, `NO', `dnl', `dnl local_part_suffix = confLOCAL_PART_SUFFIX local_part_suffix_optional ')') user = confVIRT_MDIR_USER group = confVIRT_MDIR_GROUP require_files = confVIRT_MDIR_CYRUS_MBPATH_PATH condition = ${run {confVIRT_MDIR_CYRUS_MBPATH_PATH -q -s user.${lc:$local_part@$domain}}{yes}{no}} ') dnl ifelse_strstr(confVIRT_MDIR_USERLIST, `CYRUS-IMAPD', `') ifelse_strstr(confVIRT_MDIR_USERLIST, `MYSQL', `dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_MAILDIRSIZE', `dnl virtual_domains_mysql_check_quota: driver = redirect domains = +local_domains 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 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}} 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 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 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', `') virtual_domains_mysql: driver = accept domains = +local_domains ifdef(`confLOCAL_PART_SUFFIX', `ifelse(confLOCAL_PART_SUFFIX, `NO', `dnl', `dnl local_part_suffix = confLOCAL_PART_SUFFIX local_part_suffix_optional ')') 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(`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, `MYSQL', `') ifelse_strstr(confVIRT_MDIR_USERLIST, `PGSQL', `dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_MAILDIRSIZE', `dnl virtual_domains_pgsql_check_quota: driver = redirect domains = +local_domains 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 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 domains = +local_domains ifdef(`confLOCAL_PART_SUFFIX', `ifelse(confLOCAL_PART_SUFFIX, `NO', `dnl', `dnl local_part_suffix = confLOCAL_PART_SUFFIX local_part_suffix_optional ')') 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(`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, `PGSQL', `') ifelse_strstr(confVIRT_MDIR_USERLIST, `SQLITE', `dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_MAILDIRSIZE', `dnl virtual_domains_sqlite_check_quota: driver = redirect domains = +local_domains 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{confSQLITE confVIRT_MDIR_SQLITE}{ ${if exists{${extract{maildir}{${lookup sqlite{confSQLITE confVIRT_MDIR_SQLITE}}}}/maildirsize}{\ ${if >=\ {${eval:\ ${sg{${sg{${readfile{${extract{maildir}{${lookup sqlite{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{confSQLITE confVIRT_MDIR_SQLITE}{:defer:Over quota}{:fail:User ${local_part}@${domain} is unknown}} ', ` data = ${lookup sqlite{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 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{confSQLITE confVIRT_MDIR_SQLITE}{:defer:Over quota}{:fail:User ${local_part}@${domain} is unknown}} ', ` data = ${lookup sqlite{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 domains = +local_domains ifdef(`confLOCAL_PART_SUFFIX', `ifelse(confLOCAL_PART_SUFFIX, `NO', `dnl', `dnl local_part_suffix = confLOCAL_PART_SUFFIX local_part_suffix_optional ')') address_data = ${lookup sqlite{confSQLITE \ confVIRT_MDIR_SQLITE \ }{$value}ifdef(`confVIRT_MDIR_SQLITE2', `ifelse(`X'confVIRT_MDIR_SQLITE2, `X', `fail', `{${lookup sqlite{confSQLITE \ confVIRT_MDIR_SQLITE2 \ }{$value}fail}}')',`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, `SQLITE', `') ifelse_strstr(confVIRT_MDIR_USERLIST, `LDAP', `dnl ifdef(`confVIRT_MDIR_USERLIST_CHECK_ADDITIONAL', `ifelse(confVIRT_MDIR_USERLIST_CHECK_ADDITIONAL, `NO', `dnl', `dnl virtual_domains_ldap_check_additional: driver = accept domains = +local_domains address_data = ${lookup ldapm{\ confVIRT_MDIR_USERLIST_CHECK_ADDITIONAL\ }{\ ${sg{$value}{\N(\n.*)$\N}{}}\ }fail} transport = delivery_to_virt_domain log_as_local = false verify_only ')') 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 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 = \ ${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}} 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 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', `') virtual_domains_ldap: driver = accept domains = +local_domains 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{$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 ifelse_strstr(confDELIVERY_TO, `FILTERS', `dnl delivery_to_virt_domain_by_filter: driver = appendfile ifdef(`confVIRT_MDIR_USERLIST', `ifelse(confVIRT_MDIR_USERLIST, `MYSQL', `dnl directory = ${extract{maildir}{$address_data}}/$address_file ', `dnl ifdef(`confVIRT_MDIR_USERLIST', `ifelse(confVIRT_MDIR_USERLIST, `PGSQL', `dnl directory = ${extract{maildir}{$address_data}}/$address_file ', `dnl ifdef(`confVIRT_MDIR_USERLIST', `ifelse(confVIRT_MDIR_USERLIST, `SQLITE', `dnl directory = ${extract{maildir}{$address_data}}/$address_file ', `dnl ifdef(`confVIRT_MDIR_USERLIST', `ifelse(confVIRT_MDIR_USERLIST, `LDAP', `dnl directory = ifdef(`confVIRT_MDIR_PATH_LDAP', confVIRT_MDIR_PATH_LDAP, `${extract{maildir}{$address_data}}')/$address_file ', `dnl directory = confVIRT_MDIR_PATH/$address_file ')') dnl ifdef(`confVIRT_MDIR_USERLIST', `ifelse(confVIRT_MDIR_USERLIST, `LDAP', `')') ')') dnl ifdef(`confVIRT_MDIR_USERLIST', `ifelse(confVIRT_MDIR_USERLIST, `SQLITE', `')') ')') dnl ifdef(`confVIRT_MDIR_USERLIST', `ifelse(confVIRT_MDIR_USERLIST, `PGSQL', `')') ')') dnl ifdef(`confVIRT_MDIR_USERLIST', `ifelse(confVIRT_MDIR_USERLIST, `MYSQL', `')') delivery_date_add envelope_to_add return_path_add user = confVIRT_MDIR_USER group = confVIRT_MDIR_GROUP maildir_format = true create_directory = true directory_mode = confVIRT_MDIR_DIR_MODE mode = confVIRT_MDIR_FILE_MODE ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_MAILDIRSIZE', `dnl maildir_use_size_file ') dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `VERIFY_RCPT_MAILDIRSIZE', `') ifelse_strstr(confVIRT_MDIR_QUOTA, `TRANSPORT', `dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `TRANSPORT_MAILDIRSIZE', `dnl maildir_use_size_file ') dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `TRANSPORT_MAILDIRSIZE', `') maildir_quota_directory_regex = confVIRT_MDIR_QUOTA_DIR_REGEX quota = confVIRT_MDIR_QUOTA_SIZE ') dnl ifelse_strstr(confVIRT_MDIR_QUOTA, `TRANSPORT', `') ') dnl ifelse_strstr(confDELIVERY_TO, `FILTERS', `') 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') ') dnl ifelse(_TRANSPORT_PERSONAL_QUARANTINE_, `YES', `') 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') ') dnl ifelse(_TRANSPORT_PERSONAL_QUARANTINE_, `YES', `') 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 ##############################