FreeBSD - статьи

         

Настройка mysql


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

итак, создаём базу данных для наших программ:

create database mail; use mail;

создаём таблицы с необходимыми индексами. первая таблица transport - описания транспортов для наших виртуальных доменов. сразу добавляем туда наш единственный домен - raven.elk.ru с транспортом virtual.

create table transport( domain varchar(255) not null default '', transport varchar(255) not null default '', comment text, primary key(domain) );

insert into transport(domain, transport) values('raven.elk.ru','virtual:');

следующая таблица - алиасы адресов. смысл её в том, что если postfix увидит письмо на адрес указанный в поле alias, то это письмо будет переправлено на адрес в соответствующем поле rcpt. адреса в полях могут принадлежать одинаковым доменам, разным доменам, а так же там могут быть адреса, которые не принадлежат нашим доменам ;) просто если, вдруг, письма с такими адресами получателя будут проходить через наш MTA (например от наших пользователей), то postfix изменит их адреса получателя и письма уйдут туда, куда мы их отправим.

create table aliases( alias varchar(255) not null default '', rcpt varchar(255) not null default '', comment text, primary key(alias) );

insert into aliases(alias, rcpt) values('root@raven.elk.ru', 'iam@raven.elk.ru');

insert into aliases(alias, rcpt) values('abuse@raven.elk.ru', 'iam@raven.elk.ru');

insert into aliases(alias, rcpt) values('mailer-daemon@raven.elk.ru', 'iam@raven.elk.ru');

insert into aliases(alias, rcpt) values('postmaster@raven.elk.ru', 'iam@raven.elk.ru');

insert into aliases(alias, rcpt) values('hostmaster@raven.elk.ru', 'iam@raven.elk.ru');

insert into aliases(alias, rcpt) values('iam@raven.elk.ru', 'me@raven.elk.ru');


далее идёт таблица - список наших логинов. поля login, password и maildir очевидны, можете посмотреть на примере в insert. единственное, хотелось бы подчеркнуть, что значения поля maildir обязательно должны заканчиваться знаком '/' (slash) иначе virtual (транспорт) почту будет валить в обычный unix mailbox с соответствующим именем, а нам нужен именно maildir. если бы не тупой mysql в качестве sql сервера, то можно было бы установить rule и trigger, которые бы самостоятельно заполняли поля исходя из логина, но в mysql такого без порядочного геморроя не сделать.



поля expired, antivirus и antispam соответственно обозначают expired ли логин, нужно ли проверять его антивирусом и антиспамом. подобные услуги для пользователей стоит делать платными, так как всё таки они откушивают очень много ресурсов у почтового сервера по сравнением с обычной доставкой почты. а антивирус вообще стоит денег, хоть тут мы его и будем использовать бесплатно, пользуясь дыркой в системе работы с ключами ;-) что совершенно законно, между прочим.

create table users( login varchar(255) not null default '', password varchar(255) not null default '', maildir varchar(255) not null default '', expired char default '0', antivirus char default '1', antispam char default '1', comment text, primary key(login), key login_expired(login, expired), key login_antivirus(login, antivirus), key login_antispam(login, antispam) );

insert into users(login, password, maildir) values('me@raven.elk.ru', encrypt('password:)'), 'raven.elk.ru/me/');

insert into users(login, password, maildir) values('test@raven.elk.ru', encrypt('password1:)'), 'raven.elk.ru/test/');

insert into users(login, password, maildir) values('test1@raven.elk.ru', encrypt('password2:)'), 'raven.elk.ru/test1/');

казалось бы это всё, но нет. следующая таблица решает проблему 'старшего брата'. здесь мы не будем обсуждать моральную сторону этого вопроса, но ни для кого не секрет, что очень многие гендиры корпораций желают (и получают) копии всех писем сотрудникам на свой ящик. опция always_bcc в postfix решает этот вопрос, но мы же крутые админы и не хотим, чтобы начальник читал нашу личную почту, верно? да и не только нашу. всегда существуют исключения в виде симпатичных секретарш или других особей женского пола которые рады отблагодарить админа за его доброту. шутка ;-)



примеры insert' ов демонстрируют систему работы скрипта, который обрабатывает эту таблицу. первое правило:

поле type 'delivered-to'. этим правилом будут ловится все письма, у которых в служебной строке delivered-to встретился адрес, попавший под маску в регулярных выражениях, соответствующую полю mask (персонально для mysql не забываем экранировать знак back slash '\' им же самим, а для перловых регэкспов служебные символы). в поле forward_addr хранится адрес, на который нужно копировать письмо, если оно подошло под условия. поле what установлено в буковку 'i', что значит (i)nclude, т.е. включающее правило. таким образом в первом примере будет ловится вся почта для домена raven.elk.ru и копироваться на адрес me@raven.elk.ru.

второе правило - это исключение из первого примера адреса test1@raven.elk.ru. т.о. в комплексе этих двух правил на адрес me@raven.elk.ru будет копироваться вся почта для домена raven.elk.ru, исключая адрес test1@raven.elk.ru.

create table forward( id int(10) unsigned not null auto_increment, type varchar(50) not null default 'delivered-to', mask varchar(255) not null default '.+', forward_addr varchar(255) not null default 'root', what char not null default 'i', comment text, primary key(id), key what(what), key type_mask(type, mask) );

insert into forward(type, mask, forward_addr, what, comment) values('delivered-to', '[a-z0-9\- _]+\\@raven\\.elk\\.ru', 'me@raven.elk.ru', 'i', 'forwarding all mail for raven.elk.ru');

insert into forward(type, mask, forward_addr, what, comment) values('delivered-to', 'test1\\@raven\\.elk\\.ru', 'me@raven.elk.ru', 'e', 'exclude forward test1 mail');

теперь осталось создать пользователей в mysql и выдать им соответствующие права на доступ к нашим таблицам. пользователь mailer - это наши демоны, в числе которых будет postfix, courier-imap и cyrus-sasl2 в лице pam-mysql :-) а пользователь mail_admin - это эникейщик в нашей конторе, которого можно допустить до базы через phpMyAdmin и заставить его самого делать почтовые эккаунты юзерам, а самим расслабляться и пить пиво ;)

grant select on mail.* to mailer@localhost identified by 'mailer_password';

grant select, insert, update on mail.* to mail_admin@localhost identified by 'mail_admin_password';






  • Содержание раздела