My Configs


Примеры моих рабочих конфигов

exim4_config

/etc/exim4.conf
####################################################
#                    MAIN CONFIGURATION SETTINGS                     #
####################################################
# Имя сервера в заголовке
smtp_banner = "$primary_hostname, (-=RSTP=-local Domain: $local_part) ESMTP EXIM $version_number"

primary_hostname = server-ud3l.lab.home

daemon_smtp_ports = 25 : 465 : 587
tls_on_connect_ports=465

###############################################
###                    Настройка подключения к pgsql        ###
###############################################

hide pgsql_servers = server-ud3l.lab.home/postfixadmin/postfixadmin/123

exim_path = /usr/sbin/exim4

CONFDIR = /etc/exim4
exim_user = dovecot
exim_group = dovecot

# debconf-driven macro definitions get inserted after this line
UPEX4CmacrosUPEX4C = 1


domainlist local_domains = ${lookup pgsql{SELECT domain FROM domain WHERE domain='${quote_pgsql:$domain}' AND active='t'}}


#domainlist relay_to_domains =  medianet.lan : medianet.pp.ua

domainlist relay_to_domains = ${lookup pgsql{SELECT domain FROM domain WHERE domain='${quote_pgsql:$domain}' AND active='t'}}

hostlist relay_from_hosts = localhost : 127.0.0.0/8 : 192.168.0.0/24

#acl_smtp_helo = acl_check_helo
#acl_smtp_mail = acl_check_from
acl_smtp_rcpt = acl_check_rcpt
#acl_smtp_mime = acl_check_mime
#acl_smtp_data = acl_check_data


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 \
    +host_lookup_failed \
    +smtp_mailauth \
    +sender_verify_fail \
    +all \

# av_scanner = clamd:/run/clamav/clamd.ctl

#MAIN_HOST_LOOKUP = *
#host_lookup = MAIN_HOST_LOOKUP

#dns_dnssec_ok = 1

#prdr_enable = true

# users in admin group can do many other things
# admin_groups = <unset>

##############################################
###              Секция для настройки SSL                    ###
##############################################

tls_advertise_hosts = *
tls_certificate = /etc/dovecot/private/dovecot.pem
tls_privatekey = /etc/dovecot/private/dovecot.key


###################################################
#                       ACL CONFIGURATION                            #
#         Specifies access control lists for incoming SMTP mail      #
###################################################
begin acl

acl_check_rcpt:

accept  hosts         = +relay_from_hosts
#  accept  authenticated = *
#  deny    message       = relay not permitted (FROM THIS IP address)

  # принимать сообщения которые пришли с локалхоста,
  # не по 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)
  # умеют слать почту, в случае проблем но не умеют ставить
  # нужного отправителя. Такие письма эта проверка не пускает.
#  require verify        = sender

  # Запрещщаем тех, кто не обменивается приветственными
  # сообщениями (HELO/EHLO)
#  deny    message       = "HELO/EHLO require by SMTP RFC"
#          condition     = ${if eq{$sender_helo_name}{}{yes}{no}}

  # Принимаем сообщения от тех, кто аутентифицировался:
  # Вообще, большинство конфигов в рунете - это один и тот же
  # конфиг написанный Ginger, в котором этот пункт расположен
  # внизу. Но при таком расположении рубятся клиенты с adsl,
  # ppp, и прочие зарезанные на последующих проверках. Но это
  # жа неправильно! Этом мои пользователи из дома! Потому
  # я это правило расположил до проверок.
  accept  authenticated = *

# Рубаем нах, тех, кто подставляет свой IP в HELO
#  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}}


# Рубаем тех, кто в HELO пихает мой IP (2500 мудаков за месяц!)
  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!"

# Рубаем тех, кто в HELO пихает только цифры
# (не бывает хостов ТОЛЬКО из цифр)
#  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, poll, ppp & etc)."
#          condition     = ${if match{$sender_host_name} \
#                               {adsl|dialup|pool|peer|dhcp} \
#                               {yes}{no}}

  # Задержка. (это такой метод борьбы со спамом,
  # основанный на принципе его рассылки) На этом рубается
  # почти весь спам. Единственно - метод неприменим на
  # реально загруженных MTA - т.к. в результате ему
  # приходится держать много открытых соединений.
  # но на офисе в сотню-две человек - шикарный метод.
  #
  # более сложный вариант, смотрите в статье по exim и
  # курьер имап. Т.к. там метод боле умный (просто правил
  # больше :), то можно и на более загруженные сервера ставить)
#  warn
        # ставим дефолтовую задержку в 20 секунд
#        set acl_m0 = 30s
#  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

  # Если неподошло ни одно правило - чувак явно ищет
  # открытый релей. Пшёл прочь. :)
#  deny    message       = "Homo hominus lupus est"

 


# Тут идут ACL проверяющие содержимое (тело) письма.
# Без них будут пропускаться все сообщения.

#acl_check_data:
#
  # Проверяем письмо на вирусы
#  deny malware = *
#  message = "In e-mail found VIRUS - $malware_name"

  # Если есть необходимость - тут проверки на спам

  # Пропускаем остальное
  accept

control = suppress_local_fixups
#################################################
#                      ROUTERS CONFIGURATION                         #
#               Specifies how addresses are handled                  #
#################################################

begin routers

# Отправка на системные алиасы
#sys_alias:
#    driver      = redirect
#    data        = ${lookup{$local_part}lsearch{/etc/aliases}}
#    file_transport  = address_file
#    pipe_transport  = address_pipe
#    allow_fail
#    allow_defer

# Поиск маршрута к хосту в DNS. Не проверяются 0.0.0.0 и 127.0.0.0/8

SMARTHOST_TRANSPORT = ${extract{1}{:}{${lookup{$authenticated_id}nwildlsearch{CONFDIR/smarthosts}{$value}}}}

smarthost_multi:
    debug_print = "R: smarthost_multi for $local_part@$domain"
    driver = manualroute
    condition =  ${if eq {SMARTHOST_TRANSPORT}{}{no}{yes}}
    domains = !+local_domains
    route_list = "* $domain"
    transport = SMARTHOST_TRANSPORT
    ignore_target_hosts = <; 0.0.0.0 ; 127.0.0.0/8 ; ::1
    host_find_failed = ignore
    same_domain_copy_routing = yes

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 pgsql{SELECT goto FROM alias WHERE address='${quote_pgsql:$local_part@$domain}' OR address='${quote_pgsql:@$domain}'}}
# data = ${lookup{$local_part}lsearch{/etc/exim/alias}}

 # Получение почты на локальный ящик с альтернативным доменным именем из Postfixadmin
dovecot_local_mailbox:
   driver = accept
   condition = ${lookup{$local_part@$domain}lsearch{/etc/dovecot/users}{yes}{no}}
#   condition = ${lookup pgsql{SELECT mailbox.maildir \
#                              FROM alias_domain \
#                              JOIN mailbox ON mailbox.local_part = '${quote_pgsql:$local_part}' \
#                                AND mailbox.domain = alias_domain.target_domain \
#                                AND mailbox.active = 't' \
#                              WHERE alias_domain.alias_domain = '${quote_pgsql:$domain}' \
#                                AND alias_domain.active ='t'}{yes}{no}}  
   transport = dovecot_virtual_delivery
   cannot_route_message = Unknown user
   

dovecot_user:
driver = accept
condition = ${lookup pgsql{SELECT goto FROM alias WHERE address='${quote_pgsql:$local_part@$domain}' OR address='${quote_pgsql:@$domain}'}{yes}{no}}
transport = dovecot_delivery

vrouter:
  driver = accept
  require_files = +/var/mail/mailnull/$domain/$local_part
  transport = dovecot_delivery

####################################################
#                      TRANSPORTS CONFIGURATION                      #

begin transports

remote_smtp:
driver = smtp


# -*- mode: conf-unix; coding: utf-8 -*-
mailru:
    # См. https://help.mail.ru/mail/mailer/popsmtp
    debug_print = "T:  mailru for $local_part@$domain"
    driver = smtp

    hosts = smtp.mail.ru

    hosts_override = true
    helo_data = localhost
    port = 465
    protocol = smtps
    hosts_require_auth = *
    hosts_require_tls = *
    tls_verify_hosts = *

gmail:
    # См. https://support.google.com/mail/answer/7126229
    debug_print = "T:  gmail for $local_part@$domain"
    driver = smtp

    hosts = smtp.gmail.com

    hosts_override = true
    helo_data = localhost
    port = 587
    hosts_require_auth = *
    hosts_require_tls = *
    tls_verify_hosts = *


outlook:
    # См. https://support.google.com/mail/answer/7126229
    debug_print = "T:  gmail for $local_part@$domain"
    driver = smtp

    hosts = smtp.office365.com

    hosts_override = true
    helo_data = localhost
    port = 587
    hosts_require_auth = *
    hosts_require_tls = *
    tls_verify_hosts = *

proton_me:
    # См. https://support.google.com/mail/answer/7126229
    debug_print = "T:  gmail for $local_part@$domain"
    driver = smtp

    hosts = smtp.protonmail.ch

    hosts_override = true
    helo_data = localhost
    port = 587
    hosts_require_auth = *
    hosts_require_tls = *
    tls_verify_hosts = *

dovecot_delivery:
driver = pipe
debug_print = "T: dovecot_delivery for $local_part@$domain"
command = /usr/lib/dovecot/dovecot-lda -d $local_part@$domain
message_prefix =
message_suffix =
delivery_date_add
envelope_to_add
return_path_add = false
log_output
user = mailnull

# Транспорт для локальных получателей из Dovecot
dovecot_virtual_delivery:
   driver = pipe
   command = /usr/lib/dovecot/deliver -d $local_part@$domain -f $sender_address
   message_prefix =
   message_suffix =
   delivery_date_add
   envelope_to_add
   return_path_add
   log_output
   user = mailnull
   temp_errors = 64 : 69 : 70: 71 : 72 : 73 : 74 : 75 : 78

# Транспорт а-ля "труба"
address_pipe:
driver = pipe
return_output

# Автоответчик
address_reply:
driver = autoreply


################################################
#                      RETRY CONFIGURATION                           #
################################################

begin retry


*                      *           F,30d,1m; G,30d,1m,1.5; F,30d,1m

#################################################
#                      REWRITE CONFIGURATION                         #
#################################################

begin rewrite

#####################################################
#                   AUTHENTICATION CONFIGURATION                     #
#####################################################

begin authenticators
PLINE=${lookup{$authenticated_id}nwildlsearch{CONFDIR/passwd.smarthosts}{$value}{}}
PASSWDLINE=${if eq{PLINE}{}{${sg{\
               ${lookup{$host}nwildlsearch{CONFDIR/passwd.client}{$value}fail}\
               }\
               {\\N[\\^]\\N}\
               {^^}\
           }}{${sg{PLINE}{\\N[\\^]\\N}{^^}}}}
plain_smtp:
 driver = plaintext
 public_name = PLAIN_SMTP
 client_send = "<; ^${extract{1}{:}{PASSWDLINE}}\
                    ^${sg{PASSWDLINE}{\\N([^:]+:)(.*)\\N}{\\$2}}"

dovecot_ntlm:
driver = dovecot
public_name = NTLM
server_socket = /var/run/dovecot/auth-client
server_set_id = NTLM-${quote:$auth1}
dovecot_login:
driver = dovecot
public_name = LOGIN
server_socket = /var/run/dovecot/auth-client
# setting server_set_id might break several headers in mails sent by authenticated smtp. So be careful.
server_set_id = $auth1
dovecot_plain:
driver = dovecot
public_name = PLAIN
server_socket = /var/run/dovecot/auth-client
server_set_id = $auth1
dovecot_gssapi:
driver = dovecot
public_name = GSSAPI
server_socket = /var/run/dovecot/auth-client
server_set_id = $auth1
dovecot_scram:
driver = dovecot
public_name = SCRAM-SHA-256
server_socket = /var/run/dovecot/auth-client
server_set_id = $auth1
#auth_plain:
#  driver = plaintext
#  public_name = LOGIN
#  server_advertise_condition = ${if eq{$2}{}{no}{yes}}
#  server_condition = ${lookup pgsql{SELECT password FROM users WHERE username='${quote_pgsql:$1}'}{yes}{no}}
#  server_set_id = $1
#  server_prompts = :

######################################