Документация по ОС FreeBSD Воскресенье, 05.05.2024, 15:09
Приветствую Вас Гость | RSS
Меню сайта

Категории каталога
Apache [58]
DNS [25]
FTP [27]
Mail [74]
Samba [24]
Squid [46]
SSH [23]
VPN [35]
РРР [20]
Net [173]

Главная » Статьи » Сеть » Mail

EXIM+PgSQL+COURIER+CLAMAV+SPAMASSASIN on FreeBSD 7.1 [2009]
Много времени утекло как уважаемый lissyara написал статью об еxim+mysql, изменились и версия freebsd и версии пакетов,вот решил дополнить немного да и БД использовать постгресс (я все-таки предпочитаю pgsql а не mysql).
Ну и конфиги построены так, что НЕ НУЖНО в них что-либо менять, все  настройки пропишем в БД.
Если посчитаете мою статью лишней - не пинайте,сообщайте,уберу.
И так начнем.

На FreeBSD 7.1 ставим postgresql 8.2

cd /usr/ports/databases/postgresql82-server/
make install clean


>su - pgsql
#initdb
#exit
>echo 'postgresql_enable="YES"' >> /etc/rc.conf
>/usr/local/etc/rc.d/postgresql start


Создадим пользователя exim и БД

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


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

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

 CREATE TABLE hostreject (domain text);
 CREATE TABLE local_domain (domain text);
 CREATE TABLE relayfromhosts (hosts text);
 CREATE TABLE relaytohosts (hosts text);

Примечание:
названия таблиц говорят об их предназначении

Cтавим Exim

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


Cтавим SpamAssasin

cd /usr/ports/mail/p5-Mail-SpamAssassin/
make install clean
### Впроцессе установки отвечаем на поросы по желанию
echo 'spamd_enable="YES"' >> /etc/rc.conf


Ставим антивирус

cd /usr/ports/security/clamav/
make install clean
echo 'clamav_clamd_enable="YES"' >> /etc/rc.conf

Обновляем базу
freshclam

Ну и наконец courier

cd /usr/ports/mail/courier-imap/
make install clean
### Выбираем в меню PgSQL
echo 'courier_authdaemond_enable="YES"' >> /etc/rc.conf
echo 'courier_imap_imapd_enable="YES"' >> /etc/rc.conf
echo 'courier_imap_imapd_ssl_enable="YES"' >> /etc/rc.conf
echo 'courier_imap_pop3d_enable="YES"' >> /etc/rc.conf

C установкой покончено, берем бубен и напильник ,начинаем шаманить.
Файл /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

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

Настраиваем imapd.

cd /usr/local/etc/courier-imap/
cp imapd.cnf.dist imapd.cnf


и приводим imapd.cnf к виду
RANDFILE = /usr/local/share/courier-imap/imapd.rand

[ req ]
default_bits = 1024
encrypt_key = yes
distinguished_name = req_dn
x509_extensions = cert_type
prompt = no
[ req_dn ]
C=UA
ST=Lv
L=Lviv
O=Courier Mail Server
OU=Automatically-generated IMAP SSL key
CN=localhost
emailAddress=postmaster@мой_домен.ua
[ cert_type ]
nsCertType = server

Далее генерируем сертификат специальным скриптом:

cd /usr/local/share/courier-imap/
./mkimapdcert


В файле /usr/local/etc/authlib/authdaemonrc меняем строку на вид

authmodulelist="authpgsql"

Файл /usr/local/etc/authlib/authpgsqlrc приводим к виду
PGSQL_HOST localhost
PGSQL_PORT 5432
PGSQL_USERNAME exim
PGSQL_PASSWORD exim
PGSQL_DATABASE exim
PGSQL_USER_TABLE accounts
#PGSQL_CRYPT_PWFIELD crypt
PGSQL_CLEAR_PWFIELD password
DEFAULT_DOMAIN testim.u.ua
PGSQL_UID_FIELD 26
PGSQL_GID_FIELD 26
PGSQL_LOGIN_FIELD login
PGSQL_HOME_FIELD home
PGSQL_NAME_FIELD login
PGSQL_QUOTA_FIELD mailquota
PGSQL_MAILDIR_FIELD maildir

 
И наконец настраиваем конфиг exim (можно просто вставить этот конфиг)
 /usr/local/etc/exim/configure


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

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

CONFIG_PREFIX=/usr/local/etc/exim

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

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

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


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

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

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

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

# Проверка получателя
acl_smtp_rcpt = acl_check_rcpt
# Проверка mime содержимого
acl_smtp_mime = acl_check_mime
# Проверка на спам и вирусы
acl_smtp_data = acl_check_virus

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

# Пытаемся сделать соответствие прямой и обратной зоны dns для каждого хоста.
# Несколько затратно, но весьма полезно
host_lookup = *

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

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

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

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

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

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

begin acl

# Этот список доступа описывает проверки, осуществляемые при вызове любой RCPT
# команды
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
 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
 set acl_m0 = 0s


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

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

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

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


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

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

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

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

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

 accept

# Проверка содержимого на вирусы и спам
acl_check_virus:
 # Мы не запрещаем письма со спамом, а просто добавляем заголовок,
 # содержащий количество спамерских очков, а пользователь на своей
 # стороне уже просто настраивает свои фильтры. Так мы исключаем жалобы
 # со стороны пользователей о потерянных письмах
 warn message = X-Spam-Score: $spam_score ($spam_bar)
 spam = nobody:true

 # Добавляем заголовки, указывающие, что письма были проверены
 # spamasssasin'ом
 warn message = X-Spam-Scanned: Yes
 warn message = X-Spam-Scanner: SpamAssassin running

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

######################################################################
# ROUTERS CONFIGURATION #
# Specifies how addresses are handled #
######################################################################
# THE ORDER IN WHICH THE ROUTERS ARE DEFINED IS IMPORTANT! #
# An address is passed to each router in turn until it is accepted. #
######################################################################

begin routers

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

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

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

# Для локальных пользователей также создаем возможность перенаправления почты
# через ~/.forward файл. Если включена директива allow_filter, то в .forward
# файле можно использовать язык sieve фильтров. Для подробностей см.
# документацию на www.exim.org, т.к. на рассмотрение этой темы уйдет слишком
# много времени
userforward:
 driver = redirect
 check_local_user
 file = $home/.forward
 no_verify
 no_expn
 check_ancestor
# allow_filter
 file_transport = address_file
 pipe_transport = address_pipe
 reply_transport = address_reply
 condition = ${if exists{$home/.forward} {yes} {no} }

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

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

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

begin transports

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

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

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

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

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

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

begin retry

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

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

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

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


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

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

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

# End of Exim configuration file

cd /usr/local/etc/exim/
Генерим сертификаты

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


Для почтовых ящиков мы выбрали директорию /var/mail/exim , вот и создадим ее

mkdir /var/mail/exim
ну и права ей назначим соответствующие (chown mailnull:mail /var/mail/exim)

Зайдем в БД exim и создадим тестового юзера и тестовый домен (для тестирования не нужен реальный домен прописанный в MX, по окончании проверки создадим реальное)

psql -U exim exim
>INSERT INTO accounts VALUES (1,'test@testim.u.ua','12345',\
'/var/mail/exim/test/','/var/mail/exim/test/',20);
>INSERT INTO local_domain VALUES ('testim.u.ua');
>INSERT INTO relayfromhosts VALUES ('localhost');
>INSERT INTO relayfromhosts VALUES ('192.168.0.0/16');
>INSERT INTO relaytohosts VALUES ('testim.u.ua');
>\q


Вот собственно и все.Можно запустить по очереди все сервисы или просто перегрузиться.

Проверим как оно работает

mail -s testmail test@testim.u.ua < /etc/pf.conf
ls /var/mail/exim/
tail /var/log/exim/mainlog


Если директория /var/mail/exim/test создана - все ОК, нет - проверяем права доступа и настройки.
Дальше проверяем отправку от test@testim.u.ua на самого себя и куда-то в мир.Смотрим лог : на себя отправка проходит, в мир типа
... Domain of sender address test@testim.u.ua does not exist

Теперь можно прописывать реальный домен и пользователей.
Да :) меняем в файле /usr/local/etc/authlib/authpgsqlrc строчку
DEFAULT_DOMAIN          testim.u.ua

Замечание : директории для ящика НЕ создаются , пока не будет получено первое письмо, поэтому, после вставки нового юзера в БД, либо создайте директории , либо выполните команду
mail -s hello_new_user new_user@domain < file_to _hello

Ну и на последок : я не использую postfixadmin , использую простенькие скрипты для активации ящиков.Если они кому-то нужны, могу выложить.
Самый простенкий скрипт для создания ящика или изменения пароля (перед использование создайте файл /root/text_mail.txt с любым содержанием)
#!/usr/bin/perl
use DBI;

#==========================preferences=========================
$dbname='exim';
$dbuser='exim';
$dbpass='exim';
$def_dir='/var/mail/exim/';
$def_domain='мой_домен.ua';
$quota=20;
#=============================================================

$dbh=DBI->connect("DBI:Pg:dbname=$dbname","$dbuser","$dbpass");
print "Name :>";
$s=<STDIN>;
chomp($s);
$login=sprintf("%s\@%s",$s,$def_domain);
$sth=$dbh->prepare("select count(uid) from accounts where login='$login'");
$sth->execute;
my($a)=$sth->fetchrow_array();
$sth->finish();
if($a>0){print "name $login allready exist!!!! will change password\n";}
print "Password :>";
$s1=<STDIN>;chomp($s1);
if($s1 eq ""){print "ERROR password\n";$dbh->disconnect();exit 0;}
if($a>0){
 $sth=$dbh->do("update accounts set password='$s1' where login='$login'");
 print "Password changed !\n";}else
{ $sth=$dbh->prepare("select max(uid) from accounts");
 $sth->execute();
 ($uid)=$sth->fetchrow_array();
 $sth->finish();
 $uid++;
 $s2=sprintf("%d,'%s','%s','%s%s\/','%s%s\/',%s",$uid,$login,$s1,$def_dir,
 $s,$def_dir,$s,$quota);
 print "=========================\n
UID =>$uid\nEmail =>$login\nHome_dir=>$def_dir$s\nQuota =>$quota\n
=========================\n";
 $sth=$dbh->do("insert into accounts values($s2)");
 print "Created email $login\n";
 @b=`mail -s Hello $login < /root/text_mail.txt`;}
$dbh->disconnect();

Ну и огромное спасибо lissyara (взял у него кое-что для конфига exim.. уж очень его коменты нравятся)и cebka.



Источник: http://www.lissyara.su/?id=1837
Категория: Mail | Добавил: oleg (21.01.2009) | Автор: DNK
Просмотров: 1572 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Beastie

Друзья сайта

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
links

Copyright MyCorp © 2024