address_file:
driver = appendfile
delivery_date_add
envelope_to_add
return_path_add
address_autoreply:
driver = autoreply
from = $local_part@$domain
reply_to = $local_part@$domain
to = $sender_address
subject = AutoReply Re: $local_part@$domain
text = ${lookup mysql{SELECT text_autoresponder FROM mailbox WHERE `username`='${quote_mysql:$local_part@$domain}'}}
#select text_autoresponder from mailbox where username='admin5@pupkin1.ru' AND auto_autoresponder=1;
# Здесь будет тело сообщения тоесть текст для автоответа
#once_repeat = 1d #Время задержки письма
#subject = ${lookup mysql{SELECT username FROM mailbox WHERE `username`='${quote_mysql:$local_part@$domain}'}}
#subject = $local_part@$domain
#headers = "Content-Type: text/plain; charset=utf-8"
#headers = Content-Type: text/plain; charset="UTF-8"
#переменная содержит адрес отправителя
begin retry
* * F,2h,15m; G,16h,1h,1.5; F,4d,6h
begin rewrite
brainyservice@localhost $sender_address sw
#insert_smtp_rewrite_rules
#end_smtp_rewrite_rules
begin authenticators
#insert_auth_smtp
#end_auth_smtp
auth_plain:
driver = dovecot
public_name = PLAIN
server_socket = /var/run/dovecot/auth-client
server_set_id = $auth1
auth_login:
driver = dovecot
public_name = LOGIN
server_socket = /var/run/dovecot/auth-client
server_set_id = $auth1
auth_cram_md5:
driver = dovecot
public_name = CRAM-MD5
server_socket = /var/run/dovecot/auth-client
server_set_id = $auth1
# Принимаем сообщения от тех, кто аутентифицировался:
# Вообще, большинство конфигов в рунете - это один и тот же
# конфиг написанный Ginger, в котором этот пункт расположен
# внизу. Но при таком расположении рубятся клиенты с adsl,
# ppp, и прочие зарезанные на последующих проверках. Но это
# жа неправильно! Этом мои пользователи из дома! Потому
# я это правило расположил до проверок.
accept authenticated = *
deny message = "Your IP in HELO - access denied!"
hosts = * : !+relay_from_hosts : !81-196.lissyara.su
condition = ${if eq{$sender_helo_name}\
{$sender_host_address}{true}{false}}
deny condition = ${if eq{$sender_helo_name}\
{$interface_address}{yes}{no}}
hosts = !127.0.0.1 : !localhost : *
message = "main IP in your HELO! Access denied!"
deny condition = ${if match{$sender_helo_name}\
{\N^\d+$\N}{yes}{no}}
hosts = !127.0.0.1 : !localhost : *
message = "can not be only number in HELO!"
# Рубаем хосты типа *adsl*; *dialup*; *pool*;....
# Нормальные люди с таких не пишут. Если будут
# проблемы - уберёте проблемный пункт (у меня клиенты
# имеют запись типа asdl-1233.zone.su - я ADSL убрал...)
deny message = "your hostname is bad (adsl, pool, dialup, peer, dhcp & etc)."
condition = ${if match{$sender_host_name} \
{adsl|dialup|pool|peer|dhcp} \
{yes}{no}}
# Задержка. (это такой метод борьбы со спамом,
# основанный на принципе его рассылки) На этом рубается
# почти весь спам. Единственно - метод неприменим на
# реально загруженных MTA - т.к. в результате ему
# приходится держать много открытых соединений.
# но на офисе в сотню-две человек - шикарный метод.
#
# более сложный вариант, смотрите в статье по exim и
# курьер имап. Т.к. там метод боле умный (просто правил
# больше :), то можно и на более загруженные сервера ставить)
warn
# ставим дефолтовую задержку в 20 секунд
set acl_m0 = 0s
warn
# ставим задержку в 0 секунд своим хостам и
# дружественным сетям (соседняя контора :))
hosts = +relay_from_hosts:213.234.195.224/28:80.253.9.18/32
set acl_m0 = 0s
warn
# пишем в логи задержку (если оно вам надо)
logwrite = Delay $acl_m0 for $sender_host_name \
[$sender_host_address] with HELO=$sender_helo_name. Mail \
from $sender_address to $local_part@$domain.
delay = $acl_m0
# Проверка получателя в локальных доменах.
# Если не проходит, то проверяется следующий ACL,
# и если непрошёл и там - deny
accept domains = +local_domains
endpass
message = "In my mailserver not stored this user"
verify = recipient
# Проверяем получателя в релейных доменах
# Опять-таки если не проходит -> следующий ACL,
# и если непрошёл и там - deny
accept domains = +relay_to_domains
endpass
message = "main server not know how relay to this address"
verify = recipient
# Рубаем тех, кто в блэк-листах. Серваки перебираются
# сверху вниз, если не хост не найден на первом, то
# запрашивается второй, и т.д. Если не найден ни в одном
# из списка - то почта пропускается.
# deny message = you in blacklist: $dnslist_domain \n $dnslist_text
# dnslists = opm.blitzed.org : \
# cbl.abuseat.org : \
# bl.csma.biz : \
# dynablock.njabl.org
# Разрешаем почту от доменов в списке relay_from_hosts
accept hosts = +relay_from_hosts
# BRAINY START 0 Primary hostname receive mail denied
# BRAINY END 0 .
# BRAINY START 1 Reject SPF failures
# BRAINY END 1 .
# BRAINY START 9 Sender Verification
# BRAINY END 9 .
# Check IP address in DNS based blacklists
deny
hosts = +relay_from_hosts
message = Host is listed in RBL. Please contact your ISP.
dnslists = /etc/exim/rbl_reject
# Если неподошло ни одно правило - чувак явно ищет
# открытый релей. Пшёл прочь. :)
deny message = "Homo hominus lupus est"
acl_check_data:
# Проверяем письмо на вирусы
# deny malware = *
# message = "In e-mail found VIRUS - $malware_name"
# Если есть необходимость - тут проверки на спам
# Пропускаем остальное
accept
acl_smtp_helo:
accept
acl_smtp_mail:
accept
begin routers
#insert_smtp_router
#end_smtp_router
userforward:
driver = redirect
#no_verify
no_expn
check_ancestor
allow_filter
router_home_directory = /home/${lookup mysql{SELECT name FROM mailbox WHERE username='${quote_mysql:$local_part@$domain}'}}/mail/${lookup mysql{SELECT username FROM mailbox WHERE username='${quote_mysql:$local_part@$domain}'}}
#debug_print = "exim tessst for ################################################################### $home "
#check_local_user
local_part_suffix = -*
local_part_suffix_optional
user = ${lookup mysql{SELECT name FROM mailbox WHERE username='${quote_mysql:$local_part@$domain}'}}
#group =${lookup mysql{SELECT name FROM mailbox WHERE username='${quote_mysql:$local_part@$domain}'}}
file = $home/.forward
file_transport = address_file
pipe_transport = address_pipe
reply_transport = address_reply
condition = ${if exists{$home/.forward} {yes} {no} }
#localuser:
# driver = accept
# domains = ${lookup mysql{select domain from domain where domain='${domain}'}}
# local_parts = ${lookup mysql{select username from mailbox where local_part='${local_part}' and domain='${domain}'}}
# transport = local_delivery
# cannot_route_message = Unknown user
autoreply:
driver = accept
#retry_use_local_part
no_expn
no_verify
unseen
condition = ${lookup mysql{SELECT username FROM mailbox \
WHERE username='${quote_mysql:$local_part@$domain}' AND auto_autoresponder = '1'}{yes}{no}}
senders = . ! ^postmaster@.*:\
! ^root@.*\
! ^noreply@.*.
transport = address_autoreply
dnslookup:
driver = dnslookup
domains = ! +local_domains
transport = remote_smtp
ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
no_more
system_aliases:
driver = redirect
allow_fail
allow_defer
data = ${lookup mysql{SELECT `goto` FROM `alias` WHERE \
`address`='${quote_mysql:$local_part@$domain}' OR \
`address`='${quote_mysql:@$domain}'}}
file_transport = address_file
pipe_transport = address_pipe
#local_user:
# driver = accept
# condition = ${lookup mysql{SELECT `goto` FROM \
# `alias` WHERE \
# `address`='${quote_mysql:$local_part@$domain}' OR \
# `address`='${quote_mysql:@$domain}'}{yes}{no}}
# transport = local_delivery
local_user:
driver = accept
condition = ${lookup mysql{SELECT `username` FROM \
`mailbox` WHERE \
`username`='${quote_mysql:$local_part@$domain}' OR \
`username`='${quote_mysql:@$domain}'}{yes}{no}}
transport = local_delivery
#autoreply:
#driver = accept
#retry_use_local_part
#no_expn
#no_verify
#unseen
#condition = ${lookup mysql{SELECT email FROM vacation \
# WHERE email='${quote_mysql:$local_part@$domain}' AND active = '1'}{yes}{no}}
#senders = . ! ^postmaster@.*:\
# ! ^root@.*\
# ! ^noreply@.*.
#transport = address_autoreply
virtual_aliases:
driver = redirect
allow_defer
allow_fail
domains = !$primary_hostname
require_files = "+/etc/valiases/$domain"
address_data = ${lookup{*}lsearch{/etc/valiases/$domain}}
data = $address_data
file_transport = address_file
pipe_transport = ${if forall{/bin/cagefs_enter:/usr/sbin/cagefsctl}{exists{$item}}{cagefs_virtual_address_pipe}{${if match{${extract{6}{:}{${lookup passwd{${lookup{$domain}lsearch{/etc/userdomains}{$value}}}{$value}}}}}{\N(jail|no)shell\N}{jailed_virtual_address_pipe}{virtual_address_pipe}}}}
local_catchall:
debug_print = "R: catchall for $local_part@$domain"
driver = redirect
domains = +local_domains
allow_fail
allow_defer
data = catchall
begin transports
DKIM_DOMAIN_NAME=${lc:${domain:$h_from:}}
DKIM_FILE=/etc/opendkim/keys/${lc:${domain:$h_from:}}/${lc:${domain:$h_from:}}.key
DKIM_PRIVATE_KEY_NAME=${if exists{DKIM_FILE}{DKIM_FILE}{0}}
#insert_smtp_tpansport
#end_smtp_tpansport
remote_smtp:
driver = smtp
# OPENDKIM Config START
dkim_domain = DKIM_DOMAIN_NAME
dkim_selector = default
dkim_private_key = DKIM_PRIVATE_KEY_NAME
#dkim_domain = $sender_address_domain
#dkim_selector = default
dkim_canon = relaxed
dkim_strict = 0
#dkim_private_key =${if exists{/etc/opendkim/keys/$sender_address_domain/$sender_address_domain.key}{/etc/opendkim/keys/$sender_address_domain/$sender_address_domain.key}{0}}
# OPENDKIM Config END
local_delivery:
driver = appendfile
directory = ${lookup mysql{SELECT CONCAT (`home`,`name`,'/mail/','${quote_mysql:$local_part@$domain}','/') FROM \
`mailbox` WHERE \
`username`='${quote_mysql:$local_part@$domain}' }{$value}}
maildir_format
delivery_date_add
envelope_to_add
return_path_add
user = ${lookup mysql{SELECT name FROM mailbox WHERE `username`='${quote_mysql:$local_part@$domain}' }{$value}}
address_pipe:
driver = pipe
return_output
address_reply:
driver = autoreply
#address_autoreply:
#driver = autoreply
#text = ${lookup mysql{SELECT body FROM vacation WHERE \
# `email`='${quote_mysql:$local_part@$domain}'}}
#from = $local_part@$domain
#once_repeat = ${lookup mysql{SELECT interval_time FROM vacation WHERE \
# `email`='${quote_mysql:$local_part@$domain}'}}h
#subject = ${lookup mysql{SELECT subject FROM vacation WHERE \
# `email`='${quote_mysql:$local_part@$domain}'}}
#headers = "Content-Type: text/plain; charset=cp1251"
#to = $sender_address
hide mysql_servers = 127.0.0.1::3306/smtp/smtp/f5npOm-SC4
domainlist local_domains = @:localhost:${lookup mysql{SELECT `domain` \
FROM `domain` WHERE \
`domain`='${domain}' AND \
`active`='1'}}
domainlist relay_to_domains = localhost:${lookup mysql{SELECT `domain` \
FROM `domain` WHERE \
`domain`='${domain}' AND \
`active`='1'}}
#domainlist relay_to_domains =
hostlist relay_from_hosts = localhost:127.0.0.0/8:192.168.0.0/16
acl_smtp_rcpt = acl_check_rcpt
disable_ipv6=true
# BRAINY CONFIG START
acl_smtp_connect = acl_smtp_connect
acl_smtp_helo = acl_smtp_helo
acl_not_smtp = my_acl_not_smtp
acl_smtp_mail = acl_smtp_mail
acl_smtp_data = acl_check_data
acl_smtp_notquit = acl_smtp_notquit
# BRAINY CONFIG END
qualify_domain = youmail.my-mails.ru
qualify_recipient = localhost
allow_domain_literals = false
untrusted_set_sender = *
local_interfaces = 127.0.0.1 : 188.120.237.212
host_lookup = *
daemon_smtp_ports = 465 : 587 : 25
tls_on_connect_ports = 465
tls_advertise_hosts = *
tls_certificate = /var/lib/ssl/smtp.crt
tls_privatekey = /var/lib/ssl/smtp.key
#tls_privatekey = ${if exists{/etc/brainy/src/ssl/${tls_sni}.key}{/etc/brainy/src/ssl/${tls_sni}.key}{/etc/brainy/src/ssl/smtp.key}}
#tls_certificate = ${if exists{/etc/brainy/src/ssl/${tls_sni}.crt}{/etc/brainy/src/ssl/${tls_sni}.crt}{/etc/brainy/src/ssl/smtp.crt}}
tls_require_ciphers = ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
never_users = root
rfc1413_query_timeout = 0s
sender_unqualified_hosts = +relay_from_hosts
recipient_unqualified_hosts = +relay_from_hosts
ignore_bounce_errors_after = 30m
timeout_frozen_after = 3d
# BRAINY START 3 Set SMTP Sender headers
# BRAINY END 3 .
helo_accept_junk_hosts = 192.168.0.0/16
auto_thaw = 1h
smtp_banner = "$primary_hostname, ESMTP EXIM $version_number"
smtp_accept_max = 50
smtp_accept_max_per_connection = 25
smtp_connect_backlog = 30
smtp_accept_max_per_host = 20
split_spool_directory = true
remote_max_parallel = 15
return_size_limit = 70k
message_size_limit = 64M
helo_allow_chars = _
smtp_enforce_sync = true
log_selector = \
+all_parents \
+connection_reject \
+incoming_interface \
+lost_incoming_connection \
+received_sender \
+received_recipients \
+smtp_confirmation \
+smtp_syntax_error \
+smtp_protocol_error \
-queue_run
syslog_timestamp = no
begin acl
my_acl_not_smtp:
deny message = Sender rate not SMTP overlimit - $sender_rate / $sender_rate_period
ratelimit = 300 / 1h / leaky
discard message = not permitted user "$sender_ident"
condition = ${lookup{$sender_ident}lsearch{/etc/exim/block_user} {yes}{no}}
accept
acl_smtp_connect:
accept
acl_smtp_notquit:
accept
acl_check_rcpt:
deny message = Sender rate SMTP overlimit - $sender_rate / $sender_rate_period
ratelimit = 300 / 1h / leaky
#eximrblmodule
deny message = you in blacklist: $dnslist_domain $dnslist_text
dnslists = zen.spamhaus.org : pbl.spamhaus.org : cbl.abuseat.org : b.barracudacentral.org : all.s5h.net : spambot.bls.digibase.ca :
#eximrblmodule
# BRAINY START 2 Bounce email users over quota
# BRAINY END 2 .
# принимать сообщения которые пришли с локалхоста,
# не по TCP/IP
accept hosts = :
# Запрещаем письма содержащие в локальной части
# символы @; %; !; /; |. Учтите, если у вас было
# `percent_hack_domains` то % надо убрать.
# Проверяются локальные домены
deny message = "incorrect symbol in address"
domains = +local_domains
local_parts = ^[.] : ^.*[@%!/|]
# Проверяем недопустимые символы для
# нелокальных получателей:
deny message = "incorrect symbol in address"
domains = !+local_domains
local_parts = ^[./|] : ^.*[@%!] : ^.*/\\.\\./
# Принимаем почту для постмастеров локальных доменов без
# проверки отправителя (я закомментировал, т.к. это -
# основной источник спама с мой ящик).
accept local_parts = postmaster
domains = +local_domains
# Запрещщаем, если невозможно проверить отправителя
# (отсутствует в списке локальных пользователей)
# У себя я это закоментил, по причине, что некоторые
# железяки (принтеры, & etc) и программы (Касперский, DrWEB)
# умеют слать почту, в случае проблем но не умеют ставить
# нужного отправителя. Такие письма эта проверка не пускает.
# Запрещщаем тех, кто не обменивается приветственными
# сообщениями (HELO/EHLO)
deny message = "HELO/EHLO require by SMTP RFC"
condition = ${if eq{$sender_helo_name}{}{yes}{no}}
domainlist local_domains = @:localhost:*.domain1.ru,*.domain2.ru,*.domain3.ru,*.domain80.ru:${lookup mysql{SELECT