И так прижало мне сделать для себя почтовый сервер на своём сервере. раньше оно работало из коробки и я горя не знал, но тут оказалось, что надо всё делать ну чтож приступим
Во первых, задайте себе вопрос а насколько он нужен вам?
если у вас до 50ти ящиков то очень рекомендую воспользоваться почтой от гугла на своём домене, я уже писал об этом способе.
Экономия времени и нервов вам обеспечена!.
Если же вы настойчивы, то есть 2 способа, оба проделывал я на своих серверах, оба работают и не ругаются.
Очень рекомендую первый, во втором периодически выпадали глюки и приходилось пере запускать демоны.
Первый Postfix + Dovecot + MYSQL
Вариант 2 более простой (postfix (smtp), sasl2 (Авторизция) cyrus-pop3d )
Поехали
Интерпритатора будет два, обычная командная строка (bash) и mysql
[cc lang=”bash”]bash:$>
mysql: mysql>[/cc]
Также все команды будут от root (обычно я запускаю sudo mc и жму ctrl+o и так получается консоль от root)
Устанавливаем необходимые пакеты, также ставим phpmyadmin для более удобного управления базой + вэб интерфейс почты
[cc lang=”bash”]aptitude install postfix-mysql mysql-server dovecot-pop3d dovecot-imapd openssl phpmyadmin squirrelmail[/cc]
Создаём БД + таблицы можно как и из консоли, так и из phpmyadmin
Мне удобнее из phpmyadmin просто вводя запросы
[cc lang=”mysql”] mysql>
create database mailserver;
mysql>
grant all on mailserver.* to mailuser@localhost identified by ‘mailuserpasswd’;
exit[/cc]
Затем создайте таблицы в базе данных
[cc lang=”mysql”] mysql>
CREATE TABLE `virtual_domains` (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL
) ENGINE = InnoDB;
mysql>
CREATE TABLE `virtual_users` (
id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
domain_id INT(11) NOT NULL,
user VARCHAR(40) NOT NULL,
password VARCHAR(32) NOT NULL,
CONSTRAINT UNIQUE_EMAIL UNIQUE (domain_id,user),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE) ENGINE = InnoDB;
mysql>
CREATE TABLE `virtual_aliases` (
id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
domain_id INT(11) NOT NULL,
source VARCHAR(40) NOT NULL,
destination VARCHAR(80) NOT NULL,
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE = InnoDB;[/cc]
Создаём файлы конфигурации для Postfix’a с информацией о базе данных.
[cc lang=”bash”]touch /etc/postfix/mysql-virtual-mailbox-domains.cf
[/cc]
Вот с таким содержанием
[cc lang=”bash”] user = mailuser
password = mailuserpasswd
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE name=’%s'[/cc]
Этот запрос выбирает виртуальные домены (да да наш почтовый сервер будет работать на несколько доменов как реальных так и виртуальных)
Применим конфигурацию postfix
[cc lang=”bash”]postconf -e virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf[/cc]
Добавим в БД запись о первом виртуальном сервере example.com (не забываем поставить свой)
[cc lang=”mysql”] $>
mysql -p mailserver
mysql>
INSERT INTO virtual_domains (id, name) VALUES (1, ‘example.com’);
exit[/cc]
Проверим всё ли верно мы сделали
[cc lang=”bash”] postmap -q example.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf[/cc]
Появится цифра 1 – значит всё сделано правильно.
Теперь создаём пользователей, за них будет отвечать отдельная группа. создаём её
[cc lang=”bash”]$>
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /home/vmail -m
[/cc]
Примиряем изменения
[cc lang=”bash”]$>
postconf -e virtual_uid_maps=static:5000
$>
postconf -e virtual_gid_maps=static:5000[/cc]
Создадим тестовый почтовый ящик, например john@example.com с паролем johnpasswd
[cc lang=”mysql”] mysql>
INSERT INTO virtual_users (id, domain_id, user, password)
VALUES (1, 1, ‘john’, MD5(‘johnpasswd’));[/cc]
Потом создаём view в базе данных.
[cc lang=”mysql”] mysql>
CREATE VIEW view_users AS
SELECT CONCAT(virtual_users.user, ‘@’, virtual_domains.name) AS email,
virtual_users.password
FROM virtual_users
LEFT JOIN virtual_domains ON virtual_users.domain_id=virtual_domains.id;
[/cc]
Проверим результат
[cc lang=”mysql”] mysql>
SELECT * FROM view_users;
[/cc]
Вы должны увидеть это:
[cc lang=”bash”]+——————+———————————-+
| email | password |
+——————+———————————-+
| john@example.com | 14123123123243372b1cb9275e6dd |
+——————+———————————-+[/cc]
Создадим файл конфигурации для Postfix’a в котором укажем данные для работы с почтовыми ящиками наших пользователей
[cc lang=”bash”]touch /etc/postfix/mysql-virtual-mailbox-maps.cf[/cc]
С содержанием
[cc lang=”bash”] user = mailuser
password = mailuserpasswd
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM view_users WHERE email=’%s'[/cc]
Применим изменения
[cc lang=”bash”] $>
postconf -e virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
[/cc]
Проверьте результат командой
[cc lang=”bash”]postmap -q john@example.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf[/cc]
Вы должны увидеть цифру 1 если все правильно настроено.
Если вам не нужны алиасы, можете пропустить этот пункт, но я редко такое вижу на практике
они нужны для пересылки почты с одного ящика на другой, или с нескольких на один
Добавим в базу данных тестовый альяс для нашего польователя john@example.com, вся почта пришедшая на его ящик будет дополнительно пересылаться на ящик jmiller@gmail.com
[cc lang=”mysql”] INSERT INTO virtual_aliases (id, domain_id, source, destination)
VALUES (1, 1, ‘john’, ‘john@example.com’),
(2, 1, ‘john’, ‘jmiller@gmail.com’);
[/cc]
Создадим view для альясов по аналогии с view для пользователей
[cc lang=”mysql”] CREATE VIEW view_aliases AS
SELECT CONCAT(virtual_aliases.source, ‘@’, virtual_domains.name) AS email,
destination
FROM virtual_aliases
LEFT JOIN virtual_domains ON virtual_aliases.domain_id=virtual_domains.id;[/cc]
Проверим результат
[cc lang=”mysql”] SELECT * FROM view_aliases;[/cc]
Вы должны увидеть это
[cc lang=”mysql”]+——————+——————-+
| email | destination |
+——————+——————-+
| john@example.com | john@example.com |
| john@example.com | jmiller@gmail.com |
+——————+——————-+[/cc]
[cc lang=”bash”]touch /etc/postfix/mysql-virtual-alias-maps.cf[/cc]
С содержанием
[cc lang=”bash”]
user = mailuser
password = mailuserpasswd
hosts = 127.0.0.1
dbname = mailserver
query = SELECT destination FROM view_aliases WHERE email=’%s’
[/cc]
Проверим правильность настроек
[cc lang=”bash”] postmap -q john@example.com mysql:/etc/postfix/mysql-virtual-alias-maps.cf[/cc]
Вы увидите это
[cc lang=”bash”]john@example.com,jmiller@gmail.com[/cc]
[cc lang=”bash”]touch /etc/postfix/mysql-email2email.cf[/cc]
впишем в него
[cc lang=”bash”] user = mailuser
password = mailuserpasswd
hosts = 127.0.0.1
dbname = mailserver
query = SELECT email FROM view_users WHERE email=’%s'[/cc]
Запишем настройки в главный файл конфига Postfix
[cc lang=”bash”] $>
postconf -e virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf,mysql:/etc/postfix/mysql-email2email.cf
[/cc]
Выставим правильные права доступа на файлы конфигкрации почтового сервера, ведь в них хранятся пароли от базы данных
[cc lang=”bash”]
chgrp postfix /etc/postfix/mysql-*.cf
chmod u=rw,g=r,o= /etc/postfix/mysql-*.cf[/cc]
Далее настроим dovecot в качестве локального агента доставки писем, добавим в конец файла /etc/postfix/master.cf
[cc lang=”bash”] dovecot unix – n n – – pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}
[/cc]
перезапускаем postfix
[cc lang=”bash”]postfix reload[/cc]
И добавляем информацию о виртуальном транспорте в главный конфиг Postfix
[cc lang=”bash”] postconf -e virtual_transport=dovecot
postconf -e dovecot_destination_recipient_limit=1
[/cc]
Перейдем к настройкам dovecot, все файлы его конфигурации хранятся в папке /etc/dovecot, начнем настройку с файла /etc/dovecot/dovecot.conf
Найдите строку protocols и смените на
[cc lang=”bash”] protocols = imap imaps pop3 pop3s[/cc]
Так же изменяем строку disable_plaintext_auth до состояния disable_plaintext_auth = no
также меняем параметр mail_location
[cc lang=”bash”] mail_location = maildir:/home/vmail/%d/%n[/cc]
Найдите строку namespace private и измените до
[cc lang=”bash”] namespace private {
separator = .
prefix = INBOX.
inbox = yes
}
[/cc]
Перейдите к секции «auth default» и отредактируйте разрешенные механизмы аутентификации
[cc lang=”bash”] mechanisms = plain login[/cc]
В этой же секции измените
[cc lang=”bash”] passdb sql {
args = /etc/dovecot/dovecot-sql.conf
}
[/cc]
Меняем параметр userdb static
[cc lang=”bash”] userdb static {
args = uid=5000 gid=5000 home=/home/vmail/%d/%n allow_all_users=yes
}
[/cc]
Переходим к секции socket listen сдесь мы укажем файлы сокета для аутентификации dovecot
[cc lang=”bash”] socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0600
user = vmail
}
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
[/cc]
Переходим к секции protocol lda, не забудьте сменить адрес постмастера на реальный
[cc lang=”bash”] protocol lda {
log_path = /home/vmail/dovecot-deliver.log
auth_socket_path = /var/run/dovecot/auth-master
postmaster_address = postmaster@example.com
mail_plugins = cmusieve
global_script_path = /home/vmail/globalsieverc
}
[/cc]
На этом файл можно сохранить.
Далее редактируем файл /etc/dovecot/dovecot-sql.conf
Делаем как ниже
[cc lang=”bash”] driver = mysql
connect = host=127.0.0.1 dbname=mailserver user=mailuser password=mailuserpasswd
default_pass_scheme = PLAIN-MD5
password_query = SELECT email as user, password FROM view_users WHERE email=’%u’;[/cc]
Перезапускаем dovecot
[cc lang=”bash”] /etc/init.d/dovecot restart[/cc] и смотрим лог файл /var/log/mail.log, там вы должны увидеть
[cc lang=”bash”] dovecot: Dovecot v1.0.rc15 starting up
dovecot: auth-worker(default): mysql: Connected to 127.0.0.1 (mymailserver)
[/cc]
Правим права доступа к файлам конфигурации dovecot
[cc lang=”bash”] chgrp vmail /etc/dovecot/dovecot.conf
chmod g+r /etc/dovecot/dovecot.conf
[/cc]
Настроим TLS/SSL
[cc lang=”bash”] openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/dovecot.pem \
-keyout /etc/ssl/private/dovecot.pem
[/cc]
Ответьте на несколько вопросов и сертификат будет создан, не забудьте указать правльно все параметры вместо примеров привеленных ниже
[cc lang=”bash”] Generating a 1024 bit RSA private key
………++++++
……………………….++++++
writing new private key to ‘/etc/ssl/certs/dovecot.pem’
—–
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:Russia
Locality Name (eg, city) []:Russia
Organization Name (eg, company) [Internet Widgits Pty Ltd]:example.com
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:mail.example.com
Email Address []:postmaster@example.com
[/cc]
Выставим права доступа на файл
[cc lang=”bash”] chmod o= /etc/ssl/private/dovecot.pem[/cc]
Создадим еще один сертификат по аналогии с предыдущим
[cc lang=”bash”] openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/postfix.pem \
-keyout /etc/ssl/private/postfix.pem
[/cc]
Сменим права доступа
[cc lang=”bash”] chmod o= /etc/ssl/private/postfix.pem[/cc]
Вносим изменения в конфиг Postfix’a
[cc lang=”bash”] postconf -e smtpd_tls_cert_file=/etc/ssl/certs/postfix.pem
postconf -e smtpd_tls_key_file=/etc/ssl/private/postfix.pem
postconf -e smtpd_use_tls=yes
[/cc]
Теперь настроим аутентификацию SMTP, не забываем сменить примеры на реальные адреса сетей! В примере используется сеть 192.168.50.0/24 ей разрешено отправлятиь почту без SMTP авторизации.
[cc lang=”bash”] postconf -e mynetworks=192.168.50.0/24
postconf -e smtpd_sasl_type=dovecot
postconf -e smtpd_sasl_path=private/auth
postconf -e smtpd_sasl_auth_enable=yes
postconf -e smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
[/cc]
Редактируем файл /etc/postfix/main.cf изменив параметр размера почтового ящика например на 10 мегабайт
[cc lang=”bash”] mailbox_size_limit = 102400[/cc]
На этом почти всё 🙂
Перезапускаем postfix и dovecot
/etc/init.d/postfix restart
/etc/init.d/dovecot restart
Проверим, всё и хорошо
[cc lang=”bash”]postfix check[/cc]
команда должна отдать пустой результат.
Все ошибки и прочие события из жизни вашего почтовика вы можете найти в логах
[cc lang=”bash”]/var/log/mail.log
/var/log/mail.err
/var/log/mail.warn
/var/log/mail.info[/cc]
Ах забыл совсем :)) у нас же есть ещё вэб морда для почты и завётся она
Настройка Squirrelmail
[cc lang=”bash”]squirrelmail-configure[/cc]
Ответим на вопросы, введя данные, что использовали при настройке сервера
Теперь привяжем к апачу
[cc lang=”bash”]cp /etc/squirrelmail/apache.conf /etc/apache2/sites-available/squirrelmail
ln -s /etc/apache2/sites-available/squirrelmail /etc/apache2/sites-enabled/squirrelmail
a2ensite squirrelmail
[/cc]
Перезапустим апач
[cc lang=”bash”]/etc/init.d/apache2 force-reload[/cc]
Ну и всё готово 🙂
Заходим на
[cc lang=”bash”]http://ip_servera/squirrelmail[/cc]
вводим логин пароль (логин вводится целиком с доменом)
Вариант 2 более простой (postfix (smtp), sasl2 (Авторизция) cyrus-pop3d )
Стами postfix (smtp), sasl2 (Авторизция) cyrus-pop3d (POP3 демон)
[cc lang=”bash”]apt-get install postfix libsasl2-2 libsasl2-modules sasl2-bin cyrus-imapd-2.2 cyrus-pop3d-2.2 cyrus-admin-2.2[/cc]
Во время первоначальной настройки postfix укажите конфигурацию для Интернет-сайта (Internet Site).
На вопрос об имени почтового сервера-оставьте вариант по-умолчанию или укажите свой. В нашем случае это было domain.ru
Настроим сервер авторизации saslauthd на использование базы данных паролей sasldb2.
Для этого отредактируем файл /etc/default/saslauthd:
[cc lang=”bash”]START=yes
MECHANISMS=”sasldb”[/cc]
Запускаем сервис
[cc lang=”bash”]/etc/init.d/saslauthd start[/cc]
проверим работает ли он, но для начала необходимо добавить хотя бы одного пользователя.
[cc lang=”bash”]proxy:~# saslpasswd2 test
Password:
Again (for verification):[/cc]
смотрим список пользователей
[cc lang=”bash”]proxy:~# sasldblistusers2
test@proxy: userPassword[/cc]
Пробуем авторизироваться
[cc lang=”bash”]proxy:~# testsaslauthd -u test -p test[/cc]
На что получаем ответ
[cc lang=”bash”]0: OK “Success.[/cc]
У почтового сервера postfix есть одна особенность – после запуска он работает в chroot окружении, которое находится в папке /var/spool/postfix/
Учитывая то, что для авторизации пользователей postfix будет использоваться демон saslauthd, нам нужно перенести его socket в рабочую директорию нашего сервера /var/spool/postfix/. Самый простой способ сделать это заключается в монтировании в нужную папку директории с уже созданным сокетом демона saslauthd.
Делается это редактированием файла /etc/fstab.
[cc lang=”bash”]/var/run/saslauthd /var/spool/postfix/var/run/saslauthd none rw,bind 0 0[/cc]
Не забудьте поставить [Enter] после последней строки.
Создаём каталог и монтируем.
[cc lang=”bash”]mkdir -p /var/spool/postfix/var/run/saslauthd
mount /var/run/saslauthd[/cc]
Настраиваем postfix на работу с sasl авторизацией
Добавим в /etc/postfix/main.cf[cc lang=”bash”]
smtpd_sasl_local_domain =
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_sasl_authenticated_header = yes
smtpd_sasl_application_name = smtpd[/cc]
запретим отсылать почту через наш SMTP шлюз без авторизации. Для этого создадим файл /etc/postfix/sasl/smtpd.conf со следующим содержимым.
[cc lang=”bash”]pwcheck_method: saslauthd
mech_list: PLAIN LOGIN[/cc]
Перезапустим наш postfix сервер и просмотрим следующие файлы на предмет ошибок:
[cc lang=”bash”]/etc/init.d/postfix restart
tail /var/log/mail.err
tail /var/log/mail.info
tail /var/log/mail.warn
tail /var/log/mail.log[/cc]
Если все чисто, сухо и гладко – обратимся к утилите telnet, для того, чтобы подключиться к нашему серверу.
[cc lang=”bash”]root@proxy:/var/log# telnet localhost 25
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
220 krasfun ESMTP Postfix (Ubuntu)
EHLO www.ru
250-krasfun
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
quit
221 2.0.0 Bye
Connection closed by foreign host.
root@proxy:/var/log#[/cc]
Если у вас нечто похожее – продолжаем
Для того, чтобы “подружить” saslauthd и postfix необходимо выполнить следующее:
[cc lang=”bash”]adduser postfix sasl[/cc]
Cyrus – это мощный набор POP3/NNTP/IMAP и некоторых других демонов для создания полноценных сервисов работы с электронной почтой.
Отредактируем файл /etc/imapd.conf
[cc lang=”bash”]admins: cyrus
allowplaintext: yes
sasl_mech_list: PLAIN
sasl_pwcheck_method: saslauthd auxprop
sasl_auxprop_plugin: sasldb[/cc]
Обратите внимание, что cyrus так же, как и saslauthd, придется взаимодействовать с postfix, поэтому их нужно сделать доступными друг другу. Воспользуемся уже известным механизмом:
/etc/fstab :
[cc lang=”bash”]/var/run/cyrus /var/spool/postfix/var/run/cyrus none rw,bind 0 0[/cc]
создаём каталоги для cyrus.
[cc lang=”bash”]mkdir -p /var/spool/postfix/var/run/saslauthd
mkdir -p /var/spool/postfix/var/run/cyrus
mount /var/spool/postfix/var/run/saslauthd
mount /var/spool/postfix/var/run/cyrus[/cc]
Монтируем
[cc lang=”bash”]mount /var/run/cyrus[/cc]
предоставим возможность cyrus забирать почту у postfix и отпалять почту на куда угодно. Отредактируем файл /etc/postfix/main.cf:
[cc lang=”bash”]mailbox_transport = lmtp:unix:/var/run/cyrus/socket/lmtp
local_recipient_maps =[/cc]
Добавим группу и добавим в неё постфикс
[cc lang=”bash”]addgroup lmtp
adduser postfix lmtp[/cc]
Дальше 2 команды
[cc lang=”bash”]dpkg-statoverride –remove /var/run/cyrus/socket
dpkg-statoverride –force –update –add cyrus lmtp 750 /var/run/cyrus/socket[/cc]
Добавим пользователя cyrus в нашу базу учетных записей:
[cc lang=”bash”]saslpasswd2 -c cyrus[/cc]
Введите пароль, когда вас об этом попросят, и перезапустим наши демоны:
[cc lang=”bash”]/etc/init.d/postfix start
/etc/init.d/cyrus2.2 restart
/etc/init.d/saslauthd restart[/cc]
Добавим почтового пользователя например saber и создадим ему каталоги
[cc lang=”bash”]saslpasswd2 –c saber
cyradm localhost –user cyrus
localhost> cm user.saber
localhost> cm user.saber.INBOX
localhost> cm user.saber.Sent
localhost> cm user.saber.Draft
localhost> cm user.saber.Trash
[/cc]
UPD1 01.02.2013 Эта часть,что выше, устарела немного и пользователь создаётся другим путём, я дословно не помню но примерно так
[cc lang=”bash”]saslpasswd2 saber
cyradm
login cyrus
localhost> cm user.saber
localhost> cm user.saber.INBOX
localhost> cm user.saber.Sent
localhost> cm user.saber.Draft
localhost> cm user.saber.Trash
[/cc]
Вот как-то так я добалял пользователей недавно
На этом всё, можно пользоваться, рекомендую ещё настроить шифрование, но мне оно не нужно было 😉
Настройка клиента
Буду на основе Аутглюк экспресс.
Добавляем почтовый акк, в общем всё как обычно КРОМЕ
не ставим галочку
“Использовать безопасную бла бла SPA”
и ставим галочку ниже Сервер исходящей почты “проверка подлинности пользователя”
И всё можно пользоваться 🙂