0

Связка exim + courier-imap + MS exchange (почтарь внутри локалки) (часть 2)

3 июня 2008
Предистория.В канторе где мне довелось работать я застал такую картину: часть почтовых ящиков находилась на FreeBSD со встроенным sendmail, а часть уже успели перенести на MS Exchange внутри локалки. При этом чтобы создать рабочий ящик нужно было проделать уйму телодвижений, к тому же сработала моя личная неприязнь к sendmail. Короче было решено переходить на MTA EXIM, почту с ящиков, которые на FreeBSD раздавать пользователям с помощью courier-imap, остальную передавать на MS Exchange. За основу были взяты конфиги с нескольких статей написанных Лисом ( http://www.lissyara.su) за что ему большое спасибо.

Для проверки существоваания пользователей в домене (цель - генерить отлупы до приёма сообщения, на уровне "rcpt to:" - иначе, они могут пойти по фальшивому обратному адресу), exim будет лазить напрямую в виндовый ldap - для этого заведён специальный пользователь в домене, без права логинитсья.
Для удобства, конфиг почтаря был разбит на несколько кусков. Была реализована схема с т.н. "белыми списками". Также, с сайта http://www.iana.org/ был утянут список всех доменов верхнего уровня - он используется в проверках HELO - существует ли такой домен (проверка регулярным выражением на синтаксис - всё же не так эффективна).


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

/usr/local/etc/exim/includes/500.acl_check_data.conf:

# Проверяем тело письма

# Рубаем по расширениям
  deny    message = contains $found_extension file (blacklisted).
    demime  = com:vbs:bat:pif:scr:exe
    
# проверяем MIME
  deny  message = This message contains a MIME error ($demime_reason)
      demime = *
          condition = ${if >{$demime_errorlevel}{2}{1}{0}}
              
# Проверяем письмо на вирусы
# deny malware = *
    warn malware = *
        logwrite = VIRUS from host $sender_host_name [$sender_host_address]. \
    Mail from $sender_address to $local_part@$domain.
    set acl_m1 = 1
    logwrite = "In e-mail found VIRUS - $malware_name"

# Сообщения с NUL-символами
    deny    message        = This message contains NUL characters
        log_message    = NUL characters!
        condition    = ${if >{$body_zerocount}{0}{1}{0}}
        

# Синтаксис заголовков
# 2007-02-15: закомменчено - очень много сообщений нормальных рубится...
# 2007-02-28: добавлено условие про очки - стало нормально
# 2007-03-29: условие про очки убрано - всё пучком, я неправильно использовал,
# оно возвращает истину если заголовки корректны...
    deny    message        = Incorrect headers syntax
            hosts        = !+relay_from_hosts:*
        #    condition    = ${if >{$acl_m0}{190}{yes}{no}}
        !verify        = header_syntax

# проверяем скрытые копии (немногие юзеры пользуются этим, пусть лучше
# отдельными письмами пишут) у тех, у кого уже есть спамерские очки
    deny    message        = Administrative denied 'blind' ('hidden') copy messages
            condition    = ${if >{$acl_m0}{110}{yes}{no}}
            hosts        = !+relay_from_hosts:*
        !verify        = not_blind
        
# Вводим ACL для заполнения таблицы что и куда ходило
#  warn    condition = ${lookup mysql{INSERT INTO `mail_history` (`to`, `from`, \
#            `message_size`,`sending_timestamp`) VALUES \
#            ('$recipients', '$sender_address', \
#            '$message_size', UNIX_TIMESTAMP())}}

# отладка - выводим пеерменную - надо найти про отправителя конверта.
#    warn    logwrite    = return_path = $return_path; sender_address \
#= $sender_address; sender_address_local_part@sender_address_domain = \
#$sender_address_local_part@$sender_address_domain; reply_address = $reply_address

# проверяем нету ли в поле From адреса с которым переписываемся (web интерфейсы
# любят подставлять себя - поэтому тут и изгаляемся.)
    warn    condition    = ${if eq{${lookup mysql{SELECT 1 FROM `sended_list` \
                    WHERE `user_to` = \
                    LCASE(SUBSTR('${quote_mysql:$reply_address}', \
                    POSITION('<' IN '${quote_mysql:$reply_address}') +1, \
                    POSITION('>' IN '${quote_mysql:$reply_address}') \
                    - POSITION('<' IN '${quote_mysql:$reply_address}') -1) \
                    ) AND `user_from` \
                    = LCASE('${quote_mysql:$local_part@$domain}') AND \
                    `last_mail_timestamp` < `last_mail_timestamp` \
                        + (60*24*60*60) LIMIT 1}}}{1}{yes}{no}}
                                                                                            
        condition       = ${lookup mysql{INSERT IGNORE INTO `domain_whitelist` \
                    (`domainname`, `domain_ip`, `added_timestamp`, \
                    `last_mail_timestamp`, `mail_count`) VALUES \
                    (LCASE('${quote_mysql:$sender_address_domain}'), \
                    '${quote_mysql:$sender_host_address}', \
                    UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), '1') \
                    ON DUPLICATE KEY UPDATE \
                    `last_mail_timestamp` = UNIX_TIMESTAMP(), \
                    `mail_count` = `mail_count` + 1}}
        hosts        = !+relay_from_hosts : *
    set acl_m2    = 1

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

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


/usr/local/etc/exim/includes/600.routers.conf:

# Конфигурация роутеров

                    
# Поиск маршрута к хосту в 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
                                                

## роутер для преобразования адресов из внешних во внутренние
#@conversion_router:
#        driver        =    redirect
##    data        =    $local_part@MS_EXCHANGE_DOMAIN
##    data        =    $local_part
#    data        =    ${lookup ldap {LDAP_AD_MAIL_RCPT}}
#        user        =    mailnull
#    group        =    mail
#        domains        =    +relay_to_domains
            
# умный роутер - шлём почту на внутренний эксчейндж (192.168.205.2)
exchange_router:
    driver        =    "manualroute"
#        domains        =    MS_EXCHANGE_DOMAIN
        domains        =    +relay_to_domains
    transport    =    special_smtp
        route_list    =    * 192.168.2.2
    no_more


/usr/local/etc/exim/includes/700.transports.conf:

# Конфигурация транспортов

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

special_smtp:
    driver = smtp
#    headers_add    = "X-Descriptions: powered by www.az.su"
# следующая строка - это внесение в таблицу отправленных писем - грамотней не
# придумал,поэтому на неё идут варнинги в логах, однако работает :)
    hosts_avoid_esmtp =  ${lookup mysql{INSERT IGNORE INTO `sended_list` \
                (`user_from`, `user_to`, `added_timestamp`, \
            `last_mail_timestamp`, `mail_count`) VALUES \
                (LCASE('${quote_mysql:$sender_address}'), \
            LCASE('${quote_mysql:$local_part@$domain}'), \
                UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), '1') ON DUPLICATE \
            KEY UPDATE `last_mail_timestamp` = UNIX_TIMESTAMP(), \
                `mail_count` = `mail_count` + 1}}
                                            
# локальная доставка
#local_delivery:
#    driver = appendfile
#    file = /var/mail/$local_part
#    delivery_date_add
#    envelope_to_add
#    return_path_add
#    group = mail
#    user = $local_part
#    mode = 0660
#    no_mode_fail_narrower
                
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_pipe:
    driver = pipe
    return_output
                                                                    
address_file:
    driver = appendfile
    delivery_date_add
    envelope_to_add
    return_path_add

                                                                            
# Транспорт для автоответов
address_reply:
    driver = autoreply
        
# В никуда
null_transport:
    driver = appendfile
    file = /dev/null


/usr/local/etc/exim/includes/800.retry_and_rewrite.conf:

# Конфигурация повторов и перезаписи адресов

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

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


# преобразование адресов. Переписываем домен эксчейнджана внешний
##Поскольку у меня имя внутреннего домена совпадает с внешним, перезапись мне ни к чему.
begin rewrite
# основное правило перезаписи - внутренний на внешний домены
# однако, при отсылке внутри тоже пеерзаписывает, после
# обработки эксчейнджевым роутером.... Посему - извращаемся
#*@MS_EXCHANGE_DOMAIN    "${if eq{$interface_address}{INTERNAL_IP}{$1@komarovka.org.ua}fail}"
#*@MS_EXCHANGE_DOMAIN    "${if or !}"
#*@MS_EXCHANGE_DOMAIN    $1@komarovka.org.ua
#*@mail.komarovka.org.ua    $1@komarovka.org.ua


/usr/local/etc/exim/includes/900.authenticators.conf:

# Аутентификация для исходящих сообщений.

# А вот по какому методу авторизуется оутглюк - я уже и
# не помню... Хотя в своё время долго ковырялся,
# пока настроил... Толь 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


/usr/local/etc/exim/db/dialup_hosts:

# for test - mx.grand-prix.ru
#^\.*grand\.*

# dialup hosts
^\.*dsl\.*
^\.*dialup\.*
^\.*dialin\.*
^\.*pool\.*
^\.*peer\.*
^\.*dhcp\.*
^\.*dynamic\.*
^\.*cable\.*
^\.*ppp\.*

# expressions for digit in hosts
^\d+[-\.]\d+[-\.]\d+[-\.]
^\d{5,}

# by ded3axap
^.*([1-9]+)\\-([0-9]+)\\-([0-9]+)\\-([1-9]+).*
^.*([1-9]+).([0-9]+).([0-9]+).([1-9]+).*
^.*pool.*
^.*dial.*
^.*dyn.*
^.*ppp.*
^.*fbx.*
^.*cable.*
^.*dsl.*
^.*dynamic.*
^.*fibertel.*
^.*broadband.*
^.*hsd1.*
^.*telecable.*
^.*dhcp.*
^.*kabel.*
^.*client.*
^.*in-addr.*
^.*user.*
^.*cpe.*
^.*tampabay.*
^.*phx1.*
^.*static.*
^.*rev.*
^.*speedy.*
^.*genericrev.*
^.*cdma.*
^.*catv.*
^.*customer.*

# optional - by ded3axap
^.*rima-tde\\.net
^.*comcast\\.net
^.*pppoe\\.mtu-net\\.ru
^.*proxad\\.net
^.*bezeqint\\.net
^.*arcor-ip\\.net
^.*novis\\.pt
^.*rr\\.com
^.*verizon\\.net
^.*chello\\.nl
^.*ono\\.com
^.*t-dialin\\.net
^.*telenet\\.be
^.*virtua.com\\.br
^.*veloxzone.com\\.br
^.*tpnet\\.pl
^.*com\\.au
^.*asianet\\.co\\.th
^.*interbusiness\\.it
^.*webandnetworksolutions\\.com
^.*xtra.co\\.nz
^.*atlanticbb\\.net
^.*sinor\\.ru
^.*tiscali\\.fr
^.*wanadoo\\.fr
^.*pacbell\\.net
^.*prodigy\\.net
^.*charter\\.com
^.*barak-online\\.net
^.*qwest\\.net
^.*cm\\.vtr\\.net
^.*link\\.com\\.eg
^.*t-ipconnect\\.de
^.*mindspring\\.com
^.*telesp\\.net\\.br
^.*home\\.nl
^.*cable\\.ntl\\.com
^.*netvision\\.net\\.il
^.*btcentralplus\\.com
^.*surewest\\.net
^.*anteldata\\.net\\.uy
^.*mm\\.pl
^.*euskaltel\\.es
^.*satnet\\.net
^.*kabelbw\\.de
^.*skylink\\.ru
^.*consumerpcinc\\.com
^.*yourhostingaccount\\.com


/usr/local/etc/exim/filters/system-filter:

logfile /var/log/exim/system-filter.log

# проверяем, нет ли вирусов
if $acl_m1 contains "1"
    then
# копируем письма. с вирусами нам не нужны.
    deliver viruses@eliron.ru
    #no_more
    else
        
# Спам
        
#logwrite "EXIM FILTER: debug - digit in variable acl_m0 = $acl_m0 (before)"
# Проверяем содержимое переменной про спам (содержит ли цифры)
if $acl_m0 matches ^\\d+
    then
#logwrite "FILTER: debug - digit in variable acl_m0 = $acl_m0 (after first if)"
# Строим новую тему письма - если спам
# Проверяем содержимое переменной со счётчиком спамерских очков.
# На данный момент считаем - что если 60 и более - это спам.
                    
    # Добавляем заголовки с объяснением происходящего
    headers add "X-Spam-Description: if spam count > 60 - this is spam"
    headers add "X-Spam-Count: $acl_m0"
                        
                        
# рихтуем хеадеры
if $acl_m0 is above 59
    then
#        headers add "Old-Subject: $h_subject:"
#        headers remove "Subject"
#        headers add "Subject: (*** SPAM ***) $h_old-subject:"
                headers add "X-Spam: YES"
# Старый заголовок оставляем, на всякий случай
                #headers remove "Old-Subject"
#logwrite "EXIM FILTER: Spam count = $acl_m0; Added SPAM header"
    endif

# Закрытие - содержит цифры
endif
            
#logwrite "EXIM FILTER: interface_address = $interface_address"
# перезапись заголовков, которые не окучены штатно - exim`ом
if $interface_address is INTERNAL_IP
    then
        headers add "Old-Disposition-Notification-To: $h_Disposition-Notification-To:"
        headers add "Old-Return-Receipt-To: $h_Return-Receipt-To:"
        headers remove "Disposition-Notification-To"
        headers remove "Return-Receipt-To"
        headers add "Disposition-Notification-To: <$sender_address>"
        headers add "Return-Receipt-To: <$sender_address>"
        logwrite "EXIM FILTER: heders rewritten in filter"
    endif
                                                                                    
# закрываем проверку на вирусы в письме
endif


Также надо подправить файл /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. Конечно, по хорошему, его надо было поставить до запуска экзима. Но - работает и так :)

gw# cd /usr/ports/mail/postfixadmin/
gw# make && make install && make clean


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

mysql --user=root --password=XXXXXXX < dump.sql

А вот и сам дамп:

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

CREATE TABLE `admin` (
  `username` varchar(255) COLLATE cp1251_bin NOT NULL DEFAULT '',
  `password` varchar(255) COLLATE cp1251_bin 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`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COLLATE=cp1251_bin COMMENT='Exim and courier-imap Admin - Virtual Admins';

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

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

CREATE TABLE `alias` (
  `address` varchar(255) COLLATE cp1251_bin NOT NULL DEFAULT '',
  `goto` text COLLATE cp1251_bin NOT NULL,
  `domain` varchar(255) COLLATE cp1251_bin 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`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COLLATE=cp1251_bin COMMENT='Exim and courier-imap Admin - Virtual Aliases';

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

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

CREATE TABLE `domain` (
  `domain` varchar(255) COLLATE cp1251_bin NOT NULL DEFAULT '',
  `description` varchar(255) COLLATE cp1251_bin 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) COLLATE cp1251_bin 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`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COLLATE=cp1251_bin COMMENT='Exim and courier-imap Admin - Virtual Domains';

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

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

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

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

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

CREATE TABLE `domain_whitelist` (
  `id` int(9) NOT NULL AUTO_INCREMENT,
  `domainname` varchar(64) COLLATE cp1251_bin NOT NULL,
  `domain_ip` varchar(16) COLLATE cp1251_bin NOT NULL,
  `added_timestamp` int(32) NOT NULL,
  `last_mail_timestamp` int(32) NOT NULL,
  `mail_count` int(9) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `domainname` (`domainname`,`domain_ip`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 COLLATE=cp1251_bin COMMENT='Таблица белых доменов' AUTO_INCREMENT=210;

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

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

CREATE TABLE `list_top_level_domains` (
  `unic_id` int(3) NOT NULL AUTO_INCREMENT,
  `zone` varchar(15) COLLATE cp1251_bin NOT NULL DEFAULT '',
  `description` varchar(64) COLLATE cp1251_bin NOT NULL DEFAULT '',
  PRIMARY KEY (`unic_id`),
  UNIQUE KEY `zone` (`zone`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 COLLATE=cp1251_bin COMMENT='List all of top-level domains, from http://www.iana.org/' AUTO_INCREMENT=269;

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

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

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

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

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

CREATE TABLE `mailbox` (
  `username` varchar(255) COLLATE cp1251_bin NOT NULL DEFAULT '',
  `password` varchar(255) COLLATE cp1251_bin NOT NULL DEFAULT '',
  `name` varchar(255) COLLATE cp1251_bin NOT NULL DEFAULT '',
  `maildir` varchar(255) COLLATE cp1251_bin NOT NULL DEFAULT '',
  `quota` int(10) NOT NULL DEFAULT '0',
  `domain` varchar(255) COLLATE cp1251_bin 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`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COLLATE=cp1251_bin COMMENT='Exim and courier-imap Admin - Virtual Mailboxes';

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

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

CREATE TABLE `sended_list` (
  `id` int(32) NOT NULL AUTO_INCREMENT,
  `user_from` varchar(64) COLLATE cp1251_bin NOT NULL,
  `user_to` varchar(64) COLLATE cp1251_bin NOT NULL,
  `added_timestamp` int(32) NOT NULL,
  `last_mail_timestamp` int(32) NOT NULL,
  `mail_count` int(6) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `user_from` (`user_from`,`user_to`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 COLLATE=cp1251_bin COMMENT='Таблица белых хостов' AUTO_INCREMENT=1718608;

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

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

CREATE TABLE `vacation` (
  `email` varchar(255) COLLATE cp1251_bin NOT NULL DEFAULT '',
  `subject` varchar(255) COLLATE cp1251_bin NOT NULL DEFAULT '',
  `body` text COLLATE cp1251_bin NOT NULL,
  `cache` text COLLATE cp1251_bin NOT NULL,
  `domain` varchar(255) COLLATE cp1251_bin 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`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COLLATE=cp1251_bin COMMENT='Exim and courier-imap Admin - Virtual Vacation';


Добавляем строки в /etc/rc.conf и запускаем, также делаем симлинк на админку в директории /usr/local/www/data - или где у вас она будет:

gw# echo 'exim_enable="YES"' >> /etc/rc.conf
gw# echo 'sendmail_enable="NONE"' >> /etc/rc.conf
gw# /usr/local/etc/rc.d/exim.sh start
Starting exim.
gw# echo 'apache22_enable="YES"' >> /etc/rc.conf
gw# /usr/local/etc/rc.d/apache.sh start
Starting apache.
gw# ln -s /usr/local/www/postfixadmin  /usr/local/www/data/mail_admin


По адресу 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';


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

После создания и заполнения БД можно пробовать отправить письмо, с консоли, командой mail - то, что в конфиге прописан сканер на вирусы, которого пока нет - не помеха, письма с локалхоста не проверяются на вирусы. Однако антивирь поставить надо. Что и делаем:

gw# cd /usr/ports/security/clamav
gw# make && make install && make clean

После установки запускаем антивирь, и обновляем:

gw# echo 'clamav_clamd_enable="YES"' >> /etc/rc.conf
gw# echo 'clamav_freshclam_enable="YES"' >> /etc/rc.conf
gw# clamd
gw# freshclam


Всё. Сервер SMTP работает. Письма принимаются, и отправляются наружу (если вы заполнили БД, разумеется). Теперь надо поставить того, кто раздаст её клиентам - courier-imap.

gw# cd /usr/ports/mail/courier-imap
gw# make && make install && make clean

Лезет окошко с опциями, выбираем обязательно - MySQL, остальное по желанию
После сборки рихтуем конфиг программы авторизеации:
/usr/local/etc/authlib/authmysqlrc

MYSQL_SERVER        localhost

MYSQL_USERNAME        exim

MYSQL_PASSWORD        exim

MYSQL_SOCKET        /tmp/mysql.sock

MYSQL_PORT        3306


MYSQL_OPT        0


MYSQL_DATABASE        exim


MYSQL_USER_TABLE    mailbox

MYSQL_CLEAR_PWFIELD     password


DEFAULT_DOMAIN        komarovka.org.ua

MYSQL_UID_FIELD        26

MYSQL_GID_FIELD        26

MYSQL_LOGIN_FIELD    username


MYSQL_HOME_FIELD    CONCAT('/var/mail/exim/', `maildir`)


MYSQL_NAME_FIELD    name

MYSQL_MAILDIR_FIELD    CONCAT('/var/mail/exim/', `maildir`)


ВСЁ!!!

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

 (голосов: 0)
автор новости_az_ FreeBSD печать

Комментариев: 0      Теги: локалки, часть, внутри, почтарь, courierimap, exchange, Связка, FreeBSD

Информация

Посетители, находящиеся в группе Гости, не могут оставлять комментарии в данной новости.