Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> почтовые системы —> exim & courier-imap

Связка exim и courier-imap

Автор: lissyara.


    Собственно, это даже не новая статья - ничего особенно нового в ней нет, просто кое-какие конфиги удалось дополировать до ума, и вместо правки старой статьи я решил накатить новую - т.к. изменения достаточно весомые. Старую не удалил - она съехала в архив :)
   Итак, подымаем почтовик - связку exim & courier-imap. В качестве WEB-интерфейса прикручиваем postfixadmin (неважно от какого почтаря админка, важно уметь рихтануть конфиг под себя :)). Ну, там рюшечки - антивирус и прочее. Этот мануал пишется на FreeBSD 6.1; а готовилась связка на машину с FreeBSD4.11 (вернее там оно стояло, на конфигах архивной статьи, но, возникла необходимость в цивильной админке - и соответственно пришлось переносить юзеров и менять БД).
   Для начала набор стандартных действий - обновление портов, обновление системы. Ставим exim, предвариетльно отрихтовав файл /etc/make.conf
# директория с портами
PORTSDIR?=      /usr/ports
# EXIM
.if ${.CURDIR} == ${PORTSDIR}/mail/exim
WITH_MYSQL=             yes
LOG_FILE_PATH?=         syslog
WITH_CONTENT_SCAN=      yes
WITH_DEFAULT_CHARSET?=  koi8-r
WITHOUT_IPV6=           yes
WITH_BDB_VER?=          4
.endif

Если у Вас не стоит MySQL, то он его потащщит и поставит (не MySQL-сервер! А клиента. Сам сервер, если он нужен на этой машине, надо ставить самому. Если нужна определённая версия, лучше поставить вначале сервер, а уже затем ставить почтарь). На данный момент стабильная версия 4.1 - её и ставит по дефолту. Если необходимо поставить другую версию, и чтобы все приложения не пытались поставить стабильную (не все, а отдельные кривоватые) - надо добавить в файл /etc/make.conf такую строку:
# MySQL 3.23 - древней версии. Актуально, если памяти
# мало и наворотов не нужно - у меня на паре серверов так и стоит,
# на них кроме подсчёта трафика и БД пользователей почты и FTP
# ничего и не висит. Зато жрёт вдвое меньше памяти чем 4.0
# если будете ставить, то там есть свои приколы, впрочем у меня ушло
# лишних пять минут. Ничё особенного - но InnoDB лучше сразу вырубить
# примерно так:
# сборка MySQL с нужными параметрами
# .if ${.CURDIR} == ${PORTSDIR}/databases/mysql323-server
# BUILD_OPTIMIZED=yes
# BUILD_STATIC=yes
# WITHOUT_INNODB=yes
# .endif
# DEFAULT_MYSQL_VER=323
# MySQL 4.0 - старенький уже.
# DEFAULT_MYSQL_VER=40
# MySQL 4.1 - текущий
DEFAULT_MYSQL_VER=41
# MySQL 5.0 - пока нестабильный, но в принципе уже скоро
# DEFAULT_MYSQL_VER=50
# MySQL 5.1 - не стоит увлекаться :)
# DEFAULT_MYSQL_VER=51

Если на этой же машине будет жить сервер БД, то ставим вначале его:
/usr/home/lissyara/>cd /usr/ports/databases/mysql41-server/
/usr/ports/databases/mysql41-server/>make && make install && make clean

После установки, такие движения:
/usr/home/lissyara/>echo 'mysql_enable="YES"' >> /etc/rc.conf
/usr/home/lissyara/>/usr/local/etc/rc.d/mysql-server.sh start
Starting mysql.
/usr/home/lissyara/>ps -axj | grep mysql
mysql    67127     1 67125   464    0 S     p0    0:00.08 /bin/sh
mysql    67145 67127 67125   464    0 S     p0    0:02.42 /usr/lo
root     67147 55628 67146   464    2 S+    p0    0:00.02 grep my
/usr/home/lissyara/>sockstat | grep mysql
mysql    mysqld     67145 3  tcp4   *:3306                *:*
mysql    mysqld     67145 4  stream /tmp/mysql.sock
/usr/home/lissyara/>

После чего идём ставить exim:

/usr/home/lissyara/>cd /usr/ports/mail/exim
/usr/ports/mail/exim/>make && make install && make clean

Рихтуем конфиг - /usr/local/etc/exim/configure - примерно до такого состояния:
#!/bin/sh
# Файл конфигурации: /usr/local/etc/exim/configure

# моя конфига экзма. Будь проклят тот день,
# когда мне пришла в голову мысль подписать
# русские поясния ко всем пунктам! :) Хоть и
# делал я это в первую очередь для себя -
# чтоб лучше понять его, но работа эта оказалась
# слишком масштабная и неблагодарная...


# Имя хоста. Используется в EHLO.
# Фигурирует в других пунктах, если они не заданы -
# типа qualify_domain и прочих..
# Если тут ничё не установлено (строка закомметрована)
# то используется то, что вернёт функция uname()
primary_hostname = mx.lissyara.su

# Вводим данные для подключения к MySQL серверу.
# словечко `hide`, вначале, означает, что при
# вызове проверки конфига командой
# exim -bV config_file эти данные не будут отображаться.
# Если без него - то будут показаны... Формат записи:
# хост/имя_бд/пользователь/пароль
hide mysql_servers = localhost/exim/exim/exim



# Делаем список локальных доменов. Далее этот
# список будет фигурировать в виде +local_domains
# В данном случае домены выбираются из БД MySQL. Также
# можно их просто перечислить через двоеточие. Есть интересная
# возможность, можно указать юзер@[хост] - lissyara@[222.222.4.5]
domainlist local_domains = ${lookup mysql{SELECT `domain` \
                            FROM `domain` WHERE \
                            `domain`='${domain}' AND \
                            `active`='1'}}

# делаем список доменов с которых разрешены релеи.
# Далее этот список будет в виде +relay_to_domains
# Можно использовать символы подстановки, типа:
# .... = *.my.domen.su : !spam.my.domen.su : first.su
# тогда пропускается всё, что похоже на *.my.domen.su, но
# от spam.my.domen.su релеится почта не будет.
domainlist relay_to_domains = ${lookup mysql{SELECT `domain` \
                            FROM `domain` WHERE \
                            `domain`='${domain}' AND \
                            `active`='1'}}

# Составляем список хостов с которых разрешён неавторизованый
# релей. Обычно в нём находятся локальные сети, и локалхост...
# ЛокалХост в двух видах был внесён сознательно - пару раз
# сталкивался с кривым файлом /etc/hosts - результатом было
# непонимание `localhost` но пониманием 127.0.0.1/8
hostlist   relay_from_hosts = localhost:127.0.0.0/8:192.168.0.0/16

# Вводим названия acl`ов для проверки почты. (В общем-то, это
# необязательно, если вы делаете открытый релей, или хотите
# принимать вообще всю почту с любого хоста для любых
# получателей... Тока потом не жалуйтесь что у Вас спам
# и провайдер выкатывает немеряный счёт :))
acl_smtp_rcpt = acl_check_rcpt
acl_smtp_data = acl_check_data

# Прикручиваем антивирус - при условии, что exim собран
# с его поддержкой. В качестве антивиря юзаем ClamAV,
# ибо - ПО должно быть свободным! :)
# Итак, указываем местоположение сокета clamd.
av_scanner = clamd:/var/run/clamav/clamd

# Адрес куда слать на проверку спама (SpamAssasin), но я
# это не юзаю. Не так много у меня спама...
# spamd_address = 127.0.0.1 783

# Имя домена добавляемое для локальных отправителей (реальных
# юзеров системы) т.е. почта отправляемая от root, будет от
# root@домен_указанный_здесь. Если пункт незадан, то используется
# имя хоста из `primary_hostname`. Логичней было бы написать здесь
# lissyara.su, но мне удобней иначе:
qualify_domain = mx.lissyara.su

# Имя хоста для ситуации, обратной предыдущей, - это имя домена
# добавляемое к почте для системных юзеров, ну и вообще для почты
# пришедшей на адрес типа `root`, `lissyara`, & etc... Если этот
# пункт незадан то используется значение полученное из
# предыдущего пункта - `qualify_domain`
qualify_recipient = mx.lissyara.su

# А это как раз кусок вышеописанного анахронизма - про почту в
# виде user@[222.222.222.222] - принимать её или нет. По дефолту
# (когда строка закомментирована) значение - false. Если захотите
# поставить true то надо будет добавить в список доменов
# комбинацию @[] - она означает `все локальные адреса`
allow_domain_literals = false

# Пользователь от которого работает exim
exim_user = mailnull

# группа в кторой работает exim
exim_group = mail

# запрещаем работу доставки под юзером root - в целях безопасности
never_users = root

# Тоже анахронизм (на самом деле, не такой уж анахронизм, но все давно
# забили на ident и закрыли файрволлом tcp:113...) Это проверка - Ваш
# хост спрашивает у удалённого, с которого было подключение, а кто
# собстно ко мне подключился на такой-то порт? Если на удалённом хосте
# работает identd - он может ответить (а может и не ответить - как
# настроить), скажет UID пользователя от которого установлено
# соединение, тип ОС, и имя пользователя. Теперь, понимаете, почему
# у всех оно зарублено и файрволлами позакрыто? :) Это же палево :)
# Тока на мой взгляд, если на сервере всё настроено правильно -
# то вовсе это и не страшно.
# Короче - если хостс поставить * то будет проверять все. Таймаут -
# если поставить 0 то не будет ждать ответа ни от кого. По
# вышеописанным причинам - отключаем
#rfc1413_hosts = *
rfc1413_query_timeout = 0s

# Если сообщение было недоставлено, то генерится соощение
# об ошибке. Если сообщение об ошибке не удалось доставить
# то оно замораживается на указанный в этом пункте срок,
# после чего снова попытка доставить его. При очередной
# неудаче - сообщение удаляется.
ignore_bounce_errors_after = 45m

# Замороженные сообщения, находящиеся в очереди, дольше
# указанного времени удаляются и генерится сообщение
# об ошибке (при условии, что это не было недоставленное
# сообщение об ошибке :))
timeout_frozen_after = 15d

# собсно на этом штатный конфиг кончился, но
# меня-то это не устраивает... Поэтому пошли пункты,
# почёрпнутые из других источников.

# список адресов, через запятую, на которые засылаются
# сообщения о замороженных сообщениях (о замороженых
# уведомлениях о заморозке, сообщения не генерятся. - я
# надеюсь эта строка понятна :))
freeze_tell = admin@lissyara.su

# Список хостов, почта от которых принимается, несмотря
# на ошибки в HELO/EHLO
helo_accept_junk_hosts = 192.168.0.0/16

# Через какое время повторять попытку доставки
# замороженного сообщения
auto_thaw = 1h

# Приветствие сервера
smtp_banner = "$primary_hostname, ESMTP EXIM $version_number"

# Максимальное число одновременных подключений по
# SMTP. Рассчитывать надо исходя из нагрузки на сервер
smtp_accept_max = 50

# максимальное число сообщений принимаемое за одно соединение
# от удалённого сервера (или пользователя). C числом 25
# я имел проблемы тока один раз - когда у меня три дня лежал
# инет и после его подъёма попёрли мессаги. Но у меня не так
# много почты - всего 30 пользователей.
smtp_accept_max_per_connection = 25

# чё-то про логи и борьбу с флудом - я так понимаю -
# максимальное число сообщений записываемых в логи
smtp_connect_backlog = 30

# максимальное число коннектов с одного хоста
smtp_accept_max_per_host = 20

# Ход ладьёй - для увеличения производительности,
# директория `spool` внутри, разбивается на
# директории - это ускоряет обработку
split_spool_directory = true

# Если у сообщения много адресатов на удалённых хостах,
# то запускатеся до указанного числа максимально число
# параллельных процессов доставки
remote_max_parallel = 15

# при генерации сообщения об ошибке прикладывать
# не всё сообщение, а кусок (от начала) указанного
# размера (иногда полезно и целиком - в таком случае
# просто закомментируйте эту строку)
return_size_limit = 70k

# размер сообщения. У меня стоит относительно большой
# размер (`относительно` - потому, что на большинстве
# хостов оно ограничено 2-5-10мб, либо стоит анлим.)
message_size_limit = 24M

# разрешаем неположенные символы в HELO (столкнулся
# с этим случайно - имя фирмы состояло из двух слов
# и какой-то раздолбай домен обозвал my_firme_name
# прям с подчёркиваниями... Виндовые клиенты при
# соединении радостно рапортовали о себе
# `vasya.my_firme_name` ну а экзим их футболил :))
helo_allow_chars = _

# Принудительная синхронизация. Если отправитель
# торопится подавать команды, не дождавшись ответа,
# то он посылается далеко и надолго :) Немного,
# спам режется.
smtp_enforce_sync = true

# Выбираем, что мы будем логировать
# + - писать в логи,
# - - Не писать в логи.
# +all_parents - все входящие?
# +connection_reject - разорваные соединения
# +incoming_interface - интерфейс (реально - IP)
# +lost_incoming_connections - потеряные входящие
# соединения
# +received_sender - отправитель
# +received_recipients - получатель
# +smtp_confirmation - подтверждения SMTP?
# +smtp_syntax_error - ошибки синтаксиса SMTP
# +smtp_protocol_error - ошибки протокола SMTP
# -queue_run - работа очереди (замороженные мессаги)
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

# Убираем собственную временную метку exim`a из логов, её ставит
# сам syslogd - нефига дублировать
syslog_timestamp = no

# system filter
# А тут у начальства заскок - желание контролировать всё.
# Вот и пришлось сделать копию всей почты.
# Вот тока в IT отделе, как выяснилось, никто никому не пишет :)
system_filter = /usr/local/etc/exim/copy_mail.conf


begin acl

# Эти правила срабатывают для каждого получателя
acl_check_rcpt:

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

  # Запрещаем письма содержащие в локальной части
  # символы @; %; !; /; |. Учтите, если у вас было
  # `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 (2500 за месяц!)
  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 : \


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

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

  # Разрешаем почту от доменов в списке relay_from_hosts
  accept  hosts         = +relay_from_hosts

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


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

acl_check_data:

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

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

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



# чё делаем с почтой
begin routers

# Поиск маршрута к хосту в DNS. Если маршрут не найден в DNS -
# то это `унроутабле аддресс`. Не проверяются локальные
# домены, 0.0.0.0 и 127.0.0.0/8
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}'}}

mysqluser:
  driver = accept
  condition = ${if eq{}{${lookup mysql{SELECT `maildir` FROM `mailbox` \
              WHERE `username`='${quote_mysql:$local_part@$domain}'}}}{no}{yes}}
  transport = mysql_delivery

# начинаются транспорты - как доставляем почту
begin transports

# Доставка на удалённые хосты - по SMTP
remote_smtp:
    driver = smtp

mysql_delivery:
    driver = appendfile
    check_string = ""
    create_directory
    delivery_date_add
    directory = ${lookup mysql{SELECT CONCAT('/var/mail/exim/', `maildir`) \
                FROM `mailbox` WHERE `username`='${local_part}@${domain}'}}
    directory_mode = 770
    envelope_to_add
    group = mail
    maildir_format
    maildir_tag = ,S=$message_size
    message_prefix = ""
    message_suffix = ""
    mode = 0600

address_file:
    driver = appendfile
    delivery_date_add
    envelope_to_add
    return_path_add

# Имя программы
address_pipe:
  driver = pipe
  return_output

# Транспорт для автоответов
address_reply:
  driver = autoreply



# Начинаются повторы недоставленных писем.
begin retry

# Этот кусок я не трогал. Думаю разработчики лучше знают,
# какие тут должны быть цифирьки. Если же вы это знаете
# лучше их - меняйте. Хотя... А какого, если Вы такой
# умный, читаете этот мануал? Может ну, их, цифирьки, а? :)
# Address or Domain  Error   Retries
# -----------------  -----   -------
*                    *       F,2h,15m; G,16h,1h,1.5; F,4d,6h


# преобразование адресов. У меня такого нету.
begin rewrite


# Секция авторизации при отправке писем. Ввиду того,
# что почтовых клиентов много, и все всё делают
# по-своему, то и механизмов авторизации три...
begin authenticators

# А вот по какому методу авторизуется оутглюк - я уже и
# не помню... Хотя в своё время долго ковырялся,
# пока настроил... Толь plain, толь login...
auth_plain:
  driver = plaintext
  public_name = PLAIN
  server_condition = ${lookup mysql{SELECT `username` FROM \
                     `mailbox` WHERE `username` = \
                     '${quote_mysql:$1}' AND `password` = \
                     '${quote_mysql:$2}'}{yes}{no}}
  server_prompts = :
  server_set_id = $2

# Вроде по этому оутглюк, а по предыдущему нетскейп.
auth_login:
  driver = plaintext
  public_name = LOGIN
  server_condition = ${lookup mysql{SELECT `username` FROM \
                     `mailbox` WHERE `username` = \
                     '${quote_mysql:$1}' AND `password` = \
                     '${quote_mysql:$2}'}{yes}{no}}
  server_prompts = Username:: : Password::
  server_set_id = $1

# А так авторизуется "Летучая Мышь" - TheBat!
auth_cram_md5:
  driver = cram_md5
  public_name = CRAM-MD5
  server_secret = ${lookup mysql{SELECT `password` FROM \
                        `mailbox` WHERE `username` \
                        = '${quote_mysql:$1}'}{$value}fail}
  server_set_id = $1

# Фсё. Конфиг кончился. Два дня убил.
# © lissyara       2006-02-25, 01:19

Ну и скриптец ситемного фильтра, копирующий почу на заданный адрес, при соответствующем условии:
/usr/local/etc/exim/copy_mail.conf

#!/bin/sh
# Это вовсе не шелл-скрипт, просто в mcedit при такой первой строке
# включается подсветка синтаксиса, и работать на порядок удобней :)

# Проверяем, надо ли копировать почту, идущую этому пользователю,
# на начальственный адрес (единичка в поле `copy_mail` - копировать,
#  любое другое значение - нет)
if $recipients is "${lookup mysql{SELECT `address` FROM `alias` WHERE \
                   `address`='$recipients' AND `copy_mail`='1' LIMIT 1}}"
then
        # кому копируем (можно на локальный адрес, можно на
        # любой другой сервер инета)
        unseen deliver mail-copy-mailbox@lissyara.su
endif

# исходящая почта (тут свои косяки - если чел в настройках своего почтового
# клиента пропишет левый адрес - почта копироваться не будет. Как вариант -
# отключить приём писем от неавторизованных клиентов, и ловить по переменной
# $authenticated_sender - но тогда железки не смогут рапортоваться, если им
# нужно, наружу... Впрочем, у меня они на этот сервер пишут...)
if $sender_address is "${lookup mysql{SELECT `address` FROM `alias` WHERE \
                   `address`='$sender_address' AND `copy_mail`='1' LIMIT 1}}"
then
        # кому копируем (можно на локальный адрес, можно на
        # любой другой сервер инета)
        unseen deliver mail-copy-mailbox@lissyara.su
endif

После, запускаем его:
/usr/home/lissyara/>echo 'exim_enable="YES"' >> /etc/rc.conf
/usr/home/lissyara/>echo 'sendmail_enable="NONE"' >> /etc/rc.conf
/usr/home/lissyara/>/usr/local/etc/rc.d/exim.sh start
Starting exim.
/usr/home/lissyara/>ps -axj | grep exim
mailnull 40668     1 40668 40668    0 Ss    ??    0:00,02 /usr/local/sbin/exim -bd
root     41238 33870 41237 92267    2 R+    p1    0:00,00 grep exim
/usr/home/lissyara/>sockstat | grep exim
mailnull exim-4.62- 40668 3  tcp4   *:25                  *:*
/usr/home/lissyara/>

Также надо подправить файл /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

Теперь можно ставить postfixadmin. Конечно, по хорошему, его надо было поставить до запуска экзима. Но - работает и так :)
/usr/home/lissyara/>cd /usr/ports/mail/postfixadmin/
/usr/ports/mail/postfixadmin/>make && make install && make clean

Если не стоял апач и php, то они будут поставлены. На все вопросы отвечаем по дефолту, тока с php вначале думаем, и отмечаем крестиком пункт про модуль апача. Раньше оно было автоматом, а щас по дефолту этот крестик снят.
После установки (на самом деле тут один момент пропущен - я ставил phpMyAdmin - мне так проще :)) создаём БД и таблицы в ней, по прилагаемому дампу. Можно его скормить консольному mysql-клиенту, примерно такой командой:
mysql --user=root --password=XXXXXXX < dump.sql

А вот и сам дамп:
-- 
-- БД: `exim`
-- 
USE mysql;
INSERT INTO `user` (`Host`, `User`, `Password`)
VALUES ('localhost','exim',password('exim'));
INSERT INTO `db` (`Host`, `Db`, `User`, `Select_priv`)
VALUES ('localhost','exim','exim','Y');
FLUSH PRIVILEGES;
GRANT USAGE ON exim.* TO exim@localhost;
GRANT SELECT, INSERT, DELETE, UPDATE ON exim.* TO exim@localhost;
CREATE DATABASE `exim`;
USE `exim`;

-- --------------------------------------------------------

-- 
-- Структура таблицы `admin`
-- 

CREATE TABLE `admin` (
  `username` varchar(255) NOT NULL default '',
  `password` varchar(255) NOT NULL default '',
  `created` datetime NOT NULL default '0000-00-00 00:00:00',
  `modified` datetime NOT NULL default '0000-00-00 00:00:00',
  `active` tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (`username`),
  KEY `username` (`username`)
) TYPE=MyISAM COMMENT='Exim and courier-imap Admin - Virtual Admins';

-- --------------------------------------------------------

-- 
-- Структура таблицы `alias`
-- 

CREATE TABLE `alias` (
  `address` varchar(255) NOT NULL default '',
  `goto` text NOT NULL,
  `domain` varchar(255) NOT NULL default '',
  `created` datetime NOT NULL default '0000-00-00 00:00:00',
  `modified` datetime NOT NULL default '0000-00-00 00:00:00',
  `active` tinyint(1) NOT NULL default '1',
  `copy_mail` int(1) NOT NULL default '1',
  PRIMARY KEY  (`address`),
  KEY `address` (`address`)
) TYPE=MyISAM COMMENT='Exim and courier-imap Admin - Virtual Aliases';

-- --------------------------------------------------------

-- 
-- Структура таблицы `domain`
-- 

CREATE TABLE `domain` (
  `domain` varchar(255) NOT NULL default '',
  `description` varchar(255) NOT NULL default '',
  `aliases` int(10) NOT NULL default '0',
  `mailboxes` int(10) NOT NULL default '0',
  `maxquota` int(10) NOT NULL default '0',
  `transport` varchar(255) default NULL,
  `backupmx` tinyint(1) NOT NULL default '0',
  `created` datetime NOT NULL default '0000-00-00 00:00:00',
  `modified` datetime NOT NULL default '0000-00-00 00:00:00',
  `active` tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (`domain`),
  KEY `domain` (`domain`)
) TYPE=MyISAM COMMENT='Exim and courier-imap Admin - Virtual Domains';

-- --------------------------------------------------------

-- 
-- Структура таблицы `domain_admins`
-- 

CREATE TABLE `domain_admins` (
  `username` varchar(255) NOT NULL default '',
  `domain` varchar(255) NOT NULL default '',
  `created` datetime NOT NULL default '0000-00-00 00:00:00',
  `active` tinyint(1) NOT NULL default '1',
  KEY `username` (`username`)
) TYPE=MyISAM COMMENT='Exim and courier-imap Admin - Domain Admins';

-- --------------------------------------------------------

-- 
-- Структура таблицы `log`
-- 

CREATE TABLE `log` (
  `timestamp` datetime NOT NULL default '0000-00-00 00:00:00',
  `username` varchar(255) NOT NULL default '',
  `domain` varchar(255) NOT NULL default '',
  `action` varchar(255) NOT NULL default '',
  `data` varchar(255) NOT NULL default '',
  KEY `timestamp` (`timestamp`)
) TYPE=MyISAM COMMENT='Exim and courier-imap Admin - Log';

-- --------------------------------------------------------

-- 
-- Структура таблицы `mailbox`
-- 

CREATE TABLE `mailbox` (
  `username` varchar(255) NOT NULL default '',
  `password` varchar(255) NOT NULL default '',
  `name` varchar(255) NOT NULL default '',
  `maildir` varchar(255) NOT NULL default '',
  `quota` int(10) NOT NULL default '0',
  `domain` varchar(255) NOT NULL default '',
  `created` datetime NOT NULL default '0000-00-00 00:00:00',
  `modified` datetime NOT NULL default '0000-00-00 00:00:00',
  `active` tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (`username`),
  KEY `username` (`username`)
) TYPE=MyISAM COMMENT='Exim and courier-imap Admin - Virtual Mailboxes';

-- --------------------------------------------------------

-- 
-- Структура таблицы `vacation`
-- 

CREATE TABLE `vacation` (
  `email` varchar(255) NOT NULL default '',
  `subject` varchar(255) NOT NULL default '',
  `body` text NOT NULL,
  `cache` text NOT NULL,
  `domain` varchar(255) NOT NULL default '',
  `created` datetime NOT NULL default '0000-00-00 00:00:00',
  `active` tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (`email`),
  KEY `email` (`email`)
) TYPE=MyISAM COMMENT='Exim and courier-imap Admin - Virtual Vacation';

Если апач не стоял - добавляем строку в /etc/rc.conf и запускаем, также делаем симлинк на админку в директории /usr/local/www/data - или где у вас она будет:
/usr/home/lissyara/>echo 'apache_enable="YES"' >> /etc/rc.conf
/usr/home/lissyara/>/usr/local/etc/rc.d/apache.sh start
Starting apache.
/usr/home/lissyara/>ps -axj | grep httpd
root     67638     1 67638 67638    0 Ss    ??    0:00,38 /usr/local/sbin/httpd
www      67639 67638 67638 67638    0 S     ??    0:00,01 /usr/local/sbin/httpd
www      67640 67638 67638 67638    0 S     ??    0:00,01 /usr/local/sbin/httpd
www      67641 67638 67638 67638    0 S     ??    0:00,01 /usr/local/sbin/httpd
www      67642 67638 67638 67638    0 S     ??    0:00,01 /usr/local/sbin/httpd
www      67643 67638 67638 67638    0 S     ??    0:00,01 /usr/local/sbin/httpd
root     67645   534 67644   531    2 S+    p0    0:00,02 grep httpd
/home/lissyara/>ln -s /usr/local/www/postfixadmin  /usr/local/www/data/mail_admin
/home/lissyara/>ll /usr/local/www/data/ | grep admin
lrwxr-xr-x  1 root  wheel 27 6 июн 20:18 mail_admin -> /usr/local/www/postfixadmin
/usr/home/lissyara/>

По адресу http://IP_servera/mail_admin/admin/ можно поадминить. Но, перед этим неплохо бы рихтануть конфиг админки (/usr/local/www/postfixadmin/config.inc.php) - я менял две (три, но две про одно и тоже) опции. Обязательна одна - пароль должны храниться в БД в открытом виде - потому:
$CONF['encrypt'] = 'cleartext';

Также я поменял такие два пункта - с целью изменить структуру директорий, где храниться почта. Дефолтовый вариант меня не устраиват - всё валится в одну кучу...
$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'NO';

Также надо поменять домен в конфиге - он там много где встречается (явный косяк - можно было задать в одной переменной - а так в восьми местах менять), командой типа такой (можно прям так и писать - с экранированными переносами, либо в одну строку):
/usr/home/lissyara/>cd /usr/local/www/postfixadmin/
/usr/local/www/postfixadmin/>cat config.inc.php | \
? sed 's/change-this-to-your.domain.tld/lissyara.su/' > \
? tmp && mv tmp config.inc.php

После создания и заполнения БД можно пробовать отправить письмо, с консоли, командой mail - то, что в конфиге прописан сканер на вирусы, которого пока нет - не помеха, письма с локалхоста не проверяются на вирусы. Однако антивирь поставить надо. Что и делаем:
/usr/home/lissyara/>cd /usr/ports/security/clamav
/usr/ports/security/clamav/>make && make install && make clean

Лезет такой список опций, в котором нам ничего ненадо:
         Options for clamav 0.88.2_4

[ ] MILTER    Compile the milter interface
[ ] CURL      Support URL downloading
[ ] LIBUNRAR  Support for external Unrar library
[ ] STDERR    Print logs to stderr instead of stdout

После установки запускаем антивирь, и обновляем:
/usr/home/lissyara/>echo 'clamav_clamd_enable="YES"' >> /etc/rc.conf
/usr/home/lissyara/>/usr/home/lissyara/clam
clamav-clamd*      clamav-freshclam*
/usr/home/lissyara/>/usr/home/lissyara/clamav-clamd start
Starting clamav_clamd.
LibClamAV Warning: **************************************************
LibClamAV Warning: ***  The virus database is older than 7 days.  ***
LibClamAV Warning: ***        Please update it IMMEDIATELY!       ***
LibClamAV Warning: **************************************************
/usr/home/lissyara/>freshclam
ClamAV update process started at Wed Jun  7 19:52:54 2006
main.cvd is up to date (version: 38, sigs: 51206, f-level: 7, builder: tkojm)
Downloading daily.cvd [-]
Downloading daily.cvd [|]
Downloading daily.cvd [/]
Downloading daily.cvd [\]
Downloading daily.cvd [*]
daily.cvd updated (version: 1518, sigs: 7853, f-level: 8, builder: ccordes)
Database updated (59059 signatures) from database.clamav.net (IP: 213.219.245.4)
Clamd successfully notified about the update.
/usr/home/lissyara/>

Всё. Сервер SMTP работает. Письма принимаются, и отправляются наружу (если вы заполнили БД, разумеется). Теперь надо поставить того, кто раздаст её клиентам - courier-imap.
/usr/home/lissyara/>cd /usr/ports/mail/courier-imap
/usr/ports/mail/courier-imap/>make && make install && make clean

Лезет окошко с опциями, выбираем такие (из обязательного - MySQL, остальное по желанию):

        Options for courier-imap 4.1.1,1

[X] OPENSSL      Build with OpenSSL support
[ ] FAM          Build in fam support for IDLE command
[X] TRASHQUOTA   Include deleted mails in the quota
[ ] GDBM         Use gdbm db instead of system bdb
[ ] IPV6         Build with IPv6 support
[ ] AUTH_LDAP    LDAP support
[X] AUTH_MYSQL   MySQL support
[ ] AUTH_PGSQL   PostgreSQL support
[ ] AUTH_USERDB  Userdb support
[ ] AUTH_VCHKPW  Vpopmail/vchkpw support

После сборки рихтуем конфиг программы авторизеации:
/usr/local/etc/authlib/authmysqlrc
# хост на котором находится сервер БД
MYSQL_SERVER            localhost
# Имя пользователя для соединения с БД
MYSQL_USERNAME          exim
# Пароль для соединения с БД
MYSQL_PASSWORD          exim
# Порт на котором работает MySQL (при сетевом соединении)
MYSQL_PORT              3306
# Имя базы данных
MYSQL_DATABASE          exim
# Таблица из которой будем делать выборки
MYSQL_USER_TABLE        `mailbox`
# поле где храниться пароль в открытом виде
MYSQL_CLEAR_PWFIELD     `password`
# поле где храниться UID (в данном случае од один для всех,
# потому указываем прямо тут, MySQL не дура, поймёт, что
# что не имя поля, а данные которые надо обратно же и вернуть :))
MYSQL_UID_FIELD         26
# тоже самое что и пердыдущий пункт, только про группу
MYSQL_GID_FIELD         26
# Имя (логин) пользователя - имя колонки
MYSQL_LOGIN_FIELD       `username`
# Имя колонки с полням имененм пользователя (Вася Пряников)
MYSQL_NAME_FIELD        `name`
# Директория где храниться почта пользователя
MYSQL_MAILDIR_FIELD     CONCAT('/var/mail/exim/', `maildir`)
# Домашняя директория пользователя
MYSQL_HOME_FIELD        CONCAT('/var/mail/exim/', `maildir`)
# Дефолтовый домен (подставялется [а может и нет - не пробовал :)]
# при попытке использовать только имя, без домена)
DEFAULT_DOMAIN          lissyara.su

Также, по необходимости, рихтуем имаповский конфиг (Одна из причин, из-за которой я и начал переписывать статью - начала работать функция про папочку с удалёнными сообщениями. Т.е. если раньше этим должен был заниматься почтовый клиент пользователя, то теперь сервер это может делать сам). Я тронул только эти три пункта, оставив остальные без изменений:
# Так выглядит слово "Удалённые" :))
IMAP_TRASHFOLDERNAME="&BCMENAQwBDsEUQQ9BD0ESwQ1-"
IMAP_EMPTYTRASH=Trash:7
IMAP_MOVE_EXPUNGE_TO_TRASH=1

Можно запускать и пробовать:
/usr/home/lissyara/>echo 'courier_authdaemond_enable="YES"' >> /etc/rc.conf
/usr/home/lissyara/>/usr/local/etc/rc.d/courier-authdaemond start
Starting courier_authdaemond.
/usr/home/lissyara/>
/usr/home/lissyara/>sockstat | grep authd
root     authdaemon 645   5  stream /var/run/authdaemond/socket.tmp
root     authdaemon 644   5  stream /var/run/authdaemond/socket.tmp
root     authdaemon 643   5  stream /var/run/authdaemond/socket.tmp
root     authdaemon 642   5  stream /var/run/authdaemond/socket.tmp
root     authdaemon 641   5  stream /var/run/authdaemond/socket.tmp
root     authdaemon 614   5  stream /var/run/authdaemond/socket.tmp
/usr/home/lissyara/>
/usr/home/lissyara/>echo 'courier_imap_imapd_enable="YES"' >> /etc/rc.conf
/usr/home/lissyara/>/usr/local/etc/rc.d/courier-imap-imapd.sh start
Starting courier_imap_imapd.
/usr/home/lissyara/>sockstat | grep couri
root     couriertcp 630   3  tcp4   *:143                 *:*
root     courierlog 629   4  dgram  -> /var/run/logpriv
root     courierlog 613   4  dgram  -> /var/run/logpriv
/usr/home/lissyara/>
/usr/home/lissyara/>echo 'courier_imap_pop3d_enable="YES"' >> /etc/rc.conf
/usr/home/lissyara/>/usr/local/etc/rc.d/courier-imap-pop3d.sh start
Starting courier_imap_pop3d.
/usr/home/lissyara/>sockstat | grep cour
root     couriertcp 1533  3  tcp4   *:110                 *:*
root     courierlog 1532  4  dgram  -> /var/run/logpriv
root     couriertcp 630   3  tcp4   *:143                 *:*
root     courierlog 629   4  dgram  -> /var/run/logpriv
root     courierlog 613   4  dgram  -> /var/run/logpriv
/usr/home/lissyara/>

Ну и пробуем всё это. Вначале отправляем письмо с консоли, и смотрим, создаются ли директории:
/usr/home/lissyara/>ll /var/mail/exim/
total 0
/usr/home/lissyara/>mail -s test test@lissyara.su < /etc/rc.conf
/usr/home/lissyara/>ll /var/mail/exim/lissyara.su/
total 4
drwxrwx---  5 mailnull  mail  512  7 июн 22:38 mail-copy-mailbox
drwxrwx---  5 mailnull  mail  512  7 июн 22:38 test
/usr/home/lissyara/>

Также смотрим логи:
/usr/home/lissyara/>tail -f /var/log/maillog
Jun 7 22:38:34 bsd-6 exim[85540]: 2006-06-07 22:38:34 1Fo2vK-000MFg-Ts <= root@mx.lissyara.su U=root P=local S=1115 from <root@mx.lissyara.su> for test@lissyara.su
Jun 7 22:38:35 bsd-6 exim[85541]: 2006-06-07 22:38:35 1Fo2vK-000MFg-Ts => mail-copy-mailbox (mail-copy-mailbox@lissyara.su) <system-filter> R=mysqluser T=mysql_delivery
Jun 7 22:38:35 bsd-6 exim[85541]: 2006-06-07 22:38:35 1Fo2vK-000MFg-Ts => test <test@lissyara.su> R=mysqluser T=mysql_delivery
Jun 7 22:38:35 bsd-6 exim[85541]: 2006-06-07 22:38:35 1Fo2vK-000MFg-Ts Completed

Всё пашет, отправляется, принимается. Пробуем наружу:
Jun 7 23:00:07 bsd-6 exim[85880]: 2006-06-07 23:00:07 1Fo3GB-000MLA-65 <= root@mx.lissyara.su U=root P=local S=1117 from <root@mx.lissyara.su> for lissyara@narod.ru
Jun 7 23:00:07 bsd-6 exim[85881]: 2006-06-07 23:00:07 1Fo3GB-000MLA-65 => mail-copy-mailbox (mail-copy-mailbox@lissyara.su) <system-filter> R=mysqluser T=mysql_delivery
Jun 7 23:00:07 bsd-6 exim[85881]: 2006-06-07 23:00:07 1Fo3GB-000MLA-65 => lissyara@narod.ru R=dnslookup T=remote_smtp H=mx1.yandex.ru [213.180.223.88] C="250 2.0.0 accepted; S905695AbWFGVDo"
Jun 7 23:00:07 bsd-6 exim[85881]: 2006-06-07 23:00:07 1Fo3GB-000MLA-65 Completed

Тоже ушло. Всё. пользуйтесь :)


P.S.`ы :)
1. При косяках с кодировкой и меню в postfixamin правим кодировку в файле templates/header.tpl на windows-1251 и влепить в меню 4 штуки <br>-ов чтоб не наезжало друг а друга в файле templates/admin_menu.tpl.
2. Не забудте запаролить админку, при помощи .htaccess или ещё как угодно.
3. По дефолту копируется почта со всех ящиков, можно сменить, но не через postfixadmin, а руками в БД. Впрочем - это не самая частая операция.



размещено: 2006-06-08,
последнее обновление: 2007-03-28,
автор: lissyara


zep, 2006-07-25 в 2:37:29

smtp_enforce_sync = true
При отправлении с админки postfixadmin режется сообщение, в логах: SMTP protocol synchronization error (input sent without waiting for greeting): rejected connection from H=localhost.registr.amur.ru [127.0.0.1] I=[127.0.0.1]:25 input="EHLO localhost\r\n".
Ставишь false — проходит.

aikz, 2006-07-25 в 12:47:51

Кодировку можно также поменять в конфиге config.inc.php
добавив $PALANG['charset'] = 'windows-1251';

mikola, 2006-09-06 в 13:19:41

За русские пояснения опций огромное спасибо

ita, 2006-09-26 в 15:40:18

>2. Не забудте запаролить админку, при помощи .htaccess или ещё как угодно.
если удалить в postfixadmin setup.php, предварительно создав там же администратора, то доступ в админку возможен только с паролем, .htaccess не нужен.

tormozok@inbox.ru, 2006-10-23 в 19:52:35

Еще мне кажется надо поменять имя таблицы в config.inc.php
с postfixadmin  на exim

s@sh@, 2006-11-18 в 20:34:32

А можно в дамб sql добавить примеры INSERT'ов для каждой таблицы чтоб понятней было, а то подом ищи в каком формате какое поле в какую таблице не так добавил. Жалко людей на форуме попусту волновать. И еще пояснить бы, где используются таблицы domain_admins, admin, log :) и vacation.

lissyara, 2006-11-18 в 21:07:06

В таблицы руками лазить не надо.
Для этого админка есть.

root, 2006-12-07 в 19:38:17

Делал всё как в статье...
---
/usr/home/lissyara/>mail -s test test@lissyara.su < /etc/rc.conf
/usr/home/lissyara/>ll /var/mail/exim/lissyara.su/
---
но вот тут у меня не создаются директории и соответственно я не могу залогинится в почтовый ящик, т.к. вылазит ошибка, что такая папка не существует. в чем может быть проблема? владелец папки /var/mail/exim вроде mailnull:mail.. не пойму.

root, 2006-12-07 в 23:53:01

Разобрался. Ошибку в одном месте допустил. Последние два коммента можно удалить :)

cray, 2006-12-09 в 22:26:00

Да, актуальная весчь...
Вот бы ещё квоты на Exim повесить, а не на Courier...
Кто ни буть знает, как квоты прикрутить через бвзу MySQL, на Exim?

pavel, 2006-12-09 в 23:39:57

а в каком месте ошибку допустил? А то у меня то же самое...

pavel, 2006-12-10 в 18:20:40

Так. С ошибкой тоже разобрался :-)
Теперь другое: как сделать, чтобы аутентификация пользователя в courier-imap проходила по имени. У меня просто несколько почтовых доменов. С defaultdomain аутентифицируется по имени только в нём.

Александр, 2006-12-19 в 19:34:32

Простите, а у вас что Courier-IMAP работет, тут же не рабочий конфик, о особенности обращения к базе, должна быть строка "MYSQL_SELECT_CLAUSE" в файле authmysqlrc. Я уже "крутил" это конфиг как хочешь, результата ни какого, даже скопировал ваш конфиг, всё равно не работеат.

Ошибка такого характера:
ns# telnet 127.0.0.1 110
Trying 127.0.0.1...
Connected to localhost.dom.loc.
Escape character is '^]'.
+OK Hello there.
USER user
+OK Password required.
PASS 111111
-ERR Temporary problem, please try again later
Connection closed by foreign host.

Все демоны при этом стартуют нормально.

Александр, 2006-12-19 в 19:36:21

Да, а в логах пишет такое:
-----
Dec 19 20:30:13 ns pop3d: Connection, ip=[127.0.0.1]
Dec 19 20:30:27 ns pop3d: LOGIN FAILED, user=cray, ip=[127.0.0.1]
Dec 19 20:30:27 ns pop3d: authentication error: Input/output error

Так что конфиг заранее не рабочий.

Showjumper, 2006-12-20 в 5:08:02

2 Александр
у вас в конфиге authmysqlrc неверно указан путь к Maildir.
там 2 ключевых параметра: MYSQL_MAILDIR_FIELD и MYSQL_HOME_FIELD. Их и крутите. У меня в MYSQL_HOME_FIELD указан локальный путь до папки Maildir НЕ ВКЛЮЧАЯ.

lissyara, 2006-12-20 в 10:48:12

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

Showjumper, 2006-12-20 в 19:10:29

2 lissyara
Жостко ты его )) хотя у меня тож сегодня день ху*вый и настроение кого-то послать....

K2el, 2007-01-28 в 11:59:19

Название статьи бы поменять <b>Связка exim и courier-map</b>

lissyara, 2007-01-28 в 16:39:37

Сделано. Списибо! :))

Алексей, 2007-02-10 в 0:51:17

про задержку приёма, из конфига:

 # более сложный вариант, смотрите в статье по exim и
 # курьер имап. Т.к. там метод боле умный (просто правил
 # больше :), то можно и на более загруженные сервера ставить)

Кхм... честно говоря не вижу чтобы в этом конфиге этот код отличался от конфигов остальных статей на вашем сейте. ;) А есть ещё варианты более умные? :)

shmyga, 2007-02-16 в 13:27:06

Делал всё как в статье...
---
/usr/home/lissyara/>mail -s test test@lissyara.su < /etc/rc.conf
/usr/home/lissyara/>ll /var/mail/exim/lissyara.su/
---
но вот тут у меня не создаются директории и соответственно я не могу залогинится в почтовый ящик, т.к. вылазит ошибка, что такая папка не существует. в чем может быть проблема? владелец папки /var/mail/exim вроде mailnull:mail.. не пойму.

Подскажите кто нашел, в чем ошибка?

lissyara, 2007-02-16 в 14:03:19

в форум.
а первый же вопрос там будет - в логах что

Zedik, 2007-02-23 в 10:21:39

при установке clamav:
echo 'clamav_freshclam_enable="YES"' >> /etc/rc.conf

ant, 2007-03-05 в 5:31:03

Ни с Lissyara, ни c aikz не согласен по поводу кодировки.
Проблему с кодировкой следует исправить следующим путём:
В файле "languages/ru.lang" добавить строчку:
$PALANG['charset'] = 'WIN-1251';

:-) Изивините за скурпулёзность, но это чтобы не бурить начальную идею.

lissyara, 2007-03-05 в 8:52:13

Согласен. Этот метод уже подсказывали.
Просто на тот момент надо было сделать, а уж как - мало волновало :)))

cygnus, 2007-03-15 в 13:56:42

странная штука, на одном сервере настроил всё отлично работает, на втором повторил 1в1 и не пишутся логи. все работает, всё нормально, но логи в /var/log/exim не пишутся, даже файлы логов не создаются....

RexaleX, 2007-05-27 в 2:10:55

authentication error: Input/output error

Решение здесь:
http://www.dech.co.uk/2006/02/mysql-trouble-fix-unknown-column-in-field-list/

rwd0, 2007-08-29 в 22:04:41

как вариант копирование всей проходящей почты - в system-filter:

if first_delivery
  then
  deliver "yourmail@yourdomain.com"
endif

skoval, 2007-09-02 в 2:13:08

Опция smtp_connect_backlog задает максимальное кол-во подключений которые ожидают внимания exim'а. По идее это контролируется ОС. Если ожидающих подключений больше этого кол-ва, все новые будут просто отвергаться (типа connection refused by host без объяснения причин). Если подключившийся будет долго ждать, он скорее всего разорвет соединение по таймауту.

Aleksandr, 2007-11-14 в 17:10:59

Ставлю mysql , заношу дамп в базу , поправляю конфиг exim-а,потом ставлю apache13 и postfixadmin , поправляю конфиг config.inc.php как сказано выше, но приконектиться не могу к серверу пишет что невозможно найти страницу, я в postfixadmin-е не силен , возможно не знаю чего то что не указано в статье ?

DukeArtem, 2007-12-15 в 11:55:03

" authdaemond: authmysql: MYSQL_CRYPT_PWFIELD and MYSQL_CLEAR_PWFIELD not set in /usr/local/etc/authlib/authmysqlrc " -
Если у кого-нибудь, будет такая проблема, просто зайдите в файл authmysqlrc найдите строчку MYSQL_CRYPT_PWFIELD(или MYSQL_CLEAR_PWFIELD) и уберите все пробелы с лева, это хрень съела мне много нервов!

proximo, 2007-12-15 в 18:26:43

Такая же ошибка : authentication error: Input/output error
Заработало только после того, как убрал кавычки
в следующих строках:
MYSQL_USER_TABLE        mailbox
MYSQL_CLEAR_PWFIELD     password
MYSQL_LOGIN_FIELD       username
MYSQL_NAME_FIELD        name

burder, 2007-12-24 в 16:39:47

Debian linux
для тех кто ставит на эту систему!
1  при установке Exim4 создаётся пользователь Debian-exim поэтому в конфиге экзима ставьте exim_user=Debian-exim
2 в конфиге авторизаций mysql у курьера UID будут не такие как в статье(Debian как ни как)

no_fate, 2008-01-08 в 2:58:30

После обновления курьера из портов такая ошибка (из лога MS Outlook)
....
IMAP: 02:54:10 [rx] * BYE [ALERT] Fatal error: Account's mailbox directory is not owned by the correct uid or gid: No such file or directory
....

:(

zevs5, 2008-01-13 в 20:54:38

Огромное спасибо автору статьи и вообще всех статей на этом сайте, всё доступно, понятно. А всем кто пользуется этими записями советую прежде чем задавать вопрос очень внимательно ещё раз прочитать статью и скурпулезно изучить все абсолютно логи своей системы, сами сможете найти свой косяк быстрее чем ждать ответа от кого либо.

R.S. По этим статьям за последние 2 месяца поднял 5 серверов с FreeBSD-6.0

tormozok, 2008-01-24 в 22:45:57

Сделал все по статье.
Заработало сразу.
Прикрутил ко все этому WEB интерфейс,SquirrelMail.
Русский.Работает на ура.

Спасибо за сайт

Black_Angel, 2008-02-14 в 15:57:54

1. очень нехватает пунктика с авторизацией POP before SMTP
2. может я чего то не понял... админку просто не использую про причине нелюбви к PHP.. , но по моему с таблицей mailbox c полем username путаница. С одной стороны для проверки отправителя поле должно содержать локальную_часть@домен , с другой для авторизации только локальную часть. Получается или глупое дублирование или неприятная описка
3. всё равно спасибо огромное :)

voldimar, 2008-02-14 в 17:22:11

2 Black_Angel
По поводу 2-го пункта.
У меня обслуживается одним сервером более одного домена. Поэтому авторизация происходит по полному имени. Иначе как отличать user@domain1 от user@domain2

elpa_aka_boroda, 2008-02-17 в 18:50:56

openSuse 10.3 -все заработало с минимальным напильником.
тем кто ставит на эту систему на Suse
- не получилось с мysql-max там чтото не то с mysqli.
заменил на обычный mysql-5.0.51

Огромное спасибо автору.

b52, 2008-02-19 в 19:49:13

2 DukeArtem

Огромное спасибо за "Если у кого-нибудь, будет такая проблема, просто зайдите в файл authmysqlrc найдите строчку MYSQL_CRYPT_PWFIELD(или MYSQL_CLEAR_PWFIELD) и уберите все пробелы слева".

Сразу помогло!

Black_Angel, 2008-02-19 в 20:12:26

2 voldimar
читаем внимательно. дублирование возникает из за того, что доменная часть хранится как в username так и в поле domain. Ну не нравитяс мне, такое дублирование + в заблуждение вводит.

elpa_aka_boroda, 2008-02-20 в 0:23:52

пара замечаний по конфигу exim:
opm.blitzed.org  как dnsbl давно уже не живет
и проверка на IP в helo|ehlo неработает  
я заменил reg на {\N^(\d+\.){3}\d+$\N}

Seltsam, 2008-03-25 в 11:24:18

Из своего опыта могу сказать по поводу использования courier-imap скажу одно - при первой попытке получить почту с ящика будет маил-клиент будет выдавать ошибку, даже если авторизация в норме.
И естественно в логах будет упоминаться про No such file or directory - отправьте просто письмо на этот проблемный аккаунт, почтовик создаст каталог почты для этого аккаунта и подобных ошибок при получении уже не будет. =)

andrey, 2008-04-04 в 3:55:35

Таже фигня((
Через pop3 все работает нормально, а через imap не проходит авторизация (( Запарился уже искать в чем трабл...
все делал по http://www.lissyara.su/?id=1175

вот что в логах:
Apr  4 02:40:24 mundo authdaemond: received auth request, service=imap, authtype=login
Apr  4 02:40:24 mundo authdaemond: authmysql: trying this module
Apr  4 02:40:24 mundo authdaemond: SQL query: SELECT `username`, "", `password`, 26, 26, CONCAT('/var/mail/exim/', `maildir`), CONCAT('/var/mail/exi
Apr  4 02:40:24 mundo authdaemond: authmysql: sysusername=<null>, sysuserid=26, sysgroupid=26, homedir=/var/mail/exim/domen.net.ua/andrey/,
Apr  4 02:40:24 mundo authdaemond: authmysql: clearpasswd=qweqwe, passwd=<null>
Apr  4 02:40:24 mundo authdaemond: Authenticated: sysusername=<null>, sysuserid=26, sysgroupid=26, homedir=/var/mail/exim/domen.net.ua/andrey/, addr
Apr  4 02:40:24 mundo authdaemond: Authenticated: clearpasswd=qweqwe, passwd=<null>

смущает "passwd=<null>"

вот что стоит:
courier-authlib-base-0.60.2 Courier authentication library base
courier-authlib-mysql-0.60.2 MySQL support for the Courier authentication library
courier-imap-4.3.1,2 IMAP (and POP3) server that provides access to Maildir mail

majestic, 2008-04-04 в 20:38:02

хочется добавить фильтр типа: если нет русских символов в тексте письма, то отлуп. примерно представляю, что это делается в секции acl_data, но вот какое конкретно правило прописать хз..

sergey, 2008-04-05 в 20:49:17

Во-первых, огромное спасибо за статью! Очень много экономит врмени во время первых шагов!
Во-вторых, если вот такая ошибка: Fatal error: Account's mailbox directory is not owned by the correct uid or gid: No such file or directory, то она исчезает если поменять IMAP_MAILBOX_SANITY_CHECK=1 на IMAP_MAILBOX_SANITY_CHECK=0 в конфгурационном файле imapd

Сергей, 2008-07-04 в 17:06:10

Отличная статья!!!
По ней я все сделал просто отлично. пару косяков но опыт есть в решении.Спасибо.
Хотел так же предложить идею прикручивания mailgraph (статистика) к тому что собсна Теперь Мы сотворили. Я уже занялся решением этого вопроса могу попробывать написать мануальчик :)
Или если что то подобное уже есть на сайте Тыкните меня в Это.

freeman_tnu, 2008-07-27 в 21:47:38

У кого стоит версия courier-imap-4.3.1,2 и выше, для того чтобы имап нормально авторизировал, на мейлдир нужно ставить юзера и групу mailnull (а не как раньше mailnull:mail). Внимательно проверяем uid и guid под номером 26.

karakurty, 2008-08-11 в 17:09:07

  accept  hosts         = +relay_from_hosts
###          control       = submission

 accept  authenticated = *
###          control       = submission


Пришлось сделать вот так, чтобы при отсылке письма такие почтари как мейл.ру не футболили из-за поля From:
"login@domain.com"@mx.domain.com
На котором они пытаясь прорезолвить обламывались и отбрасывали письмо..

Возможно есть вариант получше?

P.S. exim-4.69 c конфигом по этой статье..

Michael /780, 2008-11-02 в 11:37:49

 Кстати, если к этому exim и courier-imap прикрутить Roundcube насколько нужно мощное железо и сколько оперативы, если учесть что ходить за почтой будет порядка 100юзеров? Одноголовый PIII-450/256 SDRam /4*40gb SCSI RAID сгодится (древний compaq) Или нужно что-то посерьезнее? С учетом что почтой будут ещё бегать прикрепленные файлы 6-7мегобайт максимум...

E-Wind, 2008-11-07 в 16:42:58

# Прикручиваем антивирус - при условии, что exim собран
# с его поддержкой. В качестве антивиря юзаем ClamAV,
# ибо - ПО должно быть свободным! :)
# Итак, указываем местоположение сокета clamd.

av_scanner = clamd:/var/run/clamav/clamd.sock

Не хватает .sock, у меня не отправлял почту иначк, говорил local problem (freebsd 7.1 pre, TheBat)

Merzot, 2008-11-19 в 17:11:45

Спасибо автору за статью!

1) У кого не авторизуется по IMAP - в /usr/local/etc/authlib/authmysqlrc MYSQL_GID_FIELD вместо 26 ставьте 6

2) У меня не встал postfixadmin 2.2.1.1 из портов, ругался при выполнении setup.php на невозможность апгрейдов своих таблиц. Пришлось руками создавать таблицу vacation_notification и обязательно давать права ALTER на нее MySQL-юзеру exim.

cj_nik, 2009-01-13 в 17:59:06

Спасибо друг! Долго я парился.
Не нашёл "красивый способ?"
>>>
karakurty, 2008-08-11 в 17:09:07

 accept  hosts         = +relay_from_hosts
###          control       = submission

accept  authenticated = *
###          control       = submission


Пришлось сделать вот так, чтобы при отсылке письма такие почтари как мейл.ру не футболили из-за поля From:
"login@domain.com"@mx.domain.com
На котором они пытаясь прорезолвить обламывались и отбрасывали письмо..
<<<

KoRESH, 2009-01-29 в 23:44:12

Фришка 7.1Release, дерево портов обновленное.
Свежеустановленный exim отказывается запускаться без libmysqlclient.so.14, courier-imap - не делает мускул-аутентификацию без libmysqlclient.so.16. Первое содержится к примеру в мускуле 41, второе - в 51. Решил так - скопировал libmysqlclient.so.16 из /usr/local/lib/mysql, снес 51, поставил 41, положил libmysqlclient.so.16 обратно рядом с libmysqlclient.so.14. Завелось.

Laa, 2009-02-26 в 11:21:31

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

mephist, 2009-03-02 в 5:24:36

dynablock.njabl.org следует заменить, например на dnsbl.njabl.org, или убрать.

"Do not use. This subzone has been shut down!"

mephist, 2009-03-02 в 7:08:21

пользователю exim@localhost необходимы права еще как минимум на CREATE. при первом запуске postfixadmin ругался об отсутствие прав на создание таблицы config

RoST, 2009-03-05 в 12:30:54

Люди может кто то поможет куда копать, как сделать чтоб нормально обрабатывались адреса вот такого типа nepcoint'l@nepco.com.jo то есть в них есть одна кавычка ' . Я так понял mysql воспринимает это как свою команду и лезут ошибки. Направьте в нужное русло :-)

jafff, 2009-05-19 в 9:46:43

Хочу хранить пароли в MD5, courier-imap работает без проблем, а exim не понимает MD5, ктонить скажите почему?
ведь тут все прописано
auth_cram_md5:
 driver = cram_md5
 public_name = CRAM-MD5
 server_secret = ${lookup mysql{SELECT `password` FROM \
                       `mailbox` WHERE `username` \
                       = '${quote_mysql:$1}'}{$value}fail}
 server_set_id = $1

Alexander, 2009-07-04 в 15:54:40

Спасибо, хорошая статься !!!

gyurza2000, 2009-08-02 в 1:02:19

всё по статье, всё вроде работает, зашёл браузером в /postfixadmin/install.php завёл суперадмина, настроился, удалил файл install.php, захожу браузером на /postfixadmin/login.php - а в ответ тишина - белый лист

mephist, 2009-08-03 в 11:58:51

gyurza2000, а про error_log уже забыли? =)

DarkLelik, 2010-03-23 в 10:54:42

статья супер. Всё сделал по ней. Единственно не понятно с релеями. Как его добавлять через мускул или или постфикс ... И что должно стоять в поле transport ?

Best User, 2010-05-25 в 12:36:18

А если copy_mail.conf изменить таким способом - то будет почта от этого пользхователя копирвоаться или нет?

if $recipients is "bad_user@domain.com"
then
unseen deliver boss_user@domain.com
endif

if $sender_address is "bad_user@domain.com"
then
unseen deliver boss_user@domain.com
endif

bonhead, 2010-09-20 в 3:52:40

У мну ругается на php

PHP Fatal error:  Unknown: Failed opening required '/usr/home/org/public_html/mail_admin/admin/index.php' (include_path='.:/usr/local/share/pear') in Unknown on line 0

Подскажите, что делать... suhosin убрал

evk, 2010-09-24 в 7:22:39

Насколько я понимаю конфиг заточен, чтобы почту можно релеить только с внутренних айпи? Просто сложилась у меня проблемка: Убунтувский Эволюшин спокойно забирает почту с сервака, а вот на попытку отправить "relay not permitted/Свободен. Это тебе не ОпенРелей". Проблема возникает только когда пытаюсь зайти из внешней сети. Из под сети конторы письмо уходит.

Konstantine, 2010-09-24 в 13:36:59

Ну правильно потому что для забора используется курьер courier-imap, а вот как раз для посылки exim ведь он MTA (mail TRANSIVER agent) поэтому чтобы посылать письмо через твой МТА с левых хостов тебе нужно смотреть раздел авторизации. Это
# Описания аутентификации

begin authenticators
# CRAM-MD5 аутентификация, требует наличия пароля в открытом виде, имя
# пользователя должно быть в формате user@domain, как оно хранится в таблице
# accounts
lookup_cram:
       driver = cram_md5
       public_name = CRAM-MD5
       server_secret = ${lookup pgsql {select password from accounts where login='$1@manotom-tmz.ru'}{$value}fail}
#        server_secret = ${lookup pgsql {select password from accounts where login='$1'\@'$local_domains'}{$value}fail}
#        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@manotom-tmz.ru' and password='$2'}{yes}{no}}
#        server_condition = ${lookup pgsql {select login from accounts where login='$1' and password='$2'}{yes}{no}}
#        server_condition = ${lookup pgsql {select login from accounts where login='$1'\@'$local_domains' and password='$2'}{yes}{no}}
       server_set_id = $1

#auth_plain:
#       driver = plaintext
#        public_name = PLAIN
#       server_prompts = :
#        server_condition = ${lookup pgsql {SELECT login FROM accounts WHERE login = '$1@$domain' AND password = '$2'}{yes}{no}}
#        server_set_id = $2

У меня лично так.
Да и кстати я совету тебе вообще закрыть опен релей у себя, т.к. из локальной сети заражённые винды могут слать через твой МТА спам из за того что он не запрашивает авторизацию. Вирусню сейчас так начали писать что она может читать из дефаултового браузера настройку прокси и посылаеть СПАМ через твой прокси, например если у тебя squid и метод CONNECT по 25 порту у тебя для ВСЕХ разрешён, то всё.... пиши пропало опять будешь себя разбанивать из спам баз.
Всё это наблюдалось на личном опыте.

evk, 2010-09-24 в 22:53:40

Konstantine, да оепен релей и закрыт, иначе бы и не было такой ошибки. Если честно, то подключение из внешки мне нужно только для одного айпи(моего домашнего), просто удобнее через почтовую программу из дома просматривать свою почту. Но в принципе не страшно, я для этих целей беличью веб-морду поставил ;)
Ну а вообще, спасибо за выдержки из конфига!

Zorg, 2010-12-22 в 10:09:43

Спасибо, очень помогла статейка, ставил это дело на centos, эксим заработал сразу а вот c courier-imap возился долго, оказалось не хотел он авторизовывать пользователя из-за :
MYSQL_UID_FIELD         26
MYSQL_GID_FIELD         26
Заменил на другие, от своего пользователя exim и заработало.

mvs, 2011-03-02 в 10:27:31

Автору спасибо! Потратил два дня на реализацию статьи и все заработало, правда не сразу.
Полезно акцентировать внимание на обновлении портов и системы. Только после этих действий работа идет намного быстрее.
И особо, внимательное чтение и внимательное составление конфигов, желательно без тупого копипастинга. Это позволит избежать многих ошибок и понять как будет работать уже ТВОЯ система.

and, 2011-04-06 в 13:33:58

# Так выглядит слово "Удалённые" :))
IMAP_TRASHFOLDERNAME="&BCMENAQwBDsEUQQ9BD0ESwQ1-"
IMAP_EMPTYTRASH=Trash:7
IMAP_MOVE_EXPUNGE_TO_TRASH=1


# IMPORTANT:  If you change this, you must also change IMAP_EMPTYTRASH

IMAP_EMPTYTRASH="&BCMENAQwBDsEUQQ9BD0ESwQ1-":7
как-то так должно быть, т.к. Trash это имя волшебной папки что указано выше.



 

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

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0881 секунд
Из них PHP: 68%; SQL: 32%; Число SQL-запросов: 77 шт.
Исходный размер: 167908; Сжатая: 36821