Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> почтовые системы —> Exim + dovecot + PgSQL + web

Exim + dovecot + PgSQL + web интерфейсы почты и управления, или почтовый сервер с нуля для начинающих админов

Автор: DNK.


 Итак. Создадим почтовый сервер для офиса на базе exim и удобного dovecot.
Данный сервер подойдет как для 10 000 абонентов , так и для 10 сотрудников.
Все настройки при установке используем по дефолту с указанными (если есть)
изменениями.
Будем использовать :

FreeBSD 9.0 (вообще-то статью писал еще для 8.0 версии, использую уже 9.1)
PostgreSQL 9.0
Apache 22
PHP5
Exim
Dovecot
Clamav
SpamAssasin
Squirrelmail (Roundcube луше, но статья писалась уже давно, оставлю белку)
Наша управляющая мордочка
Monit (для контроля и перезапуска сервисов)


*Если вы хотите использовать Squirreloutlook , вам нужно устанавливать PHP4.

Авторизацию будем осуществлять по user (не user@dom.xx), пароли будем хранить
в незашифрованном виде (что не помешает в дальнейшем перейти на шифрованные),
предусмотрим переадрессацию с email юзера на другие email , собственный
"черный" лист , так же настроим web интерфейсы для почты
и управления почтовым сервером.Директорию для почтовых ящиков выбираем /d.
И , естественно, установим антиспам и антивирус для почты.

P.S. Попробую собраться с силами и дописать в конце статьи о необходимых
изменениях для авторизации по user@domain.xx

Начнем.

#обновим порты (очень рекомендую начинать именно с этого)
portsnap fetch
portsnap extract

cd /usr/ports/databases/postgresql90-server/
make install clean
echo 'postgresql_enable="YES"' >> /etc/rc.conf

cd /usr/ports/databases/postgresql90-contrib/
make install clean

#подправим консоль

echo "postgres:\" >> /etc/login.conf
echo " :lang=ru_RU.KOI8-R:\ " >> /etc/login.conf
echo " :charset=KOI8-R:\ " >> /etc/login.conf
echo " :setenv=LC_COLLATE=C:\ " >> /etc/login.conf
echo " :tc=default:" >> /etc/login.conf
echo 'postgresql_class="postgres"' >> /etc/rc.conf
cap_mkdb /etc/login.conf

#В /usr/local/etc/rc.d/postgresql
#меняем utf-8 на koi8-r
#это нужно чтобы в консоле русский отображался корректно
#если у вас консоль koi8-r

/usr/local/etc/rc.d/postgresql initdb
/usr/local/etc/rc.d/postgresql start

cd /usr/ports/www/apache22/
make install clean
echo 'apache22_enable="YES"' >> /etc/rc.conf

cd /usr/ports/lang/php5/
make install clean

При компиляции PHP не забываем включить опцию

                 [x] APACHE  Build Apache module

После компиляции не забываем добавить в конфиг apache
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

И в DirectoryIndex добавить index.php

cd /usr/ports/lang/php5-extensions/
make install clean

В extensions выбираем пункт PgSQL и убираем sqlite

       [x] PGSQL       PostgreSQL database support
       [ ] PDO_SQLITE  PDO sqlite driver 
       [ ] SQLITE      sqlite support

cd /usr/ports/mail/exim-postgresql/
make install clean
echo 'exim_enable="YES"' >> /etc/rc.conf
echo 'sendmail_enable="NONE"' >> /etc/rc.conf

В меню выбираем

                  [X] DCC
                  [X] PGSQL              Link against libpq
                  [X] SA_EXIM

cd /usr/ports/mail/dovecot/
make install clean
echo 'dovecot_enable="YES"' >> /etc/rc.conf

                  [X] PGSQL        PostgreSQL support 

#если вы не забыли в exim включить SA_EXIM то этот пункт не нужен
###cd /usr/ports/mail/p5-Mail-SpamAssassin/
###make install clean
### Впроцессе установки отвечаем на вопросы по желанию
echo 'spamd_enable="YES"' >> /etc/rc.conf
echo 'spamd_flags="-u spamd -H /var/spool/spamd"' >> /etc/rc.conf
### обязательно запустим обновление и создание правил
sa-update

cd /usr/ports/security/clamav/
make install clean
echo 'clamav_clamd_enable="YES"' >> /etc/rc.conf
### Обновляем базу (желательно это делать раз в день)
freshclam

cd /usr/ports/mail/squirrelmail
make install clean

#################################
#или roundcube
#cd /usr/ports/mail/roundcube
#make install clean
#как настроить смотрим в инете
#лень описывать - там все очень просто
#################################

cd /usr/ports/sysutils/monit
make install clean
echo 'monit_enable="YES"' >> /etc/rc.conf

Теперь переходим непосредственно к настройкам , и начнем , как всегда с БД.


su - pgsql
createuser exim
createdb -U exim exim
exit
psql -U exim exim

Создаем таблицы
        
CREATE TABLE accounts (
            uid serial NOT NULL,
            login character varying(128),
            "password" character varying(128),
            maildir character varying(255),
            home character varying(255),
            mailquota integer DEFAULT 20,
            name text
);
ALTER TABLE ONLY accounts
ADD CONSTRAINT uid_k PRIMARY KEY (uid);
ALTER TABLE ONLY accounts
ADD CONSTRAINT login_k UNIQUE (login);

CREATE TABLE aliases (
            mail character varying(128) NOT NULL,
            alias character varying(128)
);
ALTER TABLE ONLY aliases
ADD CONSTRAINT mail_k PRIMARY KEY (mail);

        
CREATE TABLE local_domain (domain text);
CREATE TABLE hostreject (domain text, coment text);
CREATE TABLE relayfromhosts (hosts text, coment text);
CREATE TABLE relaytohosts (hosts text, coment text);
CREATE TABLE userforward (id int, local_part text, recipients text);

Правим настройки clamv в /usr/local/etc/clamd.conf (раскоментировать)
        TCPSocket 3310
        TCPAddr 127.0.0.1

Файл /etc/mail/mailer.conf приводим к виду

sendmail        /usr/local/sbin/exim
send-mail       /usr/local/sbin/exim
mailq           /usr/local/sbin/exim -bp
newaliases      /usr/local/sbin/exim -bi
hoststat        /usr/local/sbin/exim
purgestat       /usr/local/sbin/exim

Создаем 2 фала

touch  /usr/local/etc/exim/domain_to_reject.list
touch /usr/local/etc/exim/sender_reject.list

/usr/local/etc/exim/sender_reject.list - для блокировки отправителей
/usr/local/etc/exim/domain_to_reject.list - блокировка доменов
получателей

Настраиваем sa_exim /usr/local/etc/exim/sa-exim.conf
Собственно находим и меняем только одну строчку

 SAEximRunCond: 1

Настраиваем EXIM /usr/local/etc/exim/configure
(тупо приводим к этому виду)

######################################################################
#                  Runtime configuration file for Exim               #
######################################################################

# Здесь мы определяем макросы, описывающие различные пути

CONFIG_PREFIX=/usr/local/etc/exim

# Здесь мы указываем, где находить наш postgresql сервер, соединение
# осуществляется через локальный сокет, команда hide помогает спрятать эту
# настройку при вызове exim -bP, когда exim выводит 
# все конфигурационные опции в
# стандартный вывод. Учтите,
# что сам /usr/local/etc/exim/configure должен иметь владельца root:wheel и
# иметь права доступа 0600, что отличается от того, что принято по умолчанию
# (0644)
#hide pgsql_servers = host/database/db_user/password
hide pgsql_servers = localhost/exim/exim/exim
# Тут мы описываем списки доменов

# Local_domains включает домены, считающиеся локальными, то есть те домены, для
# которых exim делает локальную доставку, для остальных доменов почта
# доставляется по MX записям в DNS.

domainlist local_domains =${lookup pgsql{SELECT domain FROM local_domain}}


# Список хостов, почту на которые мы явно отвергаем

hostlist host_reject = ${lookup pgsql{SELECT domain FROM hostreject}}

#Список доменов куда разрешен прием
domainlist relay_to_domains = ${lookup pgsql{SELECT hosts FROM relaytohosts}}

# Список адресов, с которых разрешена передача почты во внешний мир
#hostlist relay_from_hosts =${lookup pgsql{SELECT hosts FROM relayfromhosts}}
hostlist relay_from_hosts = localhost:127.0.0.0/8:192.168.0.0/16

# Проверка получателя
acl_smtp_rcpt = acl_check_rcpt
# Проверка mime содержимого
acl_smtp_mime = acl_check_mime
# Проверка на спам и вирусы
acl_smtp_data = acl_check_virus
# запрет для определенных emails /usr/local/etc/exim/sender_reject.list
acl_smtp_mail = acl_check_sender


# Здесь мы описываем наш антивирус
av_scanner = clamd:127.0.0.1 3310
# И spamassasin
spamd_address = 127.0.0.1 783
# Настройки пользователя и группы по умолчанию
exim_user = mailnull
exim_group = mail
# Никогда не осуществляем доставку под рутом - root должен быть алиасом на
# другого локального пользователя. Кстати, это _обязательное_ условие, заданное
# еще на этапе компиляции
never_users = root
# Настройки директории для очереди
spool_directory = /var/spool/exim
# Разделяем spool_directory на несколько более маленьких - аналог хеш таблицы,
# ускоряет обработку spool'а
split_spool_directory

# Пытаемся сделать соответствие прямой и обратной зоны dns для каждого хоста.
# Несколько затратно, но весьма полезно
# прописываем локалку чтобы не получать сообщения об идентификации локалки
host_lookup = !192.168.0.0/16 : *

# Убираем проверку identd на клиентской стороне. Из-за неправильно настроенных
# firewall'ов это часто вызывает длительные тайм-ауты, кроме того, этот сервис
# поднят не у многих
rfc1413_query_timeout = 0s

# Указываем кое-какие лимиты (их назначение ясно из названия)
smtp_accept_max = 50
smtp_connect_backlog = 40
smtp_accept_max_per_host = 10
smtp_accept_queue = 22
smtp_accept_queue_per_connection = 10
recipients_max = 16
recipients_max_reject = true
message_size_limit = 20M
accept_8bitmime

# Игнорируем сообщения, которые приходят нам же, 
# давность которых более 12-ти часов
ignore_bounce_errors_after = 12h

# Удаляем замороженные сообщения, давность которых больше 1 дней.
timeout_frozen_after = 1d

# Настройки TLS
tls_certificate = CONFIG_PREFIX/mailed.crt
tls_privatekey = CONFIG_PREFIX/mailed.key
tls_advertise_hosts = *
tls_verify_certificates = *
# Следующая опция закомментирована, но весьма полезна, 
# позволяя авторизироваться
# только через безопасный ssl канал
#auth_advertise_hosts = ${if eq{$tls_cipher}{}{}{*}}

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

begin acl

acl_check_sender:

#запрет отправки почты для определенных пользователей
# например имя@домен.net - прописываем в файле
deny senders = /usr/local/etc/exim/sender_reject.list
message = .Sender deny by server. please inform admins..

accept

#----------------------------------------------------------------------------
# Этот список доступа описывает проверки, осуществляемые при вызове любой RCPT
# командыacl_check_sender:
acl_check_rcpt:

#Блокируем отправку на домены, если необходимо
deny  message      = Domain заблокирован
      domains = /usr/local/etc/exim/domain_to_reject.list

# принимать сообщения которые пришли с локалхоста,
# не по TCP/IP
  accept  hosts = :


# разрешаем почту от корпоративных сетей
  accept hosts = 127.0.0.1 : 192.168.0.0/16

#если сервер находится за маршрутизатором, полезно указать
# IP маршрутизатора с которого проброшен 25 порт
# далее будет похожее правило для локальных интерфейсов
#  deny    condition     = ${if eq{$sender_helo_name}\
#                          {xxx.xxx.xxx.xxx}{yes}{no}}
#          message       = "Это тоже мой IP-адрес! Пшёл прочь!"

# проверка на backresolv

    deny    message       = "No backresolv for your IP!"
            !senders      = :
            condition     = ${if eq{$sender_host_name}{}{yes}{no}}


  # Запрещаем письма содержащие в локальной части
  # символы @; %; !; /; |. Учтите, если у вас было
  # `percent_hack_domains` то % надо убрать.
  # Проверяются локальные домены
  deny    message       = "Недопустимые символы в адресе"
          domains       = +local_domains
          local_parts   = ^[.] : ^.*[@%!/|]

  # Проверяем недопустимые символы для
  # нелокальных получателей:
  deny    message       = "Недопустимые символы в адресе"
          domains       = !+local_domains
          local_parts   = ^[./|] : ^.*[@%!] : ^.*/\\.\\./

  # Принимаем почту для постмастеров локальных доменов без
  # проверки отправителя (я закомментировал, т.к. это -
  # основной источник спама с мой ящик).

#  accept  local_parts   = postmaster
#          domains       = +local_domains

  # Запрещщаем, если невозможно проверить отправителя
  # (отсутствует в списке локальных пользователей)
  # У себя я это закоментил, по причине, что некоторые
  # железяки (принтеры, & etc) и программы (Касперский, DrWEB)
  # умеют слать почту, в случае проблем но не умеют ставить
  # нужного отправителя. Такие письма эта проверка не пускает.
#  require verify        = sender

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

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

# Рубаем нах, тех, кто подставляет свой IP в HELO
  deny    message       = "Не надо пихать свой IP в качестве HELO!"
          hosts         =  *:!+relay_from_hosts
          condition     = ${if eq{$sender_helo_name}\
                          {$sender_host_address}{true}{false}}


# Рубаем тех, кто в HELO пихает мой IP
  deny    condition     = ${if eq{$sender_helo_name}\
                          {$interface_address}{yes}{no}}
          hosts         = !127.0.0.1 : !localhost : *
          message       = "Это мой IP-адрес! Пшёл прочь!"

# Рубаем тех, кто в HELO пихает только цифры
# (не бывает хостов ТОЛЬКО из цифр)
  deny    condition     = ${if match{$sender_helo_name}\
                          {\N^\d+$\N}{yes}{no}}
          hosts         = !127.0.0.1:!localhost:*
          message       = "В HELO не могут быть тока цифры!"

  # Рубаем хосты типа *adsl*; *dialup*; *pool*;....
  # Нормальные люди с таких не пишут. Если будут
  # проблемы - уберёте проблемный пункт (у меня клиенты
  # имеют запись типа asdl-1233.zone.su - я ADSL убрал...)
  deny    message       = "Не нравится мне Ваш хост..."
          condition     = ${if match{$sender_host_name} \
                               {adsl|dialup|pool|peer|dhcp} \
                               {yes}{no}}
  # Рубаем тех, кто в блэк-листах. Серваки перебираются
  # сверху вниз, если не хост не найден на первом, то
  # запрашивается второй, и т.д. Если не найден ни в одном
  # из списка - то почта пропускается.
  deny    message = "host in blacklist- $dnslist_domain \n $dnslist_text"
#          dnslists      = opm.blitzed.org : \
#                          proxies.blackholes.easynet.nl : \
#                          cbl.abuseat.org : \
#                          bl.spamcop.net : \
#                          bl.csma.biz : \
#                          dynablock.njabl.org :

	dnslists      =  :


  # Задержка. (это такой метод борьбы со спамом,
  # основанный на принципе его рассылки) На этом рубается
  # почти весь спам. Единственно - метод неприменим на
  # реально загруженных MTA - т.к. в результате ему
  # приходится держать много открытых соединений.
  # но на офисе в сотню-две человек - шикарный метод.
  #
  # более сложный вариант, смотрите в статье по exim и
  # курьер имап. Т.к. там метод боле умный (просто правил
  # больше :), то можно и на более загруженные сервера ставить)
  warn
        # ставим дефолтовую задержку в 20 секунд
        set acl_m0 = 10s
  warn
        # ставим задержку в 0 секунд своим хостам и
        # дружественным сетям (соседняя контора :))
        hosts = +relay_from_hosts
        set acl_m0 = 0s


  # Проверка получателя в локальных доменах.
  # Если не проходит, то проверяется следующий ACL,
  # и если непрошёл и там - deny
  accept  domains       = +local_domains
          endpass
          message       = "В этом домене нет такого пользователя"
          verify        = recipient

  # Проверяем получателя в релейных доменах
  # Опять-таки если не проходит -> следующий ACL,
  # и если непрошёл и там - deny
  accept  domains       = +relay_to_domains
          endpass
          message       = "Моя сервера не знать маршрут на этот хост..."
          verify        = recipient
  # Разрешаем почту от доменов в списке relay_from_hosts
  accept  hosts         = +relay_from_hosts
        deny hosts         =!+relay_from_hosts

  # Реализация нашего бан-листа
  deny   hosts          = +host_reject
         message        = You are banned. Go away.

  # еще боримся со спамом и вирусами
  deny    message       = Мы не принимает ".$found_extension" \
                          незапакованные вложения \
                          Для отправки запакуйте их.
          demime = bat:btm:cmd:com:cpl:dll:exe:lnk:msi:pif:prf:reg:scr:vbs:url

  # Если неподошло ни одно правило - чувак явно ищет
  # открытый релей. Пшёл прочь. :)
  deny    message       = "Свободен. Это тебе не ОпенРелей."

  # Список доступа для проверки mime частей сообщения
acl_check_mime:

  # Произодим декодирование mime сообщений. Полезно для дальнейшей проверки на
  # вирусы
  warn decode = default

  # Можно очень быстро отсеять сообщения, просто запретив некоторые mime
  # вложения, чаще всего содержащие вирусы, хотя, конечно, это не панацея
  deny message = Blacklisted file extension detected
       condition = ${if match \
          {${lc:$mime_filename}} \
          {\N(\.wav|\.cpl|\.pif|\.bat|\.scr|\.lnk|\.com)$\N} \
                     {1}{0}}

  # Много ли у нас людей, знающих китайский? 
  # А вот китайского спама это поубавит
  # :)
  deny message = Sorry, noone speaks chinese here
       condition = ${if eq{$mime_charset}{gb2312}{1}{0}}

  accept

# Проверка содержимого на вирусы и спам
acl_check_virus:
        # Мы не запрещаем письма со спамом, а просто добавляем заголовок,
        # содержащий количество спамерских очков, а пользователь на своей
        # стороне уже просто настраивает свои фильтры. Так мы исключаем жалобы
        # со стороны пользователей о потерянных письмах
        # Добавляем заголовки, указывающие, что письма были проверены
        # spamasssasin'ом
        warn message = X-Spam-Scanned: Yes
        warn message = X-Spam-Scanner: SpamAssassin running
#-
        warn    spam       = spamd
             hosts      = ! +relay_from_hosts
             add_header = X-Spam_score: $spam_score\n\
                                   X-Spam_score_int: $spam_score_int

        deny    message    = "We don't need your spam"
            hosts      = ! +relay_from_hosts
            condition  = ${if>{$spam_score_int}{69}{1}{0}}
#-

        # Вот что-что, а вирусы нам не нужны.
        deny  message   = Message rejected: virus found. \
Your message was successfully trashed.
                    hosts       = *
                    malware     = *
        accept

######################################################################
#                      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

# Роутер, осуществляющий поиск по MX записям в DNS
dnslookup:
  driver = dnslookup
  domains = ! +local_domains
  transport = remote_smtp
  ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
  no_more

# Все останльные роутеры обслуживают доставку локальной почты

# Драйвер алиасов пользователя. Обратите внимание на lookup в pgsql базе. Что
# интересно, этот lookup работает даже для иерархических алиасов
# Также определяются транспорты
# для передачи почты в файл (>/path/to/file) и в pipe
# (|/usr/local/libexec/slocal)
system_aliases:
  driver = redirect
  allow_fail
  allow_defer
  data = ${lookup pgsql{select alias from aliases \
           where mail ='$local_part'}{$value}fail}
  user = mailnull
  group = mail
  file_transport = address_file
  pipe_transport = address_pipe


#routers переадресация почты
userforward:
  driver = redirect
  allow_fail
  allow_defer
  data = ${lookup pgsql{SELECT recipients FROM userforward \
         WHERE local_part='${local_part}'}}
############################################################################



# Локальная доставка, если данный пользователь найдем в базе

localuser:
  driver = accept
  condition = ${lookup pgsql {select uid from \
            accounts where login = '$local_part'}{yes}{no}}
  transport = local_delivery
  cannot_route_message = Unknown user

######################################################################
#                      TRANSPORTS CONFIGURATION                      #
######################################################################
#                       ORDER DOES NOT MATTER                        #
#     Only one appropriate transport is called for each delivery.    #
######################################################################

begin transports

# Драйвер для доставки через соединения с удаленными smtp серверами
remote_smtp:
  driver = smtp

# Этот транспорт доставляет почту в локальные maildir'ы. 
# Путь к maildir хранится
# опять же в таблице accounts. Разрешения на директорию 0770 для возможности
# работы с данными директориями imap сервера. При этом владельцем является
# группа и пользователь из accounts 
#(потому при вставлении записей в эту таблицу
# надо начинать значения uid с достаточно большого числа, например, 2000 и
# пересекаться с реальными пользователями оно должно только если реальному
# пользователю нужен локальный доступ к maildir'у).
# Также из таблицы accounts извлекается данные о размере квоты, и
# устанавливается порог в 75% от квоты, когда пользователю посылается указанное
# предупреждение об подходе к порогу квоты
local_delivery:
  driver = appendfile
  directory = ${lookup pgsql{select maildir from \
            accounts where login = '$local_part'}{$value}fail}
  create_directory
  directory_mode = 0770
  maildir_format
  delivery_date_add
  envelope_to_add
  return_path_add
  group = 26
  user = 26
  mode = 0660
  no_mode_fail_narrower
  quota = ${lookup pgsql{select mailquota from \
        accounts where login = '$local_part'}{$value}fail}M
  quota_warn_message = "\
          To: $local_part\n\
        From: postmaster@test.ru\n\
        Subject: Your maildir is going full\n\
        This message is automaticaly gnerated by your mail server.\n\
        This means, that your mailbox is 75% full. If you would \n\
        override this limit new mail would not be delivered to you!\n"
  quota_warn_threshold = 75%

# Транспорт, осуществляющий доставку в pipe
address_pipe:
  driver = pipe
  return_output

# Транспорт, осуществляющий доставку прямо в файл
address_file:
  driver = appendfile
  delivery_date_add
  envelope_to_add
  return_path_add

# Этот транспорт используется для автоматического ответа на сообщения
#об ошибках

address_reply:
  driver = autoreply

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

begin retry

# Настройки по умолчанию, которые я не трогал, управляют интервала повторной
# передачи сообщений

# This single retry rule applies to all domains and all errors. It specifies
# retries every 15 minutes for 2 hours, then increasing retry intervals,
# starting at 1 hour and increasing each time by a factor of 1.5, up to 16
# hours, then retries every 6 hours until 4 days have passed since the first
# failed delivery.

# Address or Domain    Error       Retries
# -----------------    -----       -------

*                      *           F,2h,15m; G,16h,1h,1.5; F,4d,6h


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

# Описания аутентификации

begin authenticators
# CRAM-MD5 аутентификация, требует наличия пароля в открытом виде, имя
# пользователя должно быть в формате user, как оно хранится в таблице
# accounts
lookup_cram:
        driver = cram_md5
        public_name = CRAM-MD5
        server_secret = ${lookup pgsql {select password \
                      from accounts where login='$1'}{$value}fail}
        server_set_id = $1
# LOGIN аутентификация - не требует хранения пароля в открытом виде, однако, по
# сети пароль передается в открытом виде - требуется лишь выполнение условия
# server_condition - $1 - имя пользователя, а $2 - пароль. LOGIN безопасен
# только при установлении ssl соединения.
login:
        driver = plaintext
        public_name = LOGIN
        server_prompts = Username:: : Password::
        server_condition = ${lookup pgsql {select login \
          from accounts where login='$1' and password='$2'}{yes}{no}}
        server_set_id = $1


# End of Exim configuration file

P.S если у вас несколько обслуживаемых доменов, лучше замените
domainlist local_domains =${lookup pgsql{SELECT domain FROM local_domain}}
на
domainlist local_domains = testim.ua : domain1.testim.ua : mailcomp
mailcomp = имя вашего сервера, которое назначили при установке
(в /etc/rc.conf hostname="mailcomp" и в /etc/hosts указали как
xx.xx.xx.xx mailcomp mailcomp.testim.ua)
Чтобы почта приходящая на root@localhost (root@mailcomp) приходила
на (к примеру) postmaster@testim.ua - сделайте переадресcацию через
вэб интерфейс с root@mailcomp на postmaster@testim.ua (при этом,
заводить юзера root через вэб - не нужно (!), только переадрессация
на заведенного пользователя postmaster)

cd /usr/local/etc/exim/

Генерим сертификаты

openssl genrsa -out mailed.key 2048
openssl req -new -x509 -key mailed.key -days 365 -out mailed.crt

Настраиваем dovecot /usr/local/etc/dovecot.conf



#!/bin/sh

# Директория где храняться данные на время выполнения
# (временная чтоль, тогда почему не /tmp?)
base_dir = /var/run/dovecot/

# Протоколы по которым обслужиаем клиентов:
#  imap imaps pop3 pop3s
protocols = imap pop3

listen = *

# Отключить поддержку SSL/TLS (yes/no - соответсвенно включено/отключено).
ssl = no

# Отключить команду LOGIN и все другие plaintext аутентификации если
# SSL/TLS не используется. (совместимо с LOGINDISABLED). Отметтьте, что
# 127.*.*.* и IPv6 ::1 адреса считаются безопасными, и установки этого пункта
#  не влияют на соединение с них.
disable_plaintext_auth = no


# Убивать все IMAP и POP3 процессы при остановке главного процесса dovecot
# Если поставить "no" то можно обновлять (видимо - реконфигурить) dovecot
# без принудительного закрытия открытых клиентских подключений (может быть
# проблемой - если обновление из-за безопасности).
# Надо учесть, что после того как убит мастер-процесс, клиентские процессы
# не могут писать в лог (так что, происходящее, останется неизвестным).
shutdown_clients = yes

# Для информационных сообщений юзайте этот файл, вместо дефолтового
info_log_path = /var/log/dovecot

# Префикс для каждой линии записываемой в syslog. Коды % прредставлены
# в формате strftime(3).
log_timestamp = "%b %d %H:%M:%S "

# Средства (немогу подобрать адекватный перевод для слова "facility", в
# таких фразах) syslog используемые при ведении логов через syslog.
# Если по каким-то причинам не хочется использовать стандартное "mail",
# можно использовать local0...local7.
syslog_facility = mail

## Секция "Про лОгины" :)
## 

# Директория где аутентификационный процесс размещает UNIX сокеты
# которые требуются для процесса логина. Сокеты создаются от суперпользователя,
# поэтому можно не беспокоится насчёт прав. При старте dovecot всё
# содержимое этой директории удаляется.
login_dir = /var/run/dovecot/login

# `chroot`ить процесс аутентификации и авторизации в login_dir.
# Очень неплохая идея - ибо этот процесс работает от рута.
# http://wiki.dovecot.org/Rootless
login_chroot = yes

# Юзер использующийся для процесса логина. При установке из
# портов создаётся новый юзер - dovecot, причём не создав его не
# хочет ставиться. Ненавижу такие инсталляторы и людей их пишуших.
# В конце-концов мне видней нужен ли мне такой юзер и какого я буду
# использовать для этого процесса.
# Этому юзеру не нужен доступ к почте, он занимается тока
# контролем доступа к авторизации пользователя.
# http://wiki.dovecot.org/UserIds
login_user = dovecot

# Максимальный размер процесса, в мегабайтах. Если Вы не используете
# login_process_per_connection, то вероятно необходимо увеличить
# это значение.
login_process_size = 64

login_process_per_connection = yes

# Число запускаемых процессов логина. Если 'login_process_per_connection'
# равно 'yes', то это число свободных процессов ожидающих подключения
# пользователей.
login_processes_count = 3

# Эта опция работает только в случае если 'login_process_per_use' = 'yes'.
login_max_processes_count = 64

# Максимальное число соединений разрешённых в сосоянии 'логина'. Когда
# достигается указанный тут лимит, самые старые связи разрываются. Если
# 'login_process_per_connection' = 'no', то это число соединений процесса,
# таким образом максимальное число одновременно залогиненых юзеров равно
# 'login_processes_count' * 'max_logging_users'.
login_max_processes_count = 128

# Приветственное сообщение для клиентов.
login_greeting = dovecot MUA ready

# Разделённый пробелами лист элементов, которые будут записаны в лог. Непустые
# элементы будут объединены через запятую.
login_log_format_elements = user=<%u> method=%m rip=%r lip=%l %c

# Формат лога аутентификации. %$ содержит цепочку login_log_format_elements,
# %s содержит данные которые будут залогированы.
login_log_format = %$: %s

## Процесс почты
## (настройки раздачи почты клиентам)

# Максимальное число запущенных mail процессов. Когда этот лимит достигнут,
# новые юзеры обламываются :)
#max_mail_processes = 1024

# Показывать больше отладочной информации (заголвков процессов?). В настоящее
# время показывается имя пользователя и IP адрес. Это может быть полезно
# для того, чтобы увидеть кто фактически использует процессы IMAP
# (общие майлбоксы, или если один uid используется несколькими аккаунтами).
verbose_proctitle = yes

# Показывать уровень протокола ошибок SSL.
#verbose_ssl = no

# Действительный диапазон UID для пользователей, дефолт от 500 и выше. Это
# необходимо для того, чтобы пользователи не смогли залогиниться как
# демоны или какие-либо системные пользователи. Запрет для логина `root`а
# жёстко забит в код `dovecot`а и не может быть разрешён даже если
# установить 'first_valid_uid' = 0.
first_valid_uid = 25

# Диапазон GID для юзеров, по дефолту не root или wheel. Юзерам имеющим
# недействительный GID как ID первичной группы вход запрёщён. Если пользователь
# входит в дополнительную группу с недействительным GID то эти группы
# не заданы (непонимаю эту фразу... Либо разрешено либо запрещено... х.з.)
first_valid_gid = 0
#last_valid_gid = 0

# Разрешить доступ для для дополнительных групп процессов обработки почты.
# Обычно, разрешается группа "mail" для доступа к /var/mail чтобы
# создавать блокировки
mail_privileged_group = mail

# Включить отладку для процесса обработки почты. Это может помочь понять,
# почему dovecot не может найти вашу почту (дословно переведено :))
#mail_debug = yes

# Переменные окуружения MAIL для использования в случаях, когда явно они
# не заданы. Если оставить их незаданными то dovecot попробует установить
# их автоматически (описано в doc/mail-storages.txt). Есть несколько
# специальных переменных которыми можно пользоваться:
#
#   %u - имя пользователя
#   %n - `юзерская` часть в user@domain, тоже самое что и %u
#         если имя домена не задано
#   %d - `доменная` часть в user@domain, пустая, если домен не задан
#   %h - домашняя директория
#
# Полный список этих переменных можно посмотреть в 
# /usr/local/share/doc/dovecot/doc/variables.txt
mail_location = maildir:/d/%n

protocol imap {

  # Поддержка динамически загружаемых плагинов. mail_plugins - список
  # плугинов разделённый пробелами
#  mail_plugins = quota trash
#  mail_plugin_dir = /usr/local/lib/dovecot

  imap_client_workarounds = delay-newmail outlook-idle \
                             netscape-eoh tb-extra-mailbox-sep
}

## Специфические настройки POP3
##

protocol pop3 {
  #
  pop3_uidl_format = %08Xu%08Xv

  pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
}


# своя доставка dovecot - delivery
protocol lda {
  # Куда слать письма про превышение квоты
  postmaster_address = postmaster@testim.ua

  # путь к сокету
  auth_socket_path = /var/run/dovecot/auth-master
}


##
## Процессы аутентификации
##

auth default {
  # Список требуемых механизмов аутентификации, разделённый пробелами
  #   plain login digest-md5 cram-md5 ntlm rpa apop anonymous gssapi
  mechanisms = plain

   # Добавлено для работы deliver от dovecot
   socket listen {
     master {
       path = /var/run/dovecot/auth-master
       mode = 0600
       user = mailnull
       #group = mail
     }
   }


  # SQL database
  passdb sql {
    # Путь к конфигурационному файлу SQL, велено смотреть дополнительную
    # инфу в файле doc/dovecot-sql.conf, тока такого файла нету :))) - не
    # инсталлится. В исходниках он есть. Там и смотрим.
    args = /usr/local/etc/dovecot-sql.conf
  }

  # SQL database
  userdb sql {
    # Путь к конфигурационному файлу SQL, велено смотреть дополнительную
    # инфу в файле doc/dovecot-sql.conf, тока такого файла нету :))) - не
    # инсталлится. В исходниках он есть. Там и смотрим.
    args = /usr/local/etc/dovecot-sql.conf
  }

}


plugin {
trash = /usr/local/etc/dovecot-trash.conf
}

Обратите внимание !!! mail_location = maildir:/d/%n
Если вы выбрали другую директорию для ящиков, переназначьте во избежание
ошибки "Couldn't open INBOX".(Замените /d на /var/mail например)


Создаем /usr/local/etc/dovecot-sql.conf


driver = pgsql
connect = host=localhost dbname=exim user=exim password=exim
default_pass_scheme = PLAIN
password_query = SELECT login as username, password FROM accounts \
WHERE login = '%n'
user_query = SELECT maildir as home,26 as uid,26 as gid FROM accounts \
WHERE login = '%n'

* Команды прописывайте в одной строке! (в статье нельзя сделать строку
более 80 символов)

Создаем /usr/local/etc/dovecot-trash.conf , где указываем очередность
очистки директорий в случае превышения квоты.

1 Spam
2 Trash
3 Sent

В /etc/crontab добавим строки

10      3       *       *       *       root    /usr/local/bin/sa-update
20      3       *       *       *       root    /usr/local/bin/freshclam

и перезапустим /etc/rc.d/cron restart
Тепперь БД антивируса и антиспама будут обновляться раз в сутки в 3 утра.

Создаем /usr/local/etc/monitrc следующего вида


###############################################################################
## Monit control file
###############################################################################

set daemon  120              # check services at 2-minute intervals
set logfile /var/log/monit/monit.log
set mailserver mailcomp

set mail-format { from: postmaster@testim.ua
subject: $SERVICE $EVENT at $DATE
message: Monit $ACTION $SERVICE at $DATE on $HOST: $DESCRIPTION.
}

set alert postmaster@testim.ua

#---
check process apache with pidfile /var/run/httpd.pid
    start program = "/usr/local/etc/rc.d/apache22 start"
    stop program  = "/usr/local/etc/rc.d/apache22 stop"
    if cpu > 60% for 2 cycles then alert     # если загрузка cpu > 60% послать
                                             # предупреждение
    if cpu > 80% for 5 cycles then restart   # если загрузка cpu > 80% послать
                                             # перезапустить процесс
    if totalmem > 200.0 MB for 5 cycles then restart  # если юзается
                                             # больше 200 MB мозгов
                                             # перезапустить процесс
    if children > 250 then restart         # если дочерних процессов > 250
    if 3 restarts within 5 cycles then timeout # если 3 раза уже перезапускали
                                             # процесс сделать timeout
#---
check process spamd with pidfile /var/run/spamd/spamd.pid
   start program = "/usr/local/etc/rc.d/sa-spamd start"
   stop program = "/usr/local/etc/rc.d/sa-spamd stop"
   if failed host 127.0.0.1 port 783 type TCP then restart
   if 10 restarts within 20 cycles then timeout
   if cpu usage > 99% for 5 cycles then restart
   if mem usage > 99% for 5 cycles then restart
#---
check process dovecot with pidfile /var/run/dovecot/master.pid
    start program = "/usr/local/etc/rc.d/dovecot start"
    stop program  = "/usr/local/etc/rc.d/dovecot stop"
    if cpu > 60% for 2 cycles then alert
    if cpu > 80% for 5 cycles then restart
    if totalmem > 100.0 MB for 5 cycles then restart
    if children > 100 then restart
    if 5 restarts within 5 cycles then timeout
    if failed port 110 type TCP protocol POP then restart
#---
check process exim with pidfile /var/run/exim.pid
    start program = "/usr/local/etc/rc.d/exim start"
    stop program  = "/usr/local/etc/rc.d/exim stop"
    if cpu > 70% for 2 cycles then alert
    if cpu > 80% for 5 cycles then restart
    if failed port 25 protocol smtp then restart
    if 5 restarts within 5 cycles then timeout

PS меняем postmaster@testim.ua и mailcomp на свой

Поскольку я человек ленивый , ребутнемся , чтобы не запускать все вручную.

Создадим тестового пользователя
psql -U exim exim
SET client_encoding to 'koi8-r';
INSERT INTO accounts VALUES (1,'test','12345','/d/test/','/d/test/',20,'Иванов И И');
INSERT INTO accounts VALUES (2,'retest','12345','/d/retest/','/d/retest/',20,'Петров');
INSERT INTO local_domain VALUES ('testim.ua');
INSERT INTO relayfromhosts VALUES ('localhost','локально');
INSERT INTO relayfromhosts VALUES ('192.168.0.0/16','тоже локалка');
INSERT INTO relaytohosts VALUES ('testim.ua','наш любимый');
INSERT INTO hostreject VALUES ('195.195.195.195','ну не нравится он мне');
INSERT INTO userforward VALUES (1,'test','retest@testim.ua');
\q

*Обратите внимение на заполнение таблицы userforward !
Имя (без домена ) на полный email адресс!

Теперь проверим работоспособность exim
mail -s testmail test@testim.ua < /etc/rc.conf
tail /var/log/exim/mainlog

Если директория /d/test создана - все ОК, нет -
проверяем права доступа к директории /d и настройки.
(chown -R 26:26 /d  где 26 uid mailnull который мы прописали
в конфиге dovecot-sql.conf)
При чем , должна быть создана и директория /d/retestim , т.к.
мы внесли данные в таблицу переадрессации почты.
Дальше проверяем отправку от test@testim.ua на самого себя
и куда-то в мир.Смотрим лог : на себя отправка проходит, в мир
типа
... Domain of sender address test@testim.ua does not exist

Теперь можно прописывать реальный домен и пользователей.
(Замените testim.ua на ваш домен и директорию /d на вашу в конфиге
dovecot , а так же данные в БД exim Postgresql)
Замечание : директории для ящика НЕ создаются , пока не будет получено
первое письмо, поэтому, после вставки нового юзера в БД, либо
создайте директории , либо выполните команду
mail -s hello_new_user new_user@domain < file_to _hello

Для настройки squirrelmail необходимо зайти в /usr/local/www/squirrelmail/
и запустить configure. Далее настроить по необходимости.
В /usr/local/etc/apache22/extra/httpd-vhosts.conf прописать типа :

<VirtualHost *:8888>
    ServerAdmin webmaster@testim.ua
    DocumentRoot "/usr/local/www/squirrelmail"
    ServerName testim.ua
    ErrorLog "/var/log/testim.ua.error_log"
    CustomLog "/var/log/testim.ua.access_log" common
</VirtualHost>

И в /usr/local/etc/apache22/httpd.conf пропишем Listen 8888
Перезапускаем апач.
*Скорее всего возникнет ошибка при использовании squirrelmail, для устранения которой
вставьте в начало файла /usr/local/www/squirrelmail/functions/date.php ,
после <?php , команду date_default_timezone_set("Europe/Kiev");
Ну и запускаем http://ваш_ip:8888/ , входим с логином retest и паролем 12345 и
видим счастье в виде вашего rc.conf.

Подробно о настройках squirrelmail смотрим здесь

Загружаем
простенькую управляющую вэб мордочку
файл скачан размер размещён примечание
exim-wwww.tgz
756 3.7kb 2011-06-14

***Файл перезалит!
Кидаем архив в /usr/local/www/ (или куда захотите) и распаковываем
(tar -xzf exim-www.tgz)
В /usr/local/etc/apache22/extra/httpd-vhosts.conf добавляем

<VirtualHost *:9999>
    ServerAdmin webmaster@testim.ua
    DocumentRoot "/usr/local/www/exim-www"
    <Directory / >
        Allowoverride All
    </Directory>
    ServerName testim.ua
    ErrorLog "/var/log/testim.ua.error_log"
    CustomLog "/var/log/testim.ua.access_log" common
</VirtualHost>

Перезапускаем апач , генерим пароль для админа (смотрим .htaccess где хранить
пароль,ну и подправляем под себя)
и запускаем http://ваш_IP:9999/

Собственно все. Если установку делали копи-пастом , должно все заработать.
Управляющая формочка простая и примитвная, но рабочая.



размещено: 2011-06-06,
последнее обновление: 2013-04-16,
автор: DNK


KIper, 2011-06-09 в 12:40:49

Хотелось бы, вместо довекота, cyrus imap использовать. Потому что cyrus imap на много интереснее в плане управления через cyradm и sieve.

KIper, 2011-06-09 в 12:51:05

опечатка:
### Впроцессе установки отвечаем на поросы по желанию

DNK, 2011-06-09 в 12:52:45

О вкусах не спорят. Dovecot удобный в настройках,
да и по функционалу хорош.
Спасибо, ошибку исправил

aibolit, 2011-06-09 в 14:44:18

Спасибо за статью. Прошу исправить "dovekot" на "dovecot" в заголовке статьи.

JsN, 2011-06-24 в 8:56:02

Всё работает! Большое спасибо!

DNK, 2011-06-24 в 9:30:46

Пользуйтесь :) Теперь попробуйте разобраться с настройками

gabell, 2011-06-24 в 19:23:21

А вы реально тестировали эту систему на 10000 абонентов?

alik, 2011-06-26 в 22:31:11

Автор спасибо за статью, но если можно допишите пжл
создание алиасов а также запрет входящих писем на некоторые алиасы.

Очень нужно.
Заранее спасибо.

DNK, 2011-06-29 в 10:14:45

В данной статье описан вариант авторизации по имени и паролю , а не имени@домену.Поэтому, если у вас на почтовый сервер направляется почта с нескольких доменов
(например : ***@my.domain и ***@second.domain),в этом случае вы получите на один логин два почтовых ящика
(например test@my.domain = test@second.domain).Чтобы разделить почту , необходимо внести изменения в настройки exim (авторизация будет по логин@домен)
Конструкции вида
${lookup pgsql {select ЧТО_ТО from \
           accounts where login = '$local_part'}{yes}{no}}
где обращение к таблице accounts ,заменить на
${lookup pgsql {select ЧТО_ТО from \
           accounts where login = '${local_part}@${domain}'}{yes}{no}}
По поводу запрета входящей почты - почитайте на форуме, там есть.Хотя самый простой способ не получать письма на алиас - не создавать алиас.
Надеюсь я правильно понял ваш вопрос.

k21, 2011-07-04 в 23:43:47

Уважаемый DNK, сделал вроде бы все так как на писано в этой довольно таки позновательно как для меня новичка в *nix системах пользователя, но неработает. ситуация в следующем
при mail -s testmail test@testim.ua < /etc/rc.conf
tail /var/log/exim/mainlog

пишет что нет разрешения на папку /d/test.
я дал ей разрешения как написано тут chown -R 26:26 /d

может быть я до конца не понимаю логики, но разве польвателю mailnull (26) разрешено создавать папки прямо от корня или в базе поля  maildir character varying(255) и    home character varying(255) заполнены одинаковыми путями это не ошибка? (хотя скорее всего я чегото до конца не понял где по абсолютному пути должны располагаться ящики пользователей)

DNK, 2011-07-05 в 9:43:16

В статье я указал о необходимости задания разрешений
на директорию /d
1) 26:26 посмотрите в /etc/passwd значение mailnull
2)chown -R mailnull:mailnull /d
3)или можете сделать chmod -R a+wr /d (худший случай)
В БД таблице accounts поля одинаковы, собственно home не используется. Это поле таблицы понадобится (возможно)
когда разберетесь с конфигом exim и будете расширять
настройки.Абсолютный путь для ящиков - maildir.

k21, 2011-07-05 в 21:22:55

DNK спасибо разьяснили, хотя по кесту и так было написано достаточно ясно что абсолютный путь /d/<ящики пользователей>
все работает! Спасибо за статью

DNK, 2011-07-05 в 22:40:45

Да не за що :))
В настройках exim использован хороший способ борьбы со спамом.Мне было лень его описывать.Думаю, наблюдая за логами , вы это увидите.Но (!) все-таки разберитесь с настройками exim и dovecot, найдете много интересного.
Удачи.

k21, 2011-07-06 в 9:13:12

сори забыл еще уточнить один непонятный мне момент.
как связан squirrelmail c нашей БД логинов (или откуда эта вэб мордочка знает о существовании заполненных в БД логинов) что-то подобное (имеется ввиду привязка к БД) я видел при запуске configure squirrelmail но что куда вписывать несовсем разобрался...если можете поясните как реализована эта связка в данной статье и как бы можно было связать с БД...

DNK, 2011-07-06 в 9:35:14

Squirrelmail никак не связан с БД. Авторизация происходит по протоколу IMAP (http://kunegin.narod.ru/ref3/email/pop_imap.htm)
На самом деле, squirrelmail можно поднимать на любой машине, а не на почтовом сервере.Его конфигурация по умолчанию настроена на локальную машину, поэтому у вас проблем при запуске и не возникло.

k21, 2011-07-06 в 10:00:42

спасибо теперь прояснилось :-)

k21, 2011-07-08 в 22:57:50

установил разрешения 600 для этих файлов при отправки от почты gmail.com письмо не доставляется и в логах пишет не может получить доступ к этим файлам сертификата, когда устанавливаешь всем на чтение, то письма приходят. но насколько это безопасно чтобы все читали эти файлы или какие правельные разрешения должны быть установлены?
tls_certificate = CONFIG_PREFIX/mailed.crt
tls_privatekey = CONFIG_PREFIX/mailed.key

DNK, 2011-07-11 в 9:40:39

1)убейте сертификаты и создайте заново (от рута)
2)не убивая :
chown root:wheel /usr/local/etc/exim/mailed*

k21, 2011-07-11 в 21:34:15

пробовал все как написано в обоих вариантах
разрешения изначально были именно такими как вы и сказали
root.wheel 600 для этих файлов
но в логах пишет ошибку насколько я понимаю связаную именно с ними
"(SSL_CTX_use_PrivatKey_file file=/usr/local/etc/exim/maled.key): error 0200100D: system lybrary:fopen: permission denied" если можете обясните что не так делаю....

_KUL, 2011-07-12 в 7:26:46

Вопрос - а почему используется PostgreSQL а не MySQL ? Это чем то обусловлено или сила привычки?

dnk, 2011-07-12 в 9:47:33

2 _KUL я ( в отличии от уважаемого лиссяры) предпочитаю
постгрес, как БД для профессиональных систем (пример :
PGSQL используется в биллингах японии и германии для управления жд перевозками, авиа диспетчерской службой и т.д)
2 к1

-rw-r--r—   1 root  wheel   1570  8 июн 12:41 mailed.crt
-rw-r--r—   1 root  wheel   1679  8 июн 12:40 mailed.key
вам придется пересобрать почтовик заново.
при сборке вы использовали не стандартные установки и включили использование СTX (его нужно убрать- опция TLS).
и почему у вас ссылка на файд maled.key а не mailed.key?
Перед пересборкой попробуйте chmod a+wrx на эти файлы.Да , проверьте от кого запускается exim, если не от рута - возможна данная ошибка.

k21, 2011-07-12 в 10:46:33

спасибо уважаемый dnk, буду пробовать
- да при сборке эксима я скроее всего увидев что в статье используется tls и подумав что для єксима забыли указать выбрал ее (как оказалось зря т.к несовсем понимал то это или не то)
- если дать разрешения на эти файлы для всех на чтение то письма доходят с гугла (читал в других источниках пишут что для этих файлов если не дать пользователю и группе эксима доступ на чтение то небудет работать, а других что нужно обязатально только для рута дать тоступ и только)
я так понимаю для dovevot (который имеет доступ к этим файлам от root это не проблема и будет работать просто указав к ним путь, весь вопрос - дать нужные разрешения для эксима.
-разные имена файлов maled.key а не mailed.key - это опечатка

в одном из коментов вы дали очень хорушую ссылку на статью по проверки работоспособности протоколов imap и pop3 из консоли, уже 2 день занимаюсь поисками подобніх команд для imaps и pop3s...немоглибы вы дать какуюто толковую статью по проверки работы этих протоколов из консоли

DNK, 2011-07-12 в 11:29:28

Когда уберете TLS , разрешения для exim - рутовские.
Никаких дополнительных разрешений ни на один конфиг не назначается!
Для проверки работы почтовой системы локально - используйте mail (man mail), а так же смотрите логи.

k21, 2011-07-12 в 23:33:40

насколько я понимаю:
-rw-r--r—   1 root  wheel   1570  8 июн 12:41 mailed.crt
-rw-r--r—   1 root  wheel   1679  8 июн 12:40 mailed.key
тут чтение секретного файла mailed.key для всех (это настораживает)

при переустановке эксима не выбирал опцию TLS при этом эксим перстал понимать в своем конфиге строки с tls_:
tls_certificate = CONFIG_PREFIX/mailed.crt
tls_privatekey = CONFIG_PREFIX/mailed.key
tls_advertise_hosts = *
tls_verify_certificates = *
auth_advertise_hosts = ${if eq{$tls_cipher}{}{}{*}}
эксим запускается под рутом. файлы ключей пересоздавал под рутом. хоть убейте не пашет. в конфиге dovecot добавил строки для поддержки tls:
protocols = imap imaps pop3 pop3s
listen = *
ssl_disable = no
ssl_cert_file = /usr/local/etc/exim/mailer.crt
ssl_key_file = /usr/local/etc/exim/mailer.key
disable_plaintext_auth = no
в итоге начал тестить получил слежующий ошибки (должен заметить что у меня в сети нет ДНС и ДХЦП, но при Вашем конфиге по умолчанию все работало и без них, вернее без записи MX о моем почтовике в прямой и обратной зоне ДНС, но стоило поробовать перейти на защишеное соединение TLS как вот такая ситуация. наверое чтото я не добавил в конфиги для поддержки работы по imaps и pop3s)
<мой реальный домен># /usr/local/sbin/exim -bV
Exim version 4.76 #0 (FreeBSD 8.2) built 12-Jul-2011 21:11:17
Copyright (c) University of Cambridge, 1995 - 2007
Probably Berkeley DB version 1.8x (native mode)
Support for: crypteq iconv() use_setclassresources PAM Perl Expand_dlfunc OpenSSL Content_Scanning DKIM Old_Demime
Lookups (built-in): lsearch wildlsearch nwildlsearch iplsearch cdb dbm dbmnz dnsdb dsearch nis nis0 passwd pgsql
Authenticators: cram_md5 dovecot plaintext spa
Routers: accept dnslookup ipliteral manualroute queryprogram redirect
Transports: appendfile/maildir/mailstore/mbx autoreply lmtp pipe smtp
Fixed never_users: 0
Size of off_t: 8
Configuration file is /usr/local/etc/exim/configure
<мой реальный домен># /usr/local/sbin/exim -bV
Exim version 4.76 #0 (FreeBSD 8.2) built 12-Jul-2011 21:11:17
Copyright (c) University of Cambridge, 1995 - 2007
Probably Berkeley DB version 1.8x (native mode)
Support for: crypteq iconv() use_setclassresources PAM Perl Expand_dlfunc OpenSSL Content_Scanning DKIM Old_Demime
Lookups (built-in): lsearch wildlsearch nwildlsearch iplsearch cdb dbm dbmnz dnsdb dsearch nis nis0 passwd pgsql
Authenticators: cram_md5 dovecot plaintext spa
Routers: accept dnslookup ipliteral manualroute queryprogram redirect
Transports: appendfile/maildir/mailstore/mbx autoreply lmtp pipe smtp
Fixed never_users: 0
Size of off_t: 8
Configuration file is /usr/local/etc/exim/configure
<мой реальный домен>#
<мой реальный домен># cd /usr/local/sbin/
<мой реальный домен># exim -bt <мой реальный ящик>@mail.ru
<мой реальный ящик>@mail.ru
 router = dnslookup, transport = remote_smtp
 host mxs.mail.ru [94.100.176.20] MX=10
<мой реальный домен># exim -bt user1@<мой реальный домен>.org.ua
user1@<мой реальный домен>.org.ua
 router = localuser, transport = local_delivery
<мой реальный домен># exim -v user1@<мой реальный домен>.org.ua
From: user2@<мой реальный домен>.org.ua
To: user1@<мой реальный домен>.org.ua
Subject: Testing Exim My!!!
Theis is a test message !!!!
LOG: MAIN
 <= root@<мой реальный домен>.org.ua U=root P=local S=409
<мой реальный домен># delivering 1Qgi33-0000Mi-BR
LOG: MAIN
 => user1 <user1@<мой реальный домен>.org.ua> R=localuser T=local_delivery
LOG: MAIN
 Completed

<мой реальный домен># exim -v <мой реальный ящик>@mail.ru
From: user2@<мой реальный домен>.org.ua
To: <мой реальный ящик>@mail.ru
Subject: Testing Exim

This is a Hall!
LOG: MAIN
 <= root@<мой реальный домен>.org.ua U=root P=local S=364
<мой реальный домен># delivering 1Qgi5v-0000Mt-Ua
Connecting to mxs.mail.ru [94.100.176.20]:25 ... connected
 SMTP<< 220 Mail.Ru ESMTP
 SMTP>> EHLO <мой реальный домен>.org.ua
 SMTP<< 250-mx98.mail.ru ready to serve
        250-SIZE 31457280
        250 8BITMIME
 SMTP>> MAIL FROM:<root@<мой реальный домен>.org.ua> SIZE=1398
 SMTP<< 250 OK
 SMTP>> RCPT TO:<<мой реальный ящик>@mail.ru>
 SMTP<< 550 Sorry, we do not accept mail from hosts with dynamic IP or generic DNS PTR-records. Please get a custom reverse DNS name from your ISP for your host <мой реальный айпи> or contact abuse@corp.mail.ru in case of error
 SMTP>> QUIT
LOG: MAIN
 ** <мой реальный ящик>@mail.ru R=dnslookup T=remote_smtp: SMTP error from remote mail server after RCPT TO:<<мой реальный ящик>@mail.ru>: host mxs.mail.ru [94.100.176.20]: 550 Sorry, we do not accept mail from hosts with dynamic IP or generic DNS PTR-records. Please get a custom reverse DNS name from your ISP for your host <мой реальный айпи> or contact abuse@corp.mail.ru in case of error
LOG: MAIN
 <= <> R=1Qgi5v-0000Mt-Ua U=mailnull P=local S=1485
delivering 1Qgi7p-0000NF-27
LOG: MAIN
 ** root@<мой реальный домен>.org.ua: Unknown user
LOG: MAIN
 Frozen (delivery error message)
LOG: MAIN
 Completed

k21, 2011-07-12 в 23:36:47

эксим переустановил обратно с опцией tls (получил лог ошибок который приведен выше)
впринципе меня устраивает работа без tls, но хотелось бы понять что не так сделал...

DNK, 2011-07-13 в 10:19:54


Попробуйте сделать точно так, как я описал в статье . Сделайте все с самого начала.Вы неправильно установили криптование, но где ошибка была при установке ,в ssl или exime, сразу определить сложно.
TLS нужен, прошу прощения за неверный ответ.
&#9474;[X] TLS                Link against OpenSSL
МТА это exim а не dovecot, то что вы добавили pop3s  в  dovecot, на отправку не повлияет :)
То что работает отправка без DNS - смотрите строку
host_lookup = !192.168.0.0/16 | *
заремьте и не будет отправки без MX записи.

насколько я понимаю:
-rw-r--r—   1 root  wheel   1570  8 июн 12:41 mailed.crt
-rw-r--r—   1 root  wheel   1679  8 июн 12:40 mailed.key
тут чтение секретного файла mailed.key для всех (это настораживает)


разрешение a+r нормально и настораживаюшего нет ничего.Сертификатом пользуется много служб, если запретить всем чтение (кроме рута) , службы не смогут работать.
Судя по вашему логу - все работает, отправка происходит, но не принимает mail.ru
Sorry, we do not accept mail from hosts with dynamic IP or generic DNS PTR-records. Please get a custom reverse DNS name from your ISP for your host <мой реальный айпи> or contact

k21, 2011-07-14 в 0:07:27

попробую сделать все сначала.
Можна ли модифицировать давнные конфиги эксима/давекота так чтобы изначально прием/отправка пробовало осуществляться по tls а если неполучилось то не шифрованым методом?...заранее спасибо

DNK, 2011-07-14 в 9:36:05

Отправка либо с TLS (изначально) , либо без.
Для тренировки можете переставить заново, но у вас сейчас рабочая система, судя по логу.
Скрипт очистки очереди, чтобы убрать ваши замороженные сообщения

#!/usr/bin/perl
my $ar = "";
if ($#ARGV == -1) {
   $ar="q";
}
$ar= shift(@ARGV);
open ( MQ, "/usr/local/sbin/exim -bp|") or die "can't run the exim command\n";
$count = 0;
$state = 0;     # simple state machine
$recips = 0;
while ( <MQ> ) {
 $line = $_;
 chop $line;
 if($line =~ /\<\>/) {
       if($line =~ /(.*) (.*) (.*) \<\>/) {
               $ident = $3;
               system("exim -Mrm ". $ident);
               $count++;
       }
 }
 if($line =~ /\|/) {
       if($line =~ /(.*) (.*) (.*) (.*)/) {
               $ident = $3;
               system("exim -Mrm ". $ident);
               $count++;
       }
 }
}
close(MQ);
print "Deleting count: ". $count."\n";
# end

k21, 2011-07-24 в 14:58:28

Подскажите что добавить или изменить в конфигах, чтобы почту можно было отправлять/принимать для определенной локальной сети и для заданого перечня айпишников(имен хостов) вне локальной сети, а для остальных (кто допустим знает пароль и имя почтового ящика) извне такой возможности небыло...спасибо

k21, 2011-07-24 в 16:22:05

Зарегестрировал на https://www.startssl.com/ сертификат на 1год для своего домена (можна заходить и по http и https), почта с сервера на сервер ходит нормально, но вот как модифицировать "белку" чтоб также по https заходить можна была для логина...спасибо

DNK, 2011-07-24 в 20:50:22

k21
1)на ваш первый вопрос : самое простое решение с помощью PF . Пропишите правила как вам нужно
типа такого :
......
table <mail> persist file "/etc/pf.mail"
.......
block in on $int_if from any to IP port 25
.....
pass in on $int_if from <mail> to IP port 25
и тд
2)вместо белки посмотрите , например, roundcube или еще какой-то интерфейс

ttys, 2011-08-14 в 4:42:10

2 k21
оО тебя, что на форуме забанили? "k21, 2011-07-12 в 23:33:40"

Valeriy Biliy, 2011-08-22 в 1:19:22

привет всем.
статья очень детальная, автору благодарность с занесением пивка в серверную :)
понадобилось создать на основе статьи мультидоменный почтовик, если кому-то сие тоже интересно, а детально разбираться еще нет опыта (как у меня) - по ссылке конфиги экзима и довекота, дамп базы (структура) и немного переделанная админка, предложенная автором.
Логика такая - ручками вбить названия доменов в базу, и потом при вводе юзеров выбирать домен из списка. При создании алиаса нужно указывать полный адрес алиаса и полный адрес ящика-получателя. Логином тоже является полный почтовый адрес (user@domain). Если белке не задавать домен по умолчанию - тоже работает, если вводить в кач-ве логина полный адрес.
Единственный момент - у меня почему-то не заработала выборка доменов при получении почти, пришлось указать имя домена напрямую (строку в конфиге экзима - domainlist local_domains = ${lookup pgsql{SELECT domain FROM local_domain}} - заменил на domainlist local_domains = maildomain1.com.ua : maildomain2.com.ua : maildomain.org. Пока разбираюсь, почему.

DNK, 2011-08-22 в 10:24:47

На самом деле цель статьи - как раз уйти от доменной идентификации.Возьмите любую статью про exim из постов выше - там будет доменная идентификация, что не очень удобно для небольших фирм , или наоборот , для почты провайдера.В одном из ответов выше , я указал как перейти к "мультипочтовому" серверу , и что нужно заменить в конфиге exim.

Valeriy Biliy, 2011-08-22 в 10:45:01

Цель реализована отлично - немного таких вот "копи-паст" статей, описывающих 100% работающие конфигурации. Как начинающему по части почтовых систем Ваша статья лично мне очень полезна тем, что представляет из себя комплексное решение, позволяющее построить работающую систему и потом изучать на  ее базе опции экзима и не только :)

ttys, 2011-10-01 в 14:19:47

>>(Замените testim.ua на ваш домен и директорию /d на  ашу в конфиге dovecot , а так же данные в БД exim Postgresql)
и ещё в insert.php
ато веб-морда юзеров создаёт в /d/.. =)

vitya, 2011-11-04 в 3:29:55

Уважаемый DNK! Спасибо за статью.
В комментариях Вы приводите пример как исправить авторизацию, чтобы было по имени@домену. Не понятно как это применить к авторизации CRAM. ((

Что в этом куске (ниже) нужно подправить, чтобы авторизация шла по имени@домену?

lookup_cram:
       driver = cram_md5
       public_name = CRAM-MD5
       server_secret = ${lookup pgsql {select password \
                     from accounts where login='$1'}{$value}fail}
       server_set_id = '$1'

DNK, 2011-11-04 в 10:50:31

В этом куске не нужно ничего подправлять .
Запись поля login у вас будет в виде user@domain
Login='$1' , '$1'='user@domain'
Cоответственно в аутглюке установить login в user@domain

KIper, 2011-11-08 в 17:10:19

Жаль не рассмотрена настройка SpamAssasin, она конечно простая, но я наверное минут 10 искал, где он конфиг хранит, а потом боролся с ошикой когда он не может bayes данные записать.

cat /usr/local/etc/mail/spamassasin/local.cf
...
rewrite_header Subject *****SPAM*****
report_safe 1
trusted_networks 192.168.250. 127/8
required_score 5.0
use_bayes 1
bayes_path /usr/local/etc/mail/spamassassin/bayes/
bayes_file_mode         0666
bayes_min_ham_num       1
bayes_min_spam_num      1
bayes_auto_learn 1
bayes_learn_to_journal          1

#   Some shortcircuiting, if the plugin is enabled
Дальше оставил как в конфиге
...

И надо было создать каталог:
drwxrw--—  2 spamd  wheel /usr/local/etc/mail/spamassassin/bayes

DNK, 2011-11-08 в 17:28:18

При установке ассасина по умолчанию, каталоги создавать не нужно, а как запускать обновления - я указал.

KIper, 2011-11-08 в 17:39:35

Если всё по умолчанию, то ошибка вот такая:
eval failed: bayes: (in learn) locker: safe_lock: cannot create tmp lockfile /nonexistent/.spamassassin/
по этому и пришлось искать конфиг

DNK, 2011-11-08 в 18:32:24

Вы выбрали в конфиге дополнительный пункт. Этого можно не делать

KIper, 2011-11-08 в 20:07:39

А есть ветка форума для обсуждения статьи?

DNK, 2011-11-09 в 11:53:24

На форуме есть ветки по exim.Отличие данной статьи от других в том, что здесь настройки для одного домена, добавлены антиспамовые примочки, и конфиги настроены для копи-паста. Открывать еще одну ветку на форуме не вижу смысла.

mix, 2011-11-13 в 22:55:48

Доброго времени суток! Не могли бы подсказать вот по такому вопросу. Почта на удалённые адреса уходит, по типу: mail.ru, gmail.com и т.д Но не принимается, в логе exim пишет следующее:
userside# mail -s testmail test@domain.ru < /etc/rc.conf
2011-11-13 22:51:40 1RPf9Y-000JsZ-4l <= root@domain.ru U=root P=local S=1808
2011-11-13 22:51:40 1RPf9Y-000JsZ-4l ** retest@domain.ru <test@domain.ru: Unknown user
2011-11-13 22:51:40 1RPf9Y-000Jsc-5w <= <> R=1RPf9Y-000JsZ-4l U=mailnull P=local S=2599
2011-11-13 22:51:40 1RPf9Y-000JsZ-4l Completed
Честно говоря уже не знаю куда копать. Ибо на другой машине всё работает нормально.

DNK, 2011-11-14 в 10:55:40

Проверьте наличие пользователей  test и retest
Вы просто забыли их завести

mix, 2011-11-14 в 11:08:19

В базе постгреса они имеются.

DNK, 2011-11-14 в 11:28:03

2011-11-13 22:51:40 1RPf9Y-000JsZ-4l ** retest@domain.ru <test@domain.ru: Unknown user
говорит о том что нет такого пользователя.
проверьте все-таки пользователей и др настройки в БД.
ваш домен прописан как domain.ru?
1)перезапустите сервер (можете рестартавать комп)
2)mail -s testmail retest@domain.ru < /etc/rc.conf

mix, 2011-11-14 в 12:17:33

Домён прописан как мой домён.ru Сервер ребутнул, в логе
2011-11-14 12:11:47 1RPrdr-0004TY-OC <= root@домён.ru U=root P=local S=1812
2011-11-14 12:11:47 1RPrdr-0004TY-OC ** retest@домён.ru: Unknown user
2011-11-14 12:11:47 1RPrdr-0004Tb-PL <= <> R=1RPrdr-0004TY-OC U=mailnull P=local S=2569
2011-11-14 12:11:47 1RPrdr-0004TY-OC Completed
при этом через вебморду нормально логинится.

DNK, 2011-11-14 в 12:47:37

Ошибка : exim не находит в БД юзера.
Удалите все записи юзеров и создайте заново.
Имя должно быть без пробелов в конце и начале и т.д.

Sergius, 2011-12-05 в 21:39:36

В определении ACL RCPT у Вас есть недопустимое условие:
demime = bat:btm:cmd:com:cpl:dll:exe:lnk:msi:pif:prf:reg:scr:vbs:url
Согласно п.41.6 официального хелпа demime может использоваться лишь в DATA и не-SMTP ACL.
Полагаю нужно перенести в следующий раздел и в DATA.

DNK, 2011-12-13 в 17:17:34

Данное условие необходимо для проверки вложений.Работает.Переносить не нужно

bmwden, 2012-02-11 в 16:59:38

Наша управляющаф мордочка, статейка понравилась, попробую на 9ке ;)

DNK, 2012-02-28 в 12:15:02

На 9-ке проблем не возникает :)

DNK, 2012-02-28 в 12:20:44

PS ошибку исправил, спасибо

MrSeasAdmin, 2012-07-13 в 14:39:29

# еще боримся со спамом и вирусами
 deny    message       = Мы не принимает ".$found_extension" \
                         незапакованные вложения \
                         Для отправки запакуйте их.
         demime = bat:btm:cmd:com:cpl:dll:exe:lnk:msi:pif:prf:reg:scr:vbs:url

Не сработает (Sergius прав), потому что надо этот блок запихивать в
acl_check_mime.  У меня если как по вашему конфигу, то просто пропускает письмо с экзешниками.
Убедился в этом из вики: http://wiki.exim.org/ExiscanFilenameBlocking

MrSeasAdmin, 2012-07-13 в 14:48:08

Еще одна незадачка.
В хелпе ($found_extension), у вас ".$found_extension". Однако, ни один вариант не пашет. В логах (и в возвратном письме) приходит

550-We don't accept () such extensions (123test.exe). Please, archive your 550 attachments! (in reply to end of DATA command)

Такое приходит на мою конфу:

deny message = We don't accept ($found_extension) \
                         such extensions ($mime_filename). \
                         Please, archive your attachments!
      condition = ${if match \
         {${lc:$mime_filename}} \
         {\N(\.exe|\.msi|\.cmd|\.pif|\.bat|\.dll|\.prf|\.reg|\.scr|\.lnk|\.com)$\N} \
         {1}{0}}

MrSeasAdmin, 2012-07-13 в 15:24:39

Кажется, я понял. Лисс подсказал в статье:))
http://www.lissyara.su/doc/exim/4.62/content_scanning_at_acl_time/

Надо собирать экзим с WITH_OLD_DEMIME,
$found_extension- Когда условие
demime истинно, эта переменная содержит найденное расширение файла.
А у меня он без этой опции, поэтому и не работает demime, соответственно $found_extension.
Ну я юзаю резак через acl_smtp_mime, не страшно.
Поправьте пжл в статье - работает с опцией сборки - WITH_OLD_DEMIME

DNK, 2012-11-23 в 12:37:44

опция OLD_DEMIME включена по умолчанию

Михаил, 2013-05-12 в 11:12:15

Есть домен который уже используется для почтовика, можно каким то образом сделать еще одни почтовый сервер, используя этот домен?

DNK, 2013-05-14 в 14:34:58

нет.
можно поднять второй сервер с другим именем и на него
алиасами (на имя сервера) отправлять почту с основного.

ttys, 2013-05-14 в 15:47:59

по моему он хочет мультидомен сделать
на одном хосте несколько доменов
если я правильно понял вопрос - то это можно делать.

Михаил, 2013-05-14 в 17:06:06

Есть домен который используется, я делаю еще один почтовый сервер, и хочу как то использовать этот же домен...DNK, про алиасы слышал, но как организовать, может есть какой то мануал, или статья?

Михаил, 2013-05-14 в 17:08:57

Еще забыл сказать, доступа к серваку на котором стоит почта и используется домен, я не имею...

mikis, 2013-05-14 в 18:11:52

Ребята, может есть у кого то уже отредактирован файл /usr/local/etc/exim/configure,  с этой конфигурацией что в статье, можете скинуть? Времени нету, а писать очень долго...Буду очень благодарен!

Михаил, 2013-05-24 в 13:00:27

Всем привет! Народ подскажите какой то мануал, или статью по поднятию почтового сервера с алиасами, есть домен, но он уже используется, как это правильно сделать?

DNK, 2013-05-24 в 13:58:21

Михаил
"Еще забыл сказать, доступа к серваку на котором стоит почта и используется домен, я не имею."
Не решите вашу проблему без доступа

Дмитрий, 2020-07-21 в 13:17:28

deny    message       = "Не нравится мне Ваш хост..."
         condition     = ${if match{$sender_host_name} \
                              {adsl|dialup|pool|peer|dhcp} \
                              {yes}{no}}

А чем вам не нравится домен glavpooltorg.su?



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0885 секунд
Из них PHP: 67%; SQL: 33%; Число SQL-запросов: 78 шт.
У Вас отключено GZIP-сжатие в браузере. Размер страницы 169519