цель еще раз:
дать пользователям возможность добавлять свои ящики и домены, в безконечном количестве или в ограниченном, чтобы не парить админа (в postfixadmin это не сделано)
записывать postfix логи в СУБД и сделать поиск по ним
например вствить из ldap именно пользователей... и пускай сами админят
еще надо было переписать под ldap, но так и не сделал (там подправить очень легко)
Программа для администрирования виртуальных доменов в Exim, Postfix, etc
язык программирвоания: Perl
преимущества:
1) По страничный вывод данных;
2) Возможность добавление несколько доменов к аккаунту;
3) Логи в реальном времени и поиск по ним;
4) Возможность интеграции и использования;
5) HTML отдельно;
6) Расширенная возможность управлениеи пользователями.
недостатки:
1) Нету автоответчика (будет);
2) Fetchmail нету.
Что нужно:
Postfix / exim / etc,
Apache 1.3.27 / Apache 2.28 / etc,
Perl (tested 5.8.8),
MySQL, SQLite, etc (tested MySQL 5.0.67)
Используется perl модули:
use HTML::Template;
use Data::Validate::Domain;
use Data::Validate::Email;
use DBI;
use DBD::MySQL;
IO::Socket;
use File::Pid;
(и всё что тянется с ними)
Установка модулей примерно так:
Код: Выделить всё
cd /usr/ports/databases/p5-DBD-mysql50/ && make && make install clean
(or /usr/ports/databases/p5-DBD-mysql51/)
(or *)
cd /usr/ports/www/p5-HTML-Template && make && make install clean
cd /usr/ports/dns/p5-Data-Validate-Domain && make && make install clean
cd /usr/ports/mail/p5-Data-Validate-Email && make && make install clean
cd /usr/ports/devel/p5-File-Pid && make && make install clean
etc
Про настройку виртуальных доменов можно посмотреть тут:
(таблицы MySQL которые в postfixadmin отличаться, но настройка не отличается)
http://high5.net/howto/
http://sys-adm.org.ua/mail/mail-howto-p1.php
http://www.lissyara.su/?id=1015
http://google.com
Patch md5crypt cyrus-sasl:
cyrus-sasl-2.1.22_md5patch_dist.rar: http://postfix.ru/viewtopic.php?t=3083
Настройка Apache под perl у меня примерно такая, но может быть разная:
Код: Выделить всё
AddHandler cgi-script .cgi .pl
DirectoryIndex index.pl
<Directory /usr/local/www/simplemail>
Options Indexes FollowSymLinks ExecCGI
</Directory>
(configuration can will differ)
perl идет в режиме CGI, поэтому mod_perl не нужен.
Пароли хранятся в md5 закриптографированые (пароль+соль), штатная функция md5crypt в perl, предложенный механизм от Poul-Henning Kamp из FreeBSD http://www.usenix.org/events/usenix99/prov...tml/node10.html
1) Скачать архив, распаковать
ftp://ftp.lissyara.su/users/ProFTP/simple...dmin-1.0.tar.gz
ftp://ftp.lissyara.su/users/ProFTP/simplemailadmin-1.0.zip
ftp://ftp.lissyara.su/users/ProFTP/simplemailadmin-1.0.7z
2) Права доступа
Код: Выделить всё
$ cd /usr/local/www/simplemail
$ chmod 640 *.pl *.ht*
$ cd /usr/local/www/simplemail/scripts/
$ chmod 640 *.pl .ht*
$ cd /usr/local/www/simplemail/lib/
$ chmod 640 *.pl .ht* *.pm
$ cd /usr/local/www/simplemail/templates/
$ chmod 640 *.css *.html
$ cd /usr/local/www/simplemail/templates/images
$ chmod 640 *.gif *.png
Код: Выделить всё
$ cd /usr/local/www/simplemail
права на выполняемый файл:
Код: Выделить всё
$ chmod 750 index.pl
$ chown www:www index.pl
(если работает Suexec, то поставить пользователя от которого должно работать, так же права на все файлы для него)
Код: Выделить всё
$ cd /usr/local/www/simplemail/scripts
Крон скрипт:
Код: Выделить всё
$ chmod 700 maillog.pl
$ chown root:wheel maillog.pl
данную вещь можно было сделать демоном, но от крона проще, по поводу безопасности смотрите сами, каталог где работает этот скрипт защищен веб сервером:
Код: Выделить всё
<Files *>
Order Deny,Allow
Deny from all
Allow from localhost
</Files>
3. Создание таблицы и пользователя MySQL
можно воспользоватся phpmysql или через консоль :
Код: Выделить всё
$ mysql -u root -p
Код: Выделить всё
> use mysql
> CREATE DATABASE IF NOT EXISTS mail_db;
> GRANT ALL PRIVILEGES on mail_db.* to mail@localhost IDENTIFIED BY 'pass_mail_mysql';
или
Код: Выделить всё
# DB mail_db
> USE mysql;
> INSERT INTO `user` (`Host`, `User`, `Password`)
> VALUES ('localhost','mail',password('exim'));
> INSERT INTO `db` (`Host`, `Db`, `User`, `Select_priv`)
> VALUES ('localhost','mail_db','mail','Y');
> FLUSH PRIVILEGES;
> GRANT USAGE ON exim.* TO mail@localhost;
> GRANT CREATE, SELECT, INSERT, DELETE, UPDATE ON mail_db.* TO mail@localhost;
> CREATE DATABASE `mail_db`;
> USE `mail_db`;
4. Конфигурация конфига
(если путь к конфигу не такой /usr/local/www/simplemail/lib/config.pl
то нужно в файле maillog.pl откоректирвоать путь к нему
Код: Выделить всё
$ ee maillog.pl
require "/home/...../simplemail/lib/config.pl";
)
файл с настройками /lib/config.pl
нужно написать имя пользвотеля, базу, пароль к MySQl и т.д.
5. Инсталяция таблиц и пароль админа.
Код: Выделить всё
$ chmod 750 install.pl
Код: Выделить всё
$./install.pl passwd_admin
первый аргумент passwd_admin - это пароль админа, который должен быть объязательно.
после выполнения install.pl будет создан аккаунт
user: Admin
pass: который будет введен
если все прошло без ошибок, то переходим http://mydomain.tld/
если не заработало, то смотрим на что ругается
ПРИМЕЧАНИЕ: при создании таблиц объязательно в таблицу users должна быть добавлена информация про пользователя Guest и Admin, это все делает install.pl
6. Crontab
Код: Выделить всё
*/2 * * * * root /usr/local/www/simplemail/scripts/maillog.pl
7. Delete install.pl
Код: Выделить всё
$ rm install.pl
Конфиг config.pl
Код: Выделить всё
use CGI::Carp qw(fatalsToBrowser);
%{$se} = (
#данные про MySSQL
'db_name' => 'db',
# user from db
'db_user' => '',
'db_pass' => '',
'db_type' => 'mysql',
'db_host' => 'localhost',
# путь к шаблонам, желательно указать полный путь
# может заработать так 'dirt' => 'template/',
# или так 'dirt' => '../template/',
'dirt' => '../template/',
# url
# 'url' => 'http://domain.ltd',
# Maildir
'maildir' => '/var/spool/mail/',
#maillog file
'maillog' => '/var/log/maillog',
# Пользователь от которого работает транспорт
'transport_user' => 'virtual',
# число строк на странице (постраничный вывод)
'line_from_page' => '30', # 1, or 1000++
# Время жизни печенья для пользователей и администратора
# For an administrator with the purpose of safety of cookies not active, you can change
# +30s 30 seconds from now
# +10m ten minutes from now
# +1h one hour from now
# -1d yesterday (i.e. "ASAP!")
# now immediately
# +3M in three months
# +10y in ten years time
# Thursday, 25-Apr-1999 00:40:33 GMT at the indicated time & date
'time_cookie_admin' => '', # +14d - 14 day, '' - Disable
'time_cookie_users' => '+14d', # +14d - 14 day, '' - Disable
# Включить логирование действий в Simplemail
'active_logsm' => '1', # 1 - Enable, 0 - Disable
# Время в периоде которого хранятся эти логи
'time_which_active_logsm' => '604800', # sec (7 day)
# Брать ли данный с /var/log/maillog
'active_logmta' => '1', # 1 - Enable, 0 - Disable
# Число строк которые хранятся в таблице СУБД
# и берутся с maillog, если файл maillog очень большой, то можно поставить больше
'time_which_active_logmta' => '23000', # max line online
# тип паролей:
# '0' - clean text
# 'md5crypt' - md5crypt
'type_passwd' => 'md5crypt', # 'md5crypt' or '0'
# Максимальная длина пароля (6-9 is recommended)
'max_long_passwd' => '3', # '2', '10' ...
# Максимальное число неправильно введенных паролей к Simplemail
'max_error_login' => '5',
# Время в котором блокируется пользователь, если вводит не правильные пароли
'max_error_login_time' => '1800', # max time bad passwd 30min
# Кэшировать шаблоны, для быстродействия, в данном случае в оперативну память все идет
'blind_cache' => '1', # 1 - Enable, 0 - Disable
# smtp_server
'smtp_server' => 'localhost', # (рекомендуется 'localhost')
# Ящик от которого отправляется письмо
'mail_from' => '', # '' - no email from, exemple: 'no_repley@mydomain.com'
'text_new_mailbox' => 'Welcome to your new account'
);
#unless (defined($se->{'url'})) { $se->{'url'} ='http://'.$ENV{'SERVER_NAME'}.'/index.pl';}
1;
скрипт инсталятора, там по поводу оптимизации таблицы можно подправить, но мне не нужно
Код: Выделить всё
#!/usr/bin/perl
use strict;
use CGI;
use DBI;
use FindBin qw/$Bin/;
use lib "$Bin/lib";
our $se;
require "lib/config.pl";
if (!$ARGV[0]) {
print 'No Passwd from Admin';
exit;
}
BEGIN {
require 'func.pm';
}
my $func = func->new();
my $pass_admin = $func->md5crypt( $ARGV[0] ) || die 'error crypt passwd';
my $dbh = DBI->connect("DBI:$se->{db_type}:database=$se->{db_name};host=$se->{db_host}",$se->{db_user},$se->{db_pass},
{ RaiseError => 1 }) || die $DBI::errstr;
$dbh->do(qq{ CREATE TABLE IF NOT EXISTS alias (
address varchar(255) NOT NULL default '',
goto text NOT NULL,
domain varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY (address),
KEY address (address)
) TYPE=MyISAM COMMENT='Simplemail - Virtual Aliases'
}) or die $dbh->errstr;
$dbh->do(qq{
CREATE TABLE IF NOT EXISTS mailbox (
username varchar(255) NOT NULL default '',
password varchar(255) NOT NULL default '',
name varchar(255) NOT NULL default '',
maildir varchar(255) NOT NULL default '',
quota int(10) NOT NULL default '0',
domain varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY (username),
KEY username (username)
) TYPE=MyISAM COMMENT='Simplemail - Virtual Mailboxes'
}) or die $dbh->errstr;
$dbh->do(qq{
CREATE TABLE IF NOT EXISTS admin_domain (
idname INT(11) NOT NULL,
m_alias int(7) not null,
m_mailbox int(7) not null,
m_domain int(7) not null,
mb_domain int(7) not null,
mb_mailbox int(7) not null,
PRIMARY KEY (idname)
)TYPE=MyISAM COMMENT='Simplemail - Admin Domain'
}) or die $dbh->errstr;
$dbh->do(qq{
CREATE TABLE IF NOT EXISTS domain (
idnane int(11) not null,
domain varchar(255) NOT NULL default '',
description varchar(255) NOT NULL default '',
aliases int(10) NOT NULL default '0',
mailboxes int(10) NOT NULL default '0',
maxquota int(10) NOT NULL default '0',
transport varchar(255) default NULL,
backupmx tinyint(1) NOT NULL default '0',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY (domain),
KEY domain (domain)
) TYPE=MyISAM COMMENT='Simplemail - Virtual Domains'
}) or die $dbh->errstr;
$dbh->do(qq{
CREATE TABLE IF NOT EXISTS log_smail (
action VARCHAR(20) NOT NULL,
userid INT(11) NOT NULL,
created INT(11) NOT NULL,
ip VARCHAR(100) NOT NULL,
forwarded VARCHAR(100) NOT NULL,
KEY userid (userid)
) TYPE=MyISAM COMMENT='Simplemail - Simplemail log'
}) or die $dbh->errstr;
$dbh->do(qq{
CREATE TABLE IF NOT EXISTS maillog (
id INT(11) NOT NULL AUTO_INCREMENT,
data VARCHAR(30) NOT NULL,
text text NOT NULL,
KEY id (id)
) TYPE=MyISAM COMMENT='Simplemail - Maillog'
}) or die $dbh->errstr;
$dbh->do(qq{
CREATE TABLE IF NOT EXISTS mailbox_delete (
domain varchar(255) NOT NULL default '',
mailbox varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
KEY mailbox (mailbox)
) TYPE=MyISAM COMMENT='Simplemail - Malbox Delete'
}) or die $dbh->errstr;
$dbh->do(qq{
CREATE TABLE IF NOT EXISTS domain_delete (
domain varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
KEY domain (domain)
) TYPE=MyISAM COMMENT='Simplemail - Domain Delete'
}) or die $dbh->errstr;
$dbh->do(qq{
CREATE TABLE IF NOT EXISTS users (
id INT(11) NOT NULL AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
pass VARCHAR(100) NOT NULL,
info tinyint(1) NOT NULL,
created datetime NOT NULL,
active tinyint(1) NOT NULL,
PRIMARY KEY (id)
) TYPE=MyISAM COMMENT='Simplemail - Users'
}) or die $dbh->errstr;
$dbh->do(qq{
CREATE TABLE IF NOT EXISTS session (
session CHAR(32) NOT NULL,
user INT(11) NOT NULL,
time INT(11) NOT NULL,
host VARCHAR(100) NOT NULL,
ip VARCHAR(100) NOT NULL,
forwarded VARCHAR(100) NOT NULL,
PRIMARY KEY (session)
) TYPE=MyISAM COMMENT='Simplemail - Session'
}) or die $dbh->errstr;
$dbh->do(qq{INSERT INTO users SET id = ?, name = ?, pass = ?},
undef, '4', 'Guest','nopassword');
$dbh->do(qq{INSERT INTO users SET id = ?, name = ?, pass = ?},
undef, '5', 'Admin', $pass_admin);
print 'ok';
0;
ЗЫ сделать инсталятор можно было, но очень долго, так вроде бы нормально...
ЗЫЫ можно использовать другую СУБД, только таблицу создать по другому или поменять и посмотреть еще что-то нужно если не зарабатывает, или запросы подправить под абстракцию DBIx::Class, Class::DBI или SQL::Abstract
Демо тут:
http://unixforum.org.ua/index.php?topic=17604