Имеется связка Exim + Dovecot +Mysql.
Все в принципе работает, кроме одного - Не получается прикрутить правильно квоты.
Задача: Нужно, чтобы при попытке отправить письмо, которое превышает установленную квоту, было возвращено отправителю.
Установка в dovecot.conf опции quota_full_tempfail = yes не помогает. Письмо всеравно доставляется адресату.
Листинг dovecot.conf
Код: Выделить всё
base_dir = /var/run/dovecot/
protocols = imap
listen = *
disable_plaintext_auth = no
shutdown_clients = yes
log_timestamp = "%b %d %H:%M:%S "
syslog_facility = mail
ssl_disable = yes
login_dir = /var/run/dovecot/login
login_chroot = yes
login_user = dovecot
login_process_size = 64
login_process_per_connection = yes
login_processes_count = 3
login_max_processes_count = 128
login_greeting = MUA Dovecot ready!
login_log_format_elements = user=<%u> method=%m rip=%r lip=%l %c
login_log_format = %$: %s
mail_location = maildir:/var/spool/mail/vexim/%d/%n
mail_privileged_group = mail
verbose_proctitle = yes
first_valid_uid = 25
first_valid_gid = 25
maildir_copy_with_hardlinks = yes
protocol imap {
mail_plugins = quota imap_quota
mail_plugin_dir = /usr/local/lib/dovecot/imap
imap_client_workarounds = delay-newmail outlook-idle \
netscape-eoh tb-extra-mailbox-sep
}
protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
}
protocol lda {
postmaster_address = postmaster@domain.co
mail_plugins = quota
quota_full_tempfail = yes
sendmail_path = /usr/local/sbin/exim
auth_socket_path = /var/run/dovecot/auth-master
}
auth_username_format = %Lu
auth default {
mechanisms = plain
auth_debug = yes
socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0600
user = vexim
}
}
passdb sql {
args = /usr/local/etc/dovecot-sql.conf
}
userdb sql {
args = /usr/local/etc/dovecot-sql.conf
}
user = root
}
dict {
#quota = mysql:/usr/local/etc/dovecot-dict-quota.conf
}
plugin {
quota = dirsize
quota_rule = *:storage=1M
# quota_warning = storage=80%%
}
Код: Выделить всё
primary_hostname = mail.domen.co
MY_IP = XXX.XXX.XXX.XXX
VIRTUAL_DOMAINS = SELECT DISTINCT domain FROM domains WHERE type = 'local' AND enabled = '1' AND domain = '${quote_mysql:$domain}'
RELAY_DOMAINS = SELECT DISTINCT domain FROM domains WHERE type = 'relay' AND domain = '${quote_mysql:$domain}'
ALIAS_DOMAINS = SELECT DISTINCT alias FROM domainalias WHERE alias = '${quote_mysql:$domain}'
domainlist local_domains = ${lookup mysql{VIRTUAL_DOMAINS}} : ${lookup mysql{ALIAS_DOMAINS}}
domainlist relay_to_domains = ${lookup mysql{VIRTUAL_DOMAINS}}
hostlist relay_from_hosts = localhost : 192.168.0.0/24
hide mysql_servers = localhost/vexim/vexim/*******
acl_smtp_rcpt = acl_check_rcpt
acl_smtp_data = acl_check_data
av_scanner = clamd:127.0.0.1 3310
spamd_address = 127.0.0.1 783
qualify_domain = domain.co
qualify_recipient = domain.co
allow_domain_literals = false
exim_user = vexim
exim_group = vexim
never_users = root
rfc1413_query_timeout = 0s
sender_unqualified_hosts = +relay_from_hosts
recipient_unqualified_hosts = +relay_from_hosts
ignore_bounce_errors_after = 45m
timeout_frozen_after = 15d
helo_accept_junk_hosts = 192.168.0.0/24
auto_thaw = 1h
smtp_banner = $primary_hostname, ESMTP EXIM $version_number
smtp_accept_max = 50
smtp_accept_max_per_connection = 40
smtp_connect_backlog = 30
smtp_accept_max_per_host = 20
split_spool_directory = true
remote_max_parallel = 15
return_size_limit = 100k
message_size_limit = 64M
smtp_enforce_sync = true
received_header_text = "Received: \
${if def:sender_rcvhost {from ${sender_rcvhost}\n\t} \
{${if def:sender_ident {from ${sender_ident} }} \
${if def:sender_helo_name {(helo=${sender_helo_name})\n\t}}}} \
by ${primary_hostname} \
${if def:received_protocol {with ${received_protocol}}} \
id ${message_id} \
${if def:received_for {\n\tfor <$received_for>}}"
log_selector = \
+subject \
+all_parents \
+connection_reject \
+incoming_interface \
+lost_incoming_connection \
+received_sender \
+received_recipients \
+smtp_confirmation \
+smtp_syntax_error \
+smtp_protocol_error \
+queue_run \
+retry_defer \
+smtp_connection \
+smtp_incomplete_transaction
syslog_timestamp = no
######################################################################
# ACL CONFIGURATION #
# Specifies access control lists for incoming SMTP mail #
######################################################################
begin acl
acl_check_rcpt:
accept hosts = :
deny local_parts = ^.*[@%!/|] : ^\\.
accept local_parts = postmaster
domains = +local_domains
accept authenticated = *
accept domains = +local_domains
endpass
verify = recipient
accept domains = +relay_to_domains
endpass
verify = recipient
deny message = "You in Blacklist - $dnslists_domain \n $dnslists_text"
dnslists = opm.blitzed.org : \
cbl.abuseat.org : \
bl.csma.biz : \
dynablock.njabl.org
accept hosts = +relay_from_hosts
deny message = Homo hominus lupus est
acl_check_data:
# Include Vexim specific rcpt ACLs
#.include /usr/local/etc/exim/vexim-acl-check-content.conf
# finally accept all the rest
deny message = Message rejected: virus found!
hosts = *
malware = *
accept add_header = X-Virus-Scan: Checked ClamAV on $primary_hostname
add_header = X-Virus-Status: Virus not found!
warn message = X-Spam-Score: $spam_score($spam_bar)
spam = maildeliver:true
warn message = X-Spam-Report: $spam_report
spam = maildeliver:true
accept hosts = 127.0.0.1:+relay_from_hosts
accept authenticated = *
######################################################################
# ROUTERS CONFIGURATION #
# Specifies how addresses are handled #
######################################################################
# THE ORDER IN WHICH THE ROUTERS ARE DEFINED IS IMPORTANT! #
# An address is passed to each router in turn until it is accepted. #
######################################################################
begin routers
send_to_smart_host:
driver = manualroute
route_list = !+local_domains pochta.tvoe.tv
transport = remote_smtp
ditch_malware:
driver = redirect
allow_fail
data = :blackhole:
condition = ${if and { {match {$h_X-ACL-Warn:}{.*malware.*}} \
{eq {${lookup mysql{select users.on_avscan from users,domains \
where localpart = '${quote_mysql:$local_part}' \
and domain = '${quote_mysql:$domain}' \
and users.on_avscan = '1' \
and users.domain_id=domains.domain_id}}}{1} }} {yes}{no} }
local_delivery_spam:
driver = accept
domains = +local_domains
condition = ${if match{$h_X-Spam-Status:}{Yes}}
transport = local_delivery_spam_transport
virtual_vacation:
driver = accept
condition = ${if and { {!match {$h_precedence:}{(?i)junk|bulk|list}} \
{eq {${lookup mysql{select users.on_vacation from users,domains \
where localpart = '${quote_mysql:$local_part}' \
and domain = '${quote_mysql:$domain}' \
and users.on_vacation = '1' \
and users.domain_id=domains.domain_id}}}{1} }} {yes}{no} }
no_verify
no_expn
unseen
transport = virtual_vacation_delivery
from_MDS:
driver = accept
domains = +local_domains
condition = ${if match{$h_Subject:}{Mail delivery failed:}}
transport = local_delivery_MDS
virtual_domains:
driver = redirect
allow_fail
data = ${lookup mysql{select smtp from users,domains \
where localpart = '${quote_mysql:$local_part}' \
and domain = '${quote_mysql:$domain}' \
and domains.enabled = '1' \
and users.enabled = '1' \
and users.domain_id = domains.domain_id}}
headers_add = ${if >{$spam_score_int}{${lookup mysql{select users.sa_tag * 10 from users,domains \
where localpart = '${quote_mysql:$local_part}' \
and domain = '${quote_mysql:$domain}' \
and users.on_spamassassin = '1' \
and users.domain_id=domains.domain_id }{$value}fail}} {X-Spam-Flag: YES\n}{} }
headers_remove = ${if or { { <{$spam_score_int}{1} } \
{ <{$spam_score_int}{${lookup mysql{select users.sa_tag * 10 from users,domains \
where localpart = '${quote_mysql:$local_part}' \
and domain = '${quote_mysql:$domain}' \
and users.on_spamassassin = 1 \
and users.domain_id=domains.domain_id}{$value}fail}} } \
{ eq {0}{${lookup mysql{select users.sa_tag * 10 from users,domains \
where localpart = '${quote_mysql:$local_part}' \
and domain = '${quote_mysql:$domain}' \
and users.on_spamassassin = 0 \
and users.domain_id=domains.domain_id}{$value}fail}}} \
} {X-Spam-Score:X-Spam-Report} }
local_part_suffix = -*
local_part_suffix_optional
retry_use_local_part
file_transport = virtual_delivery
reply_transport = address_reply
pipe_transport = address_pipe
.include /usr/local/etc/exim/vexim-group-router.conf
virtual_domains_catchall:
driver = redirect
allow_fail
data = ${lookup mysql{select smtp from users,domains where localpart = '*' \
and domain = '${quote_mysql:$domain}' \
and users.domain_id = domains.domain_id}}
retry_use_local_part
file_transport = virtual_delivery
reply_transport = address_reply
pipe_transport = address_pipe_catchall
virtual_domain_alias:
driver = redirect
allow_fail
data = ${lookup mysql{select concat('${quote_mysql:$local_part}@', domain) \
from domains,domainalias where domainalias.alias = '${quote_mysql:$domain}' \
and domainalias.domain_id = domains.domain_id}}
retry_use_local_part
localuser:
driver = accept
check_local_user
transport = local_delivery_error
cannot_route_message = Unknown user
######################################################################
# TRANSPORTS CONFIGURATION #
######################################################################
# ORDER DOES NOT MATTER #
# Only one appropriate transport is called for each delivery. #
######################################################################
begin transports
remote_smtp:
driver = smtp
virtual_delivery:
driver = appendfile
envelope_to_add
return_path_add
mode = 0600
maildir_format = true
create_directory = true
directory = ${lookup mysql{select smtp from users,domains \
where localpart = '${quote_mysql:$local_part}' \
and domain = '${quote_mysql:$domain}' \
and users.domain_id = domains.domain_id}}
user = ${lookup mysql{select users.uid from users,domains \
where localpart = '${quote_mysql:$local_part}' \
and domain = '${quote_mysql:$domain}' \
and users.domain_id = domains.domain_id}}
group = ${lookup mysql{select users.gid from users,domains \
where localpart = '${quote_mysql:$local_part}' \
and domain = '${quote_mysql:$domain}' \
and users.domain_id = domains.domain_id}}
quota = ${lookup mysql{select users.quota from users,domains \
where localpart = '${quote_mysql:$local_part}' \
and domain = '${quote_mysql:$domain}' \
and users.domain_id = domains.domain_id}{${value}M}}
quota_is_inclusive = false
quota_size_regex = ,S=(\d+):
quota_warn_threshold = 75%
maildir_use_size_file = false
quota_warn_message = "To: $local_part@$domain\n\
Subject: Mailbox quota warning\n\n\
This message was automatically generated by the mail delivery software.\n\n\
You are now using over 75% of your allocated mail storage quota.\n\n\
If your mailbox fills completely, further incoming messages will be automatically\n\
returned to their senders.\n\n\
Please take note of this and remove unwanted mail from your mailbox.\n"
dovecot_delivery:
driver = pipe
command = /usr/local/libexec/dovecot/deliver -d $local_part@$domain
message_prefix =
message_suffix =
delivery_date_add
envelope_to_add
return_path_add
log_output
user = vexim
address_pipe:
driver = pipe
return_output
user = ${lookup mysql{select users.uid from users,domains where localpart = '${quote_mysql:$local_part}' and domain = '${quote_mysql:$domain}' and users.domain_id = domains.domain_id}}
group = ${lookup mysql{select users.gid from users,domains where localpart = '${quote_mysql:$local_part}' and domain = '${quote_mysql:$domain}' and users.domain_id = domains.domain_id}}
local_delivery_spam_transport:
driver = pipe
command = /usr/local/libexec/dovecot/deliver -d $local_part@$domain -m .Junk
message_prefix =
message_suffix =
delivery_date_add
envelope_to_add
return_path_add
local_delivery_error:
driver = pipe
command = /usr/local/libexec/dovecot/deliver -d postmaster@$domain
message_prefix =
message_suffix =
delivery_date_add
envelope_to_add
return_path_add
local_delivery_MDS:
driver = pipe
command = /usr/local/libexec/dovecot/deliver -d $local_part@$domain -m INBOX.MDS
message_prefix =
message_suffix =
delivery_date_add
envelope_to_add
return_path_add
# This transport is used for handling autoreplies generated by the filtering
# option of the userforward router.
address_reply:
driver = autoreply
begin retry
# Domain Error Retries
# ------ ----- -------
* * F,2h,15m; G,16h,1h,1.5; F,14d,6h
######################################################################
# REWRITE CONFIGURATION #
######################################################################
# There are no rewriting specifications in this default configuration file.
begin rewrite
######################################################################
# AUTHENTICATION CONFIGURATION #
######################################################################
# There are no authenticator specifications in this default configuration file.
begin authenticators
plain_login:
driver = plaintext
public_name = PLAIN
server_condition = ${lookup mysql{SELECT username FROM users \
WHERE username = '${quote_mysql:$auth2}' \
AND clear = '${quote_mysql:$auth3}'}{yes}{no}}
server_prompts = :
server_set_id = $auth2