Архивы: postfix

file maildir-util.c: line 268 (maildir_hash): assertion failed: (*s != ‘/’)

Поломался один из ящиков очень давно настроенного почтового сервера, вот с таким текстом

 file maildir-util.c: line 268 (maildir_hash): assertion failed: (*s != '/')

всё примерно просто, поломался файл dovecot-uidlist в корне ящика пользователя, перемещаем его куданить, перезапускаем довекот и постфикс и пробуем зайти в почту пользователя.

Посмотреть очередь postfix ( postqueue view emails )

Для этого достаточно посмотреть

postqueue -p

postfix белый лист ( postfix whitelist )

Сложно найти баланс между ложными срабатывания на спамм и спамом 🙁

Создаём файл

touch /etc/postfix/whitelist

Добавляем в него записи, можно конкретный ящик, можно все ящики домена, можно домен с под доменами.

user@examlpe.com OK
@examlpe.com OK
.example.ru OK

Теперь преобразим наш файл whitelist в индексированную базу данных, выполнив команду:

postmap /etc/postfix/whitelist

Теперь смотрим каком типом БД пользуется наш postfix

postconf | grep database_type

Возможные варианты ответа hash, btree или dbm
В зависимости от этого в секцию

smtpd_sender_restrictions

Добавляем строку

check_sender_access  hash:/etc/postfix/whitelist

Вот как это выглядит у меня (не забываем про запятые после переменных) (вместо hash пишем свой тип БД)

smtpd_sender_restrictions =
    check_sender_access  hash:/etc/postfix/whitelist,
    permit_sasl_authenticated,
    permit_mynetworks,
    reject_non_fqdn_sender,
    reject_unknown_sender_domain,
    permit

ubuntu почтовый сервер ( ubuntu mail server )

И так прижало мне сделать для себя почтовый сервер на своём сервере. раньше оно работало из коробки и я горя не знал, но тут оказалось, что надо всё делать ну чтож приступим

Во первых, задайте себе вопрос а насколько он нужен вам?

если у вас до 50ти ящиков то очень рекомендую воспользоваться почтой от гугла на своём домене, я уже писал об этом способе.

Экономия времени и нервов вам обеспечена!.

Если же вы настойчивы, то есть 2 способа, оба проделывал я на своих серверах, оба работают и не ругаются.
Очень рекомендую первый, во втором периодически выпадали глюки и приходилось пере запускать демоны.

Первый Postfix + Dovecot + MYSQL
Вариант 2 более простой (postfix (smtp), sasl2 (Авторизция) cyrus-pop3d )

Поехали
Интерпритатора будет два, обычная командная строка (bash) и mysql

bash:$>

mysql: mysql>

Также все команды будут от root (обычно я запускаю sudo mc и жму ctrl+o и так получается консоль от root)

Устанавливаем необходимые пакеты, также ставим phpmyadmin для более удобного управления базой + вэб интерфейс почты

aptitude install postfix-mysql mysql-server dovecot-pop3d dovecot-imapd openssl phpmyadmin squirrelmail

Создаём БД + таблицы можно как и из консоли, так и из phpmyadmin
Мне удобнее из phpmyadmin просто вводя запросы
phpmyadmin

 mysql>
create database mailserver;
mysql>
grant all on mailserver.* to mailuser@localhost identified by 'mailuserpasswd';
exit

Затем создайте таблицы в базе данных

 mysql>
CREATE TABLE <code>virtual_domains</code> (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL
) ENGINE = InnoDB;
mysql&gt;
CREATE TABLE <code>virtual_users</code> (
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&gt;
CREATE TABLE <code>virtual_aliases</code> (
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;

Создаём файлы конфигурации для Postfix’a с информацией о базе данных.

touch /etc/postfix/mysql-virtual-mailbox-domains.cf

Вот с таким содержанием

 user = mailuser
password = mailuserpasswd
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE name='%s'

Этот запрос выбирает виртуальные домены (да да наш почтовый сервер будет работать на несколько доменов как реальных так и виртуальных)

Применим конфигурацию postfix

postconf -e virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf

Добавим в БД запись о первом виртуальном сервере example.com (не забываем поставить свой)

 $&gt;
mysql -p mailserver
mysql&gt;
INSERT INTO virtual_domains (id, name) VALUES (1, 'example.com');
exit

Проверим всё ли верно мы сделали

 postmap -q example.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf

Появится цифра 1 — значит всё сделано правильно.

Теперь создаём пользователей, за них будет отвечать отдельная группа. создаём её

$&gt;
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /home/vmail -m

Примиряем изменения

$&gt;
postconf -e virtual_uid_maps=static:5000
$&gt;
postconf -e virtual_gid_maps=static:5000

Создадим тестовый почтовый ящик, например john@example.com с паролем johnpasswd

 mysql&gt;
INSERT INTO virtual_users (id, domain_id, user, password)
VALUES (1, 1, 'john', MD5('johnpasswd'));

Потом создаём view в базе данных.

 mysql&gt;
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;

Проверим результат

 mysql&gt;
SELECT * FROM view_users;

Вы должны увидеть это:

+------------------+----------------------------------+
| email | password |
+------------------+----------------------------------+
| john@example.com | 14123123123243372b1cb9275e6dd |
+------------------+----------------------------------+

Создадим файл конфигурации для Postfix’a в котором укажем данные для работы с почтовыми ящиками наших пользователей

touch /etc/postfix/mysql-virtual-mailbox-maps.cf

С содержанием

 user = mailuser
password = mailuserpasswd
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM view_users WHERE email='%s'

Применим изменения

 $&gt;
postconf -e virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf

Проверьте результат командой

postmap -q john@example.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf

Вы должны увидеть цифру 1 если все правильно настроено.

Если вам не нужны алиасы, можете пропустить этот пункт, но я редко такое вижу на практике

они нужны для пересылки почты с одного ящика на другой, или с нескольких на один

Добавим в базу данных тестовый альяс для нашего польователя john@example.com, вся почта пришедшая на его ящик будет дополнительно пересылаться на ящик jmiller@gmail.com

 INSERT INTO virtual_aliases (id, domain_id, source, destination)
VALUES (1, 1, 'john', 'john@example.com'),
(2, 1, 'john', 'jmiller@gmail.com');

Создадим view для альясов по аналогии с view для пользователей

 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;

Проверим результат

 SELECT * FROM view_aliases;

Вы должны увидеть это

+------------------+-------------------+
| email | destination |
+------------------+-------------------+
| john@example.com | john@example.com |
| john@example.com | jmiller@gmail.com |
+------------------+-------------------+
touch /etc/postfix/mysql-virtual-alias-maps.cf

С содержанием

user = mailuser
password = mailuserpasswd
hosts = 127.0.0.1
dbname = mailserver
query = SELECT destination FROM view_aliases WHERE email='%s'

Проверим правильность настроек

 postmap -q john@example.com mysql:/etc/postfix/mysql-virtual-alias-maps.cf

Вы увидите это

john@example.com,jmiller@gmail.com
touch /etc/postfix/mysql-email2email.cf

впишем в него

 user = mailuser
password = mailuserpasswd
hosts = 127.0.0.1
dbname = mailserver
query = SELECT email FROM view_users WHERE email='%s'

Запишем настройки в главный файл конфига Postfix

 $&gt;
postconf -e virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf,mysql:/etc/postfix/mysql-email2email.cf

Выставим правильные права доступа на файлы конфигкрации почтового сервера, ведь в них хранятся пароли от базы данных

chgrp postfix /etc/postfix/mysql-*.cf
chmod u=rw,g=r,o= /etc/postfix/mysql-*.cf

Далее настроим dovecot в качестве локального агента доставки писем, добавим в конец файла /etc/postfix/master.cf

 dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}

перезапускаем postfix

postfix reload

И добавляем информацию о виртуальном транспорте в главный конфиг Postfix

 postconf -e virtual_transport=dovecot
postconf -e dovecot_destination_recipient_limit=1

Перейдем к настройкам dovecot, все файлы его конфигурации хранятся в папке /etc/dovecot, начнем настройку с файла /etc/dovecot/dovecot.conf

Найдите строку protocols и смените на

 protocols = imap imaps pop3 pop3s

Так же изменяем строку disable_plaintext_auth до состояния disable_plaintext_auth = no

также меняем параметр mail_location

 mail_location = maildir:/home/vmail/%d/%n

Найдите строку namespace private и измените до

 namespace private {
separator = .
prefix = INBOX.
inbox = yes
}

Перейдите к секции «auth default» и отредактируйте разрешенные механизмы аутентификации

 mechanisms = plain login

В этой же секции измените

 passdb sql {
args = /etc/dovecot/dovecot-sql.conf
}

Меняем параметр userdb static

 userdb static {
args = uid=5000 gid=5000 home=/home/vmail/%d/%n allow_all_users=yes
}

Переходим к секции socket listen сдесь мы укажем файлы сокета для аутентификации dovecot

 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
}
}

Переходим к секции protocol lda, не забудьте сменить адрес постмастера на реальный

 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
}

На этом файл можно сохранить.
Далее редактируем файл /etc/dovecot/dovecot-sql.conf
Делаем как ниже

 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';

Перезапускаем dovecot

 /etc/init.d/dovecot restart

и смотрим лог файл /var/log/mail.log, там вы должны увидеть

 dovecot: Dovecot v1.0.rc15 starting up
dovecot: auth-worker(default): mysql: Connected to 127.0.0.1 (mymailserver)

Правим права доступа к файлам конфигурации dovecot

 chgrp vmail /etc/dovecot/dovecot.conf
chmod g+r /etc/dovecot/dovecot.conf

Настроим TLS/SSL

 openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/dovecot.pem \
-keyout /etc/ssl/private/dovecot.pem

Ответьте на несколько вопросов и сертификат будет создан, не забудьте указать правльно все параметры вместо примеров привеленных ниже

 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

Выставим права доступа на файл

 chmod o= /etc/ssl/private/dovecot.pem

Создадим еще один сертификат по аналогии с предыдущим

 openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/postfix.pem \
-keyout /etc/ssl/private/postfix.pem

Сменим права доступа

 chmod o= /etc/ssl/private/postfix.pem

Вносим изменения в конфиг Postfix’a

 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

Теперь настроим аутентификацию SMTP, не забываем сменить примеры на реальные адреса сетей! В примере используется сеть 192.168.50.0/24 ей разрешено отправлятиь почту без SMTP авторизации.

 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

Редактируем файл /etc/postfix/main.cf изменив параметр размера почтового ящика например на 10 мегабайт

 mailbox_size_limit = 102400

На этом почти всё 🙂
Перезапускаем postfix и dovecot
/etc/init.d/postfix restart
/etc/init.d/dovecot restart

Проверим, всё и хорошо

postfix check

команда должна отдать пустой результат.

Все ошибки и прочие события из жизни вашего почтовика вы можете найти в логах

/var/log/mail.log
/var/log/mail.err
/var/log/mail.warn
/var/log/mail.info

Ах забыл совсем :)) у нас же есть ещё вэб морда для почты и завётся она
Настройка Squirrelmail

squirrelmail-configure

Ответим на вопросы, введя данные, что использовали при настройке сервера
Теперь привяжем к апачу

cp /etc/squirrelmail/apache.conf /etc/apache2/sites-available/squirrelmail
ln -s /etc/apache2/sites-available/squirrelmail /etc/apache2/sites-enabled/squirrelmail
a2ensite squirrelmail

Перезапустим апач

/etc/init.d/apache2 force-reload

Ну и всё готово 🙂
Заходим на

http://ip_servera/squirrelmail

вводим логин пароль (логин вводится целиком с доменом)
squirrelmail

Вариант 2 более простой (postfix (smtp), sasl2 (Авторизция) cyrus-pop3d )

Стами postfix (smtp), sasl2 (Авторизция) cyrus-pop3d (POP3 демон)

apt-get install postfix libsasl2-2 libsasl2-modules sasl2-bin cyrus-imapd-2.2 cyrus-pop3d-2.2 cyrus-admin-2.2

Во время первоначальной настройки postfix укажите конфигурацию для Интернет-сайта (Internet Site).
На вопрос об имени почтового сервера-оставьте вариант по-умолчанию или укажите свой. В нашем случае это было domain.ru

Настроим сервер авторизации saslauthd на использование базы данных паролей sasldb2.
Для этого отредактируем файл /etc/default/saslauthd:

START=yes
MECHANISMS="sasldb"

Запускаем сервис

/etc/init.d/saslauthd start

проверим работает ли он, но для начала необходимо добавить хотя бы одного пользователя.

proxy:~# saslpasswd2 test
Password:
Again (for verification):

смотрим список пользователей

proxy:~# sasldblistusers2
test@proxy: userPassword

Пробуем авторизироваться

proxy:~# testsaslauthd -u test -p test

На что получаем ответ

0: OK "Success.

У почтового сервера postfix есть одна особенность — после запуска он работает в chroot окружении, которое находится в папке /var/spool/postfix/

Учитывая то, что для авторизации пользователей postfix будет использоваться демон saslauthd, нам нужно перенести его socket в рабочую директорию нашего сервера /var/spool/postfix/. Самый простой способ сделать это заключается в монтировании в нужную папку директории с уже созданным сокетом демона saslauthd.

Делается это редактированием файла /etc/fstab.

/var/run/saslauthd /var/spool/postfix/var/run/saslauthd none rw,bind 0 0

Не забудьте поставить [Enter] после последней строки.
Создаём каталог и монтируем.

mkdir -p /var/spool/postfix/var/run/saslauthd
mount /var/run/saslauthd

Настраиваем postfix на работу с sasl авторизацией
Добавим в /etc/postfix/main.cf

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

запретим отсылать почту через наш SMTP шлюз без авторизации. Для этого создадим файл /etc/postfix/sasl/smtpd.conf со следующим содержимым.

pwcheck_method: saslauthd
mech_list: PLAIN LOGIN

Перезапустим наш postfix сервер и просмотрим следующие файлы на предмет ошибок:

/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

Если все чисто, сухо и гладко — обратимся к утилите telnet, для того, чтобы подключиться к нашему серверу.

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#

Если у вас нечто похожее — продолжаем

Для того, чтобы «подружить» saslauthd и postfix необходимо выполнить следующее:

adduser postfix sasl

Cyrus — это мощный набор POP3/NNTP/IMAP и некоторых других демонов для создания полноценных сервисов работы с электронной почтой.

Отредактируем файл /etc/imapd.conf

admins: cyrus
allowplaintext: yes
sasl_mech_list: PLAIN
sasl_pwcheck_method: saslauthd auxprop
sasl_auxprop_plugin: sasldb

Обратите внимание, что cyrus так же, как и saslauthd, придется взаимодействовать с postfix, поэтому их нужно сделать доступными друг другу. Воспользуемся уже известным механизмом:
/etc/fstab :

/var/run/cyrus /var/spool/postfix/var/run/cyrus none rw,bind 0 0

создаём каталоги для cyrus.

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

Монтируем

mount /var/run/cyrus

предоставим возможность cyrus забирать почту у postfix и отпалять почту на куда угодно. Отредактируем файл /etc/postfix/main.cf:

mailbox_transport = lmtp:unix:/var/run/cyrus/socket/lmtp
local_recipient_maps =

Добавим группу и добавим в неё постфикс

addgroup lmtp
adduser postfix lmtp

Дальше 2 команды

dpkg-statoverride --remove /var/run/cyrus/socket
dpkg-statoverride --force --update --add cyrus lmtp 750 /var/run/cyrus/socket

Добавим пользователя cyrus в нашу базу учетных записей:

saslpasswd2 -c cyrus

Введите пароль, когда вас об этом попросят, и перезапустим наши демоны:

/etc/init.d/postfix start
/etc/init.d/cyrus2.2 restart
/etc/init.d/saslauthd restart

Добавим почтового пользователя например saber и создадим ему каталоги

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

UPD1 01.02.2013 Эта часть,что выше, устарела немного и пользователь создаётся другим путём, я дословно не помню но примерно так

saslpasswd2 saber

cyradm
login cyrus
localhost&gt; cm user.saber
localhost&gt; cm user.saber.INBOX
localhost&gt; cm user.saber.Sent
localhost&gt; cm user.saber.Draft
localhost&gt; cm user.saber.Trash

Вот как-то так я добалял пользователей недавно

На этом всё, можно пользоваться, рекомендую ещё настроить шифрование, но мне оно не нужно было 😉

Настройка клиента
Буду на основе Аутглюк экспресс.
Добавляем почтовый акк, в общем всё как обычно КРОМЕ
не ставим галочку
«Использовать безопасную бла бла SPA»

и ставим галочку ниже Сервер исходящей почты «проверка подлинности пользователя»
И всё можно пользоваться 🙂