Предистория.В канторе где мне довелось работать я застал такую картину: часть почтовых ящиков находилась на 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 или ещё как угодно.
Для проверки существоваания пользователей в домене (цель - генерить отлупы до приёма сообщения, на уровне "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 или ещё как угодно.



Информация
Теги
Прямой эфир
Лучшие новости
Кто на сайте
Заголовок