пятница, 17 августа 2012 г.

Почтовый сервер на базе Postfix, Dovecot и Ubuntu 12.04 LTS


Задача: поднять почтовый сервер на базе Postfix, Dovecot 2.x и Ubuntu 12.04 LTS.

Настоящая инструкция была проверена на Ubuntu 12.04  и 12.04.1

Использованные источники:
8. man 5 master

Выполнение (старый вариант с ошибками):
I. Для начала поднимем почтовый сервер с авторизацией по паролю, пароли будут храниться в текстовом файле. Тип почтовых ящиков - maildir.
1.Установим Postfix и Dovecot:
sudo apt-get install postfix dovecot-common dovecot-imapd

Отказываемся от предложенных вариантов настроек postfix, т.е. выбираем вариант "Без конфигурации" (No configuration).
2. Создаем основной файл конфигурации Postfix:
sudo touch /etc/postfix/main.cf

3. Редактируем его:
sudo gedit /etc/postfix/main.cf

#Так наш сервер будет представляться при отправке и получении почты
smtpd_banner = $myhostname ESMTP (Ubuntu)
#Отключаем использование comsat
biff = no
#Запрещаем автоматически дополнять неполное доменное имя в адресе письма
append_dot_mydomain = no
#Указываем каталог очереди для Postfix
queue_directory = /var/spool/postfix
#Указываем имя нашего хоста
myhostname = ubuntu.myubuntu.org
# Указываем файл с превдонимами почтовых ящиков
alias_maps = hash:/etc/postfix/aliases
#Указываем, для каких доменов будем принимать почту
mydestination = localhost
#Указываем список доверенных подсетей
#mynetworks = 127.0.0.0/8
# Не будем устанавливать лимит на размер почтовых ящиков
mailbox_size_limit = 0
recipient_delimiter = +
#Указываем прослушивание на всех подсетях
inet_interfaces = all
#Указываем обязательность использование клиентами команды helo
smtpd_helo_required = yes

#Далее идет настройка ограничений для приема почты
#Принимаем всю почту от нашей доверенной подсети
smtpd_recipient_restrictions =  permit_mynetworks,  permit_sasl_authenticated, reject_unauth_destination
#Проверяем, не представились ли нами самими
#check_helo_access = hash:/etc/postfix/helo.list,
#Если отправитель письма из внешнего мира представляется, что он из нашего домена - отвергаем письмо
#check_sender_access = hash:/etc/postfix/ext_sender,
#Отвергаем письмо, если получатель не входит в нашу зону ответственности
#reject_unauth_destination = yes,
#Отклоняем письма от неизвестных доменов
#reject_unknown_sender_domain = yes,
#Отклоняем письма для неизвестных доменов
#reject_unknown_recipient_domain = yes,
#Отклоняем письма для пользователей с неполным именем домена
#reject_non_fqdn_recipient = yes,
#Отклоняем письма от отправителей с неполным именем домена
#reject_non_fqdn_sender = yes,
#Отвергаем сообщения от любого клиента, не предоставившего полностью определенное доменное имя хоста
#reject_non_fqdn_hostname = yes,
#Отвергаем сообщение, если в команде helo неправильно сформировано имя домена
#reject_invalid_hostname = yes,
#Отвергаем сообщения, если клиент представился неизвестным именем хоста
#reject_unknown_hostname = yes

4. Создаем
sudo touch /etc/postfix/helo.list
5. Редактируем
sudo gedit /etc/postfix/helo.list

Пишем:
myubuntu.org 550 Don't use my hostname
6. Прохешируем его:
sudo postmap /etc/postfix/helo.list
7. Создаем
sudo touch /etc/postfix/ext_sender
8. Редактируем
sudo gedit /etc/postfix/ext_sender
Пишем:
myubuntu.org 450 Do not use my domain in your envelope sender
9. Прохешируем его:
sudo postmap /etc/postfix/ext_sender
10. Создадим файл псевдонимов:
sudo touch /etc/postfix/aliases
11. Редактируем файл псевдонимов
sudo gedit /etc/postfix/aliases
запишем туда:
postmaster root
12. Прохешируем его:
sudo postmap /etc/postfix/aliases

   ---настройка dovecot---
13. Редактируем конфигурационный файл dovecot
sudo gedit /etc/dovecot/dovecot.conf

Пишем:
#Описываем поддерживаемые протоколы, pop3 не будем использовать
protocols = imap
#Разрешаем авторизацию в plaintext
disable_plaintext_auth = no
#Описываем логирование
# Каталог
log_path = /var/log/dovecot.err
# Формат даты и времени для регистрируемых событий
log_timestamp = "%Y-%m-%d %H:%M:%S "
#Отключаем SSL
ssl = no
#Строка приветствия при ответе сервера
login_greeting = Dovecot ready.
#Описываем тип (maildir) и местонахождения почтовых ящиков (/var/spool/mail/%d/%n) %d - имя сервера, %n - имя пользователя
mail_location = maildir:/var/spool/mail/myubuntu.org/%n
#Задаем идентификатор пользователя и группы, с которыми будет работать dovecot
mail_uid = 5000
mail_gid = 5000
mail_privileged_group = mail
valid_chroot_dirs = /var/spool/mail/
#Настраиваем вывод отладочных сообщений
auth_verbose = yes
auth_debug = yes
auth_debug_passwords = yes
#Типы допустимых вариантов аутентификации
auth_mechanisms = plain login digest-md5

#Задаем путь к файлу с паролями
passdb {
  driver = passwd-file
  # Each domain has a separate passwd-file:
  args = /etc/dovecot/pass
}
 # Для того, чтобы postfix мог использовать авторизацию через dovecot
service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    # Assuming the default Postfix user and group
    user = postfix
    group = postfix       
  }
}

15. Добавляем в систему пользователя virtual и группу virtual
sudo groupadd -g 5000 virtual
sudo useradd -g virtual -u 5000 virtual
16. Создадим каталог, где будут размещаться почтовые ящики пользователей:
sudo mkdir /var/spool/mail/myubuntu.org
sudo chown virtual:virtual  /var/spool/mail/myubuntu.org
sudo chmod 770 /var/spool/mail/myubuntu.org
17. Редактируем конфигурационный файл postfix
sudo gedit /etc/postfix/master.cf
добавляем одну! строку:
dovecot unix - n n - - pipe flags=DRhu user=virtual:virtual argv=/usr/local/libexec/dovecot/deliver -d ${recipient}
18. Редактируем конфигурационный файл postfix
sudo gedit /etc/postfix/main.cf
добавляем:
#Описываем доступ к локальным почтовым ящикам
virtual_mailbox_domains = myubuntu.org
virtual_mailbox_base = /var/spool/mail
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_minimum_uid = 100
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_alias_maps = hash:/etc/postfix/virtual
home_mailbox = Maildir/
local_recipient_maps = $virtual_mailbox_maps
#Описываем авторизацию по SMTP для клиентов не из доверенной зоны
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
#broken_sasl_auth_clients = yes

19. Создаем файлы
sudo touch /etc/postfix/vmailbox
sudo touch /etc/postfix/virtual
20. Редактируем
sudo gedit /etc/postfix/vmailbox

Пишем:
user1@myubuntu.org myubuntu.org/user1/
user2@myubuntu.org myubuntu.org/user2/

21. Редактируем файл алиасов почтовых ящиков
sudo gedit /etc/postfix/virtual

Пишем:
user3@myubuntu.org user1@myubuntu.org

22. Перечитываем файлы конфигурации
sudo postmap /etc/postfix/virtual
sudo postmap /etc/postfix/vmailbox 

23. Перезапускаем postfix:
sudo service postfix restart

24. Создаем файл, в котором будут расположены пользователи почтового сервера и их пароли:
sudo touch /etc/dovecot/pass

Далее получаем хеш для паролей пользователей:
doveadm pw -s SHA512-CRYPT -u user1@myubuntu.org

примерный результат после ввода пароля "123":
{SHA512-CRYPT}$6$7x.iFM/rgVFg7AWV$VFGPXrviBHwvvJ.mVrz/pZVroc76QaAWBtbGohL6ckubUXFeZopucICgQ.y4hrc0EpPDcbNedwKKa0o4JjOmN0

doveadm pw -s SHA512-CRYPT -u user2@myubuntu.org

примерный результат после ввода пароля "456":
{SHA512-CRYPT}$6$AV5kfwlyUPSjOrN.$6tv4iKIqWrgpVQKwy4pl09p4eEvrYv4ttk1rSErhS48XwFKQb/qUCwFIBswTjc/OxDQX.vQLOGZ.2FSaySbmu/

25. Записываем полученные хеши в /etc/dovecot/pass:
sudo gedit /etc/dovecot/pass

Пишем две! строки:
user1:{SHA512-CRYPT}$6$7x.iFM/rgVFg7AWV$VFGPXrviBHwvvJ.mVrz/pZVroc76QaAWBtbGohL6ckubUXFeZopucICgQ.y4hrc0EpPDcbNedwKKa0o4JjOmN0
user2:{SHA512-CRYPT}$6$AV5kfwlyUPSjOrN.$6tv4iKIqWrgpVQKwy4pl09p4eEvrYv4ttk1rSErhS48XwFKQb/qUCwFIBswTjc/OxDQX.vQLOGZ.2FSaySbmu/

26. Настройка завершена. Приведу получившиеся файлы конфигурации Postfix и Dovecot:
/etc/postfix/main.cf :
#Так наш сервер будет представляться при отправке и получении почты
smtpd_banner = $myhostname ESMTP (Ubuntu)
#Отключаем использование comsat
biff = no
#Запрещаем автоматически дополнять неполное доменное имя в адресе письма
append_dot_mydomain = no
#Указываем имя нашего хоста
myhostname = ubuntu.myubuntu.org
# Указываем файл с превдонимами почтовых ящиков
alias_maps = hash:/etc/postfix/aliases
#Указываем, для каких доменов будем принимать почту
mydestination = localhost
# Не будем устанавливать лимит на размер почтовых ящиков
mailbox_size_limit = 0
recipient_delimiter = +
#Указываем прослушивание на всех подсетях
inet_interfaces = all
#Указываем обязательность использование клиентами команды helo
smtpd_helo_required = yes
#Описываем доступ к локальным почтовым ящикам
virtual_mailbox_domains = myubuntu.org
virtual_mailbox_base = /var/spool/mail
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_minimum_uid = 100
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_alias_maps = hash:/etc/postfix/virtual
home_mailbox = Maildir/
local_recipient_maps = $virtual_mailbox_maps
#Описываем авторизацию по SMTP для клиентов не из доверенной зоны
smtpd_sasl_type = dovecot
smtpd_sasl_auth_enable = yes
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
#broken_sasl_auth_clients = yes
#Указываем каталог очереди для Postfix
queue_directory = /var/spool/postfix
smtpd_recipient_restrictions =  permit_mynetworks,  permit_sasl_authenticated, reject_unauth_destination

/etc/postfix/master.cf :

# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
#
smtp      inet  n       -       -       -       -       smtpd
#628      inet  n       -       -       -       -       qmqpd
pickup    fifo  n       -       -       60      1       pickup
cleanup   unix  n       -       -       -       0       cleanup
qmgr      fifo  n       -       n       300     1       qmgr
#qmgr     fifo  n       -       n       300     1       oqmgr
tlsmgr    unix  -       -       -       1000?   1       tlsmgr
rewrite   unix  -       -       -       -       -       trivial-rewrite
bounce    unix  -       -       -       -       0       bounce
defer     unix  -       -       -       -       0       bounce
trace     unix  -       -       -       -       0       bounce
verify    unix  -       -       -       -       1       verify
flush     unix  n       -       -       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       -       -       -       smtp
relay     unix  -       -       -       -       -       smtp
#       -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
showq     unix  n       -       -       -       -       showq
error     unix  -       -       -       -       -       error
retry     unix  -       -       -       -       -       error
discard   unix  -       -       -       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       -       -       -       lmtp
anvil     unix  -       -       -       -       1       anvil
scache    unix  -       -       -       -       1       scache
maildrop  unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
uucp      unix  -       n       n       -       -       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
ifmail    unix  -       n       n       -       -       pipe
  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp     unix  -       n       n       -       -       pipe
  flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix    -    n    n    -    2    pipe
  flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
mailman   unix  -       n       n       -       -       pipe
  flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py
  ${nexthop} ${user}

dovecot unix - n n - - pipe flags=DRhu user=virtual:virtual argv=/usr/local/libexec/dovecot/deliver -d ${recipient}

/etc/dovecot/dovecot.conf :

#Описываем поддерживаемые протоколы, pop3 не будем использовать
protocols = imap
#Разрешаем авторизацию в plaintext
disable_plaintext_auth = no
#Описываем логирование
# Каталог
log_path = /var/log/dovecot.err
# Формат даты и времени для регистрируемых событий
log_timestamp = "%Y-%m-%d %H:%M:%S "
#Отключаем SSL
ssl = no
#Строка приветствия при ответе сервера
login_greeting = Dovecot ready.
#Описываем тип (maildir) и местонахождения почтовых ящиков (/var/spool/mail/%d/%n) %d - имя сервера, %n - имя пользователя
mail_location = maildir:/var/spool/mail/myubuntu.org/%n
#Задаем идентификатор пользователя и группы, с которыми будет работать dovecot
mail_uid = 5000
mail_gid = 5000
mail_privileged_group = mail
valid_chroot_dirs = /var/spool/mail/
#Настраиваем вывод отладочных сообщений
auth_verbose = yes
auth_debug = yes
auth_debug_passwords = yes
#Типы допустимых вариантов аутентификации
auth_mechanisms = plain login digest-md5
#Задаем путь к файлу с паролями
passdb {
  driver = passwd-file
  # Each domain has a separate passwd-file:
  args = /etc/dovecot/pass
}
service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    # Assuming the default Postfix user and group
    user = postfix
    group = postfix       
  }
  }

27. Проверку конфигурации dovecot можно выполнить командой doveconf -a . Если выводится данные конфигурации dovecot, значит все в норме. В противном случае будет выделено сообщение с указанием ошибки.
Для проверки можно попробовать подключиться через telnet:
для проверки postfix:
telnet localhost smtp
В результате должно появиться примерно следующее:
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 имя хоста ESMTP (Ubuntu)

Для проверки dovecot:
telnet localhost imap
В результате должно появиться примерно следующее:
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
* OK [CAPABILITY] IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERALS ID ENABLE IDLE AUTH=PLAIN AUTH=LOGIN AUTH=DIGEST-MD5] Dovecot ready.

28. Для проверки на реальном клиенте установим Mozilla Thunderbird:
sudo apt-get install thunderbird

При добавлении в Thunderbird учетной записи, к примеру, user1 задаем следующие данные:
Your Name: user1
Email address: user1@myubuntu.org
Password: пароль
Incoming: IMAP, Server Hostname: имя нашего хоста (к примеру, localhost), Port: 143, SSL: None, Authentification: normal password
Outcoming: SMTP, Server Hostname: имя нашего хоста (к примеру, localhost), Port: 25, SSL: None, Authentification: normal password
Далее можно попробовать через Thunderbird написать письмо по адресу user2@myubuntu.org или user3@myubuntu.org (в этом случае письмо должно прийти пользователю user1, т.к. user3@myubuntu.org есть псевдоним для user1@myubuntu.org)

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

1. Устанавливаем MySQL и др.
sudo apt-get install mysql-server mysql-client postfix-mysql dovecot-mysql sasl2-bin

После установки MySQL задайте пароль для суперпользователя (root) MySQL.
2. Входим в MySQL
mysql -u root -p

Создаем базу данных
CREATE DATABASE mail;
USE mail;

Внимание! Далее будет использоваться пользователь mail_admin и его пароль mail_admin_password для доступа к базе данных почтовых аккаунтов в MySQL. Вместо mail_admin и mail_admin_password Вы можете задать свои значения.

GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';
FLUSH PRIVILEGES;
CREATE TABLE domains ( domain varchar(50) NOT NULL, PRIMARY KEY (domain) );
CREATE TABLE forwardings ( source varchar(80) NOT NULL, destination TEXT NOT NULL, PRIMARY KEY (source) );
CREATE TABLE users ( user varchar(80) NOT NULL, email varchar(80) NOT NULL, password varchar(20) NOT NULL, PRIMARY KEY (email) );
CREATE TABLE transport ( domain varchar(128) NOT NULL default '', transport varchar(128) NOT NULL default '', UNIQUE KEY domain (domain) );
quit

3. Проверим, что MySQL связана с localhost (127.0.0.1). Для этого откроем файл /etc/mysql/my.cnf и найдем следующую строку:
bind-address = 127.0.0.1

4. Начинаем настройку Postfix для работы с MySQL. Создаем конфигурационные файлы:
файл для работы с почтовыми доменами Postfix:
sudo touch /etc/postfix/mysql-virtual_domains.cf
sudo gedit /etc/postfix/mysql-virtual_domains.cf
пишем туда следующее:
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT domain AS virtual FROM domains WHERE domain = '%s'
hosts = 127.0.0.1       

файл для настройки пересылки почты с ящика на ящик:
sudo touch /etc/postfix/mysql-virtual_forwardings.cf
sudo gedit /etc/postfix/mysql-virtual_forwardings.cf

пишем туда следующее:
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT destination FROM forwardings WHERE source = '%s'
hosts = 127.0.0.1

файл для работы с почтовыми аккаунтами:
sudo touch /etc/postfix/mysql-virtual_mailboxes.cf 
sudo gedit /etc/postfix/mysql-virtual_mailboxes.cf

пишем туда следующее:
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT CONCAT( SUBSTRING_INDEX(email, '@', -1), '/' , SUBSTRING_INDEX(email, '@', 1), '/' ) FROM users WHERE email = '%s'
hosts = 127.0.0.1

вспомогательный файл для виртуального отображения почты:
sudo touch /etc/postfix/mysql-virtual_email2email.cf 
sudo gedit /etc/postfix/mysql-virtual_email2email.cf 

пишем туда следующее:
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT email FROM users WHERE email = '%s'
hosts = 127.0.0.1

5. Установим нужные права и владельца на только что созданные файлы:
sudo chmod o= /etc/postfix/mysql-virtual_*.cf
sudo chgrp postfix /etc/postfix/mysql-virtual_*.cf  

6.
Редактируем файл /etc/postfix/main.cf:
sudo gedit /etc/postfix/main.cf
закомментируем строки:
virtual_mailbox_domains = myubuntu.org
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_alias_maps = hash:/etc/postfix/virtual

и добавим:
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf

proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps

7. Настройка saslauthd для доступа к MySQL.
sudo mkdir -p /var/spool/postfix/var/run/saslauthd
sudo gedit /etc/default/saslauthd

пишем туда следующее:
START=yes
DESC="SASL Authentication Daemon"
NAME="saslauthd"
MECHANISMS="pam"
MECH_OPTIONS=""
THREADS=5
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"

8. Создаем файл и редактируем его
sudo touch /etc/pam.d/smtp 
sudo gedit /etc/pam.d/smtp 

пишем туда следующее:
auth required pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=user passwdcolumn=password crypt=1
account sufficient pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=user passwdcolumn=password crypt=1

9. Создаем файл и редактируем его
sudo touch /etc/postfix/sasl/smtpd.conf
sudo gedit /etc/postfix/sasl/smtpd.conf  

пишем туда следующее:
pwcheck_method: saslauthd
mech_list: plain login
allow_plaintext: true
auxprop_plugin: mysql
sql_hostnames: 127.0.0.1
sql_user: mail_admin
sql_passwd: mail_admin_password
sql_database: mail
sql_select: SELECT password FROM users WHERE user = '%u'

10.  
sudo chmod o= /etc/pam.d/smtp
sudo chmod o= /etc/postfix/sasl/smtpd.conf 

10.1
sudo gedit /etc/postfix/master.cf
 вместо
dovecot unix - n n - - pipe flags=DRhu user=virtual:virtual argv=/usr/local/libexec/dovecot/deliver -d ${recipient}

пишем
dovecot unix - n n - - pipe flags=DRhu user=virtual:virtual argv=/usr/lib/dovecot/deliver -d ${recipient}

11. Добавляем пользователя
sudo adduser postfix sasl

Перезапускаем
postfix и saslauthd
sudo service postfix restart
sudo service saslauthd restart

12.  Настройка dovecot.
sudo gedit /etc/dovecot/dovecot.conf
закомментируем строки
passdb {
 driver = passwd-file
 Each domain has a separate passwd-file:
 args = /etc/dovecot/pass
}

и добавим
passdb {
 driver = sql  
 args = /etc/dovecot/dovecot-sql.conf
}
service auth {
  unix_listener auth-userdb {
    mode = 0660
    user = virtual
    group = virtual
  }
}

 13.
sudo gedit /etc/dovecot/dovecot-sql.conf

driver = mysql
connect = host=127.0.0.1 dbname=mail user=mail_admin password=mail_admin_password
default_pass_scheme = CRYPT
password_query = SELECT email AS user , password FROM users WHERE (user = '%u') or (email = '%u');

14. -

15. Перезапускаем Dovecot
sudo service dovecot restart

16.Настройка почтовых доменов и аккаунтов. Создадим в базе данных домен myubuntu.org и два почтовых ящика: user1@myubuntu.org и user2@myubuntu.org
mysql -u root -p
USE mail;
INSERT INTO domains (domain) VALUES ('myubuntu.org');
INSERT INTO users (user, email, password) VALUES ('
user1', 'user1@myubuntu.org', ENCRYPT('user1_password')); 
INSERT INTO users (user, email, password) VALUES ('user2', 'user2@myubuntu.org', ENCRYPT('user2_password'));
quit 

17. Теперь прикрутим SSL. Сначала сгенерируем сертификат. Пусть он будет лежать в /etc/dovecot. Итак:
cd /etc/dovecot
openssl req -new -outform PEM -out myubuntu.cert -newkey rsa:2048 -nodes -keyout myubuntu.key -keyform PEM -days 365 -x509

,где
365 - количество дней, в течение которых действителен сертификат.

В итоге в каталоге /etc/dovecot будет создан сертификат myubuntu.cert и ключ
myubuntu.key

18. sudo chmod o= /etc/dovecot/myubuntu.key
19. Изменим конфигурационный файл dovecot:
sudo gedit /etc/dovecot/dovecot.conf
вместо
#Отключаем SSL
ssl =no
пишем
#Включаем SSL
ssl = yes
ssl_cert =< /etc/dovecot/myubuntu.cert
ssl_key =< /etc/dovecot/myubuntu.key

и еще вместо
protocols = imap
пишем
protocols = imaps
для того, чтобы соединение шло только через ssl
20. Изменим конфигурационный файл postfix:
gedit /etc/postfix/master.cf
добавим
submission inet n - - - - smtpd
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_sasl_local_domain=$myhostname
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o smtpd_sender_login_maps=hash:/etc/postfix/virtual
  -o smtpd_sender_restrictions=reject_sender_login_mismatch
  -o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject

21. Перезупаскаем postfix, saslauthd и dovecot:
sudo service saslauthd restart
sudo service dovecot restart
sudo service postfix restart

22. В Thunderbird изменяем настройки аккаунта: Edit > Account settings... >  Server Settings > Connection Security: SSL/TLS
23. После этого Thunderbird предложит принять сертификат.

24. Теперь последнее - сделаем так, чтобы postfix тоже использовал шифрование. Редактируем файл конфигурации postfix:
sudo gedit /etc/postfix/master.cf

раскомментируем строки

#smtps inet n - n - - smtpd
# -o syslog_name=postfix/smtps
#-o smtpd_tls_wrappermode=yes
#-o smtpd_sasl_auth_enable=yes

25. Далее правим /etc/postfix/main.cf:
sudo gedit /etc/postfix/main.cf

В конец файла добавляем

smtp_use_tls = yes
smtpd_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_key_file = /etc/dovecot/myubuntu.key
smtpd_tls_cert_file = /etc/dovecot/myubuntu.cert
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 1s
tls_random_source = dev:/dev/urandom

, где myubuntu.key и myubuntu.cert - те же сертификат и ключ, которые использует dovecot.

26. Перезапускаем postfix:
sudo service postfix restart

27. В Thunderbird изменяем настройки SMTP-сервера: Edit > Account settings... > Outgoing server (SMTP) > Edit > Connection Security: STARTTLS

Конец. Если настоящая инструкция Вам помогла, пожалуйста, напишите об этом в комментарии. Ваши предложения и замечания также помогут в ее совершенствовании.



Выполнение (новый проверенный вариант от 18.01.2014):
Это предварительная рабочая версия. В самое ближайшее время оформлю и допишу пояснения.
1.       После установки Ubuntu Server 12.04.3 LTS выполним обновление пакетов
sudo apt-get update
sudo apt-get upgrade
2.       Устанавливаем Postfix, Dovecot, MySQL и другие необходимые пакеты
sudo apt-get install postfix dovecot-common dovecot-imapd mysql-server mysql-client postfix-mysql dovecot-mysql sasl2-bin
В процессе установки MySQL задаем пароль root в MySQL: sqlrootpass
В процессе установки Postfix выбираем тип конфигурации «no configuration» (без конфигурации)
3.       Подключаемся к MySQL
mysql -u root p
и создаем базу данных, в которой будут храниться учетные записи почтовых аккаунтов
CREATE DATABASE mail;
USE mail;
Внимание! Далее будет использоваться пользователь mail_admin и его пароль mail_admin_password для доступа к базе данных почтовых аккаунтов в MySQL. Вместо mail_admin и mail_admin_password Вы можете задать свои значения.
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';
FLUSH PRIVILEGES;
создаем таблицу доменов
CREATE TABLE domains ( domain varchar(50) NOT NULL, PRIMARY KEY (domain) );
Создаем таблицу …
CREATE TABLE forwardings ( source varchar(80) NOT NULL, destination TEXT NOT NULL, PRIMARY KEY (source) );
Создаем таблицу для пользователей
CREATE TABLE users ( user varchar(80) NOT NULL, email varchar(80) NOT NULL, password varchar(20) NOT NULL, PRIMARY KEY (email) );
CREATE TABLE transport ( domain varchar(128) NOT NULL default '', transport varchar(128) NOT NULL default '', UNIQUE KEY domain (domain) );
quit

4.       Проверим, что MySQL связана с localhost (127.0.0.1). Для найдем в файле /etc/mysql/my.cnf  строку bind-address            = 127.0.0.1
grep 'bind-address' /etc/mysql/my.cnf
в результате выполнения команды на экран должно быть выведено
bind-address            = 127.0.0.1
5.       Создаем группу virtual и пользователя virtual, входящего в эту группу.
sudo groupadd -g 5000 virtual
sudo useradd -g virtual -u 5000 virtual
6.       Создадим каталог, где будут размещаться почтовые ящики:
sudo mkdir /var/spool/mail/myubuntu.org
сменим имя и группу владельца созданной директории на virtual:virtual
sudo chown virtual:virtual  /var/spool/mail/myubuntu.org
дадим владельцу и его группе полные права на каталог, а другим все запретим
sudo chmod 770 /var/spool/mail/myubuntu.org
Начинаем конфигурировать Postfix

7.       Создаем конфигурационный файл для доступа к почтовым доменам в базе данных MySQL
sudo nano /etc/postfix/mysql-virtual_domains.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT domain AS virtual FROM domains WHERE domain = '%s'
hosts = 127.0.0.1
8.   Создаем конфигурационный файл для определения автоматической пересылки писем с ящика на ящик
sudo nano /etc/postfix/mysql-virtual_forwardings.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT destination FROM forwardings WHERE source = '%s'
hosts = 127.0.0.1
8.   Создаем конфигурационный файл для доступа к почтовым аккаунтам в базе данных MySQL
sudo nano /etc/postfix/mysql-virtual_mailboxes.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT CONCAT( SUBSTRING_INDEX(email, '@', -1), '/' , SUBSTRING_INDEX(email, '@', 1), '/' ) FROM users WHERE email = '%s'
hosts = 127.0.0.1
10.   Создаем конфигурационный файл для виртуального отображения почты
sudo nano /etc/postfix/mysql-virtual_email2email.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT email FROM users WHERE email = '%s'
hosts = 127.0.0.1
11.   Владельцем данных конфигурационных файлов должен быть root, группой владельца - postfix
sudo chown root /etc/postfix/mysql-virtual_*.cf
sudo chgrp postfix /etc/postfix/mysql-virtual_*.cf
12.   Редактируем конфигурационный файл главного модуля main
sudo nano /etc/postfix/main.cf
Пишем туда следующее:
#Так наш сервер будет представляться при отправке и получении почты
smtpd_banner = $myhostname ESMTP (Ubuntu)
#Отключаем использование comsat
biff = no
#Запрещаем автоматически дополнять неполное доменное имя в адресе письма
append_dot_mydomain = no
#Указываем имя нашего хоста
myhostname = ubuntu.myubuntu.org
# Указываем файл с псевдонимами почтовых ящиков
alias_maps = hash:/etc/postfix/aliases
#Указываем, для каких доменов будем принимать почту
mydestination = localhost
# Не будем ограничивать размер почтовых ящиков
mailbox_size_limit = 0
recipient_delimiter = +
#Указываем прослушивание на всех сетевых интерфейсах
inet_interfaces = all
#Указываем обязательность использование клиентами команды helo
smtpd_helo_required = yes
#Описываем доступ доменам, почтовым ящикам и т.д.
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf
virtual_mailbox_base = /var/spool/mail
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf
virtual_minimum_uid = 100
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
home_mailbox = Maildir/
local_recipient_maps = $virtual_mailbox_maps
#Описываем авторизацию по SMTP для клиентов не из доверенной зоны
smtpd_sasl_type = dovecot
smtpd_sasl_auth_enable = yes
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
#broken_sasl_auth_clients = yes
#Указываем каталог очереди для Postfix
queue_directory = /var/spool/postfix
smtpd_recipient_restrictions =  permit_mynetworks,  permit_sasl_authenticated, reject_unauth_destination
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps  $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps
smtp_use_tls = yes
smtpd_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_key_file = /etc/dovecot/myubuntu.key
smtpd_tls_cert_file = /etc/dovecot/myubuntu.cert
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 1s
tls_random_source = dev:/dev/urandom
13.       Задаем сообщение, которое будет выводить Postfix в случае, если отправитель будет представляться именем нашего сервера
sudo nano /etc/postfix/helo.list
myubuntu.org 550 Don't use my hostname
прохешируем
sudo postmap /etc/postfix/helo.list
14.       Задаем сообщение, которое будет выводить Postfix в случае, если отправитель извне будет говорить, что он из нашей сети
sudo nano /etc/postfix/ext_sender
myubuntu.org 450 Do not use my domain in your envelope sender
прохешируем
sudo postmap /etc/postfix/ext_sender
15.   Настраиваем демон saslauthd для взаимодействия с Postfix
sudo mkdir -p /var/spool/postfix/var/run/saslauthd
sudo nano /etc/default/saslauthd
необходимо проверить, чтобы были закомментированы все строки, и написать следующее:
START=yes
DESC="SASL Authentication Daemon"
NAME="saslauthd"
MECHANISMS="pam"
MECH_OPTIONS=""
THREADS=5
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"
16.   Настраиваем pam-аутентификацию
sudo nano /etc/pam.d/smtp
Пишем туда следующее:
auth required pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=user passwdcolumn=password crypt=1
account sufficient pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=user passwdcolumn=password crypt=1
17.   Настраиваем Postfix для взаимодействия с saslauthd
sudo nano /etc/postfix/sasl/smtpd.conf
Пишем туда следующее:
pwcheck_method: saslauthd
mech_list: plain login
allow_plaintext: true
auxprop_plugin: mysql
sql_hostnames: 127.0.0.1
sql_user: mail_admin
sql_passwd: mail_admin_password
sql_database: mail
sql_select: SELECT password FROM users WHERE user = '%u'
18.   Владельцем данных файлов должен быть root
sudo chown root /etc/pam.d/smtp /etc/postfix/sasl/smtpd.conf
19.   Редактируем конфигурационный файл Postfix
sudo nano /etc/postfix/master.cf
Добавляем следующие строки
dovecot unix - n n - - pipe flags=DRhu user=virtual:virtual argv=/usr/lib/dovecot/deliver -d ${recipient}
submission inet n - - - - smtpd
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_sasl_local_domain=$myhostname
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o smtpd_sender_login_maps=hash:/etc/postfix/virtual
  -o smtpd_sender_restrictions=reject_sender_login_mismatch
  -o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject
smtps inet n - n - - smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
20.   Добавляем пользователя postfix в группу sasl
sudo adduser postfix sasl
21.   Конфигурируем Dovecot
sudo nano /etc/dovecot/dovecot.conf
Нужно убедится в том, что все строки закомментированы и добавить следующее
!include_try /usr/share/dovecot/protocols.d/*.protocol
#
Разрешаем авторизацию в plaintext
disable_plaintext_auth = no
# Журнал будем писать в файл /var/log/dovecot.err
log_path = /var/log/dovecot.err
# Формат даты и времени для регистрируемых событий
log_timestamp = "%Y-%m-%d %H:%M:%S "
#Включаем SSL
ssl = yes
ssl_cert =< /etc/dovecot/myubuntu.cert
ssl_key =< /etc/dovecot/myubuntu.key
#Строка приветствия при ответе сервера
login_greeting = Dovecot ready.
#Описываем тип (maildir) и местонахождения почтовых ящиков (/var/spool/mail/%d/%n) %d - имя сервера, %n - имя пользователя
mail_location = maildir:/var/spool/mail/%d/%n
#Задаем идентификатор пользователя и группы, с которыми будет работать dovecot
mail_uid = 5000
mail_gid = 5000
mail_privileged_group = mail
valid_chroot_dirs = /var/spool/mail/
#Настраиваем вывод отладочных сообщений
auth_verbose = yes
auth_debug = yes
auth_debug_passwords = yes
#Типы допустимых вариантов аутентификации
auth_mechanisms = plain login digest-md5
#Задаем параметры аутентификации
passdb {
 driver = sql 
 args = /etc/dovecot/dovecot-sql.conf
}
service auth {
  unix_listener auth-userdb {
    mode = 0660
    user = virtual
    group = virtual
  }
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    # Assuming the default Postfix user and group
    user = postfix
    group = postfix      
  }
}
service imap-login { 
inet_listener imap { 
port = 0
 }
inet_listener imaps { 
port = 993
ssl = yes
}
}
22.   Настраиваем параметры соединения с базой данных MySQL
sudo nano /etc/dovecot/dovecot-sql.conf
Пишем туда следующее:
driver = mysql
connect = host=127.0.0.1 dbname=mail user=mail_admin password=mail_admin_password
default_pass_scheme = CRYPT
password_query = SELECT email AS user , password FROM users WHERE (user = '%u') or (email = '%u');
23.   Проверяем конфигурацию Dovecot
dovecot -a
24.   Создадим в базе данных MySQL почтовый домен и два пользователя
mysql -u root -p
USE mail;
INSERT INTO domains (domain) VALUES ('myubuntu.org');
INSERT INTO users (user, email, password) VALUES ('user1', 'user1@myubuntu.org', ENCRYPT('user1_password'));
INSERT INTO users (user, email, password) VALUES ('user2', 'user2@myubuntu.org', ENCRYPT('user2_password'));
quit
25.   Создадим сертификат и ключ для SSL
cd /etc/dovecot
sudo openssl req -new -outform PEM -out myubuntu.cert -newkey rsa:2048 -nodes -keyout myubuntu.key -keyform PEM -days 365 -x509
В итоге в каталоге /etc/dovecot будет создан сертификат myubuntu.cert и ключ 
myubuntu.key
26.   Владельцем ключа должен быть root
sudo chown root /etc/dovecot/myubuntu.key
27.   Перезапускаем saslauthd, dovecot и postfix
sudo service saslauthd restart
sudo service dovecot restart
sudo service postfix restart
в Thunderbird настройки:
imap порт 993 имя пользователя user1 SSL/TLS обычный пароль
smtp порт 465 имя пользователя user1 SSL/TLS обычный пароль



В процессе возникали следующие ошибки:

1. При выполнении команды telnet localhost smtp в /var/log/mail.log появляется следующее:
Aug 22 14:14:58 ubuntu postfix/smtpd[3095]: connect from localhost[127.0.0.1]
Aug 22 14:14:58 ubuntu postfix/smtpd[3095]: warning: SASL: Connect to private/auth failed: No such file or directory (или Connection refused)
Aug 22 14:14:58 ubuntu postfix/smtpd[3095]: fatal: no SASL authentication mechanisms
Aug 22 14:14:59 ubuntu postfix/master[3089]: warning: process /usr/lib/postfix/smtpd pid 3095 exit status 1

Это говорит о том, что dovecot не создает сокет /var/spool/postfix/private/auth , используя который postfix должен осуществлять авторизацию, и не слушает его.
Решение: в файле конфигурации dovecot /etc/dovecot/dovecot.conf писать не так
socket listen {
client {
path = /var/spool/postfix/private/auth
mode = 0666
user = postfix
group = postfix
}
}

, а так:
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix       
}
}

2. При попытке отправки сообщения через Thunderbird в /var/log/mail.log появляется следующее:
ubuntu postfix/trivial-rewrite[3223]: warning: do not list domain myubuntu.org in BOTH mydestination and virtual_mailbox_domains

postfix ругается на то, что в файле /etc/postfix/main.cf доменное имя myubuntu.org прописано сразу в двух параметрах: mydestination и virtual_mailbox_domains
Решение: в файле конфигурации postfix /etc/postfix/main.cf в параметре mydestination убрать домен myubuntu.org (у Вас он другой).
3. После отправки сообщения через  Thunderbird к адресату оно не доходит, а в /var/log/dovecot.err пишется следующее:
lda: Error: userdb lookup: connect(/var/run/dovecot/auth-userdb) failed: Permission denied (euid=5000(virtual) egid=5000(virtual) missing +r perm: /var/run/dovecot/auth-userdb, dir owned by 0:0 mode=0755)

Сокет /var/run/dovecot/auth-userdb имеет владельца root и группу root, права srw-rw----, поэтому пользователь virtual не имеет доступа к сокету.
Решение: для того, чтобы владельцем /var/run/dovecot/auth-userdb был virtual, в конфигурационном файле /etc/dovecot/dovecot.conf добавим следующее:
service auth {
  unix_listener auth-userdb {
    mode = 0660
    user = virtual
    group = virtual
  }
}

Немного теории.
В файле /etc/postfix/main.cf  указан параетр  virtual_transport = dovecot . Сам параметр virtual_transport используется для указания того, что будет использоваться в качестве транспорта доставки почты по умолчанию. Значение dovecot указывает на строки в файле /etc/postfix/master.cf, а именно:
dovecot unix - n n - - pipe flags=DRhu user=virtual:virtual argv=/usr/lib/dovecot/deliver -d ${recipient}
, где
dovecot - имя сервиса
unix - тип службы: данная служба прослушивает сокет UNIX и доступна только для локальных клиентов
- - пустое значение параметра private: будет ли для службы ограничен доступ к почтовой системе. Т.к. по умолчанию значение параметра YES, доступ будет ограничен.
n - значение параметра unpriv (unprivileged): указывает, работает служба с правами суперпользователя или с правами владельца postfix. Значение по умолчанию YES.
n - значение параметра chroot: указывает, будет ли служба ограничена каталогом queue_directory, который прописывается в /etc/postfix/main.cf . Значение по умолчанию YES.
- - пустое значение параметра wakeup: автоматическое пробуждение службы после заданного количества секунд. Пробуждение осуществляется путем подключения к службе и отправки wake up запроса. Значение по умолчанию 0, т.е. автоматическое пробуждение отключено.
- - пустое значение параметра maxproc: максимальное количество процессов, которые могут обращаться к службе одновременно. Значение по умолчанию 100.
pipe flags=DRhu user=virtual:virtual argv=/usr/lib/dovecot/deliver -d ${recipient} - значение параметра command + args : команда, которая будет выполнена. Имя команды указывается относительно каталога демона postfix, который можно задать с помощью параметра daemon_directory. Флаги:
D - запускать службу под контролем команды, указанной в параметре debugger_command в файле main.cf .
остальное смотреть в мануалах к службам.

Если данная инструкция оказалась полезной для вас, напишите, пожалуйста, об этом в комментарии.

61 комментарий:

  1. Что-то замечательное :) Буду пробовать :)
    А то у меня чего-то авторизация не хочет появляться в опциях smtp auth...

    Сразу в глаза бросилось, что параметр
    #Описываем авторизацию по SMTP для клиентов не из доверенной зоны
    smtpd_sasl_auth_enable = no

    Указан в двух местах как yes и no (победил yes, но можно перепутать).

    ОтветитьУдалить
  2. Пока не поставил
    dovecot-imapd

    Не было файла
    root@maria-laptop:/etc# ls /usr/lib/dovecot/imap
    /usr/lib/dovecot/imap

    И, соответственно:
    dovecot -F
    Fatal: service(imap) access(/usr/lib/dovecot/imap) failed: No such file or directory

    ОтветитьУдалить
    Ответы
    1. Благодарю. Внес исправления.

      Удалить
  3. В месте, где ставим saslauthd - в ubuntu 12.04 на самом деле
    apt-get install sasl2-bin
    Чтение списков пакетов… Готово
    Построение дерева зависимостей
    Чтение информации о состоянии… Готово
    Будут установлены следующие дополнительные пакеты:
    db-util db5.1-util
    НОВЫЕ пакеты, которые будут установлены:
    db-util db5.1-util sasl2-bin

    ОтветитьУдалить
  4. Добрый день, начал прикручивать SSL? выдает ошибку!
    а вообще статья супер)

    Nov 7 15:13:14 mail postfix/smtps/smtpd[9830]: connect from unknown[192.168.100.81]
    Nov 7 15:13:14 mail postfix/smtps/smtpd[9830]: Anonymous TLS connection established fr
    om unknown[192.168.100.81]: TLSv1 with cipher AES128-SHA (128/128 bits)
    Nov 7 15:13:14 mail postfix/smtps/smtpd[9830]: NOQUEUE: reject: RCPT from unknown[192.
    168.100.81]: 554 5.7.1 : Client host rejected: Access denied;
    from= to= proto=ESMTP helo=
    Nov 7 15:13:14 mail postfix/smtps/smtpd[9830]: disconnect from unknown[192...

    ОтветитьУдалить
  5. Доброго времени. Огромная благодарность за статью! Все супер и не так сложно. Возникла только одна проблема. При отправке писем на сервера не моего домена возвращаются письма с отказами от доменов получателей. Куда копнуть?

    ОтветитьУдалить
    Ответы
    1. Разобрался. Не корректна rdns запись. Над обращаться к прову для редактирования реверсивной dns иначе другие сервера отбрасывают письма из-за невозможности проверить запись.

      Удалить
  6. doveconf: Warning: Obsolete setting in /etc/dovecot/dovecot.conf:1: 'imaps' protocol is no longer supported. to disable non-ssl imap, use service imap-login { inet_listener imap { port=0 } }

    ОтветитьУдалить
  7. Дошел до настройки аккаунтов, и вот....

    Welcome to the MySQL monitor. Commands end with ; or \g.
    Your MySQL connection id is 36
    Server version: 5.5.29-0ubuntu0.12.04.1 (Ubuntu)

    Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.

    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

    mysql> USE mail;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A

    Database changed
    mysql> INSERT INTO domains (domain) VALUES ('POCHTA.ru');
    ERROR 1062 (23000): Duplicate entry 'POCHTA.ru' for key 'PRIMARY'

    ну с этим понятно, второй раз пытаюсь добавить такой же домен

    mysql> INSERT INTO users (email, password) VALUES ('direct@POCHTA.ru', ENCRYPT('1boss1'));
    ERROR 1146 (42S02): Table 'mail.users' doesn't exist

    а тут?
    куда могла деться таблица? и где ее искать?

    mysql>


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

    ОтветитьУдалить
    Ответы
    1. Не знаю, где ее искать. Если он говорит, что ERROR 1146 (42S02): Table 'mail.users' doesn't exist
      значит таблицы действительно нет. Возьми и создай.
      mysql> INSERT INTO users (user,email, password) VALUES ('direct', 'direct@POCHTA.ru', ENCRYPT('1boss1'));

      Удалить
  8. спасибо за статью, из всего что прочитал более менее действенные рекомендации

    ОтветитьУдалить
  9. В моей версии dovecpt пришлось вписывать в /etc/dovecot/pass не $user:$hash а $user@$domain:$hash
    то есть еще и домен вписывать - это особенность версии или я ошибся ?
    Кроме того в статье явно не хватает пункта проверки через телнет - ну я вот такой маньяк, что провелял так:
    telnet 127.0.0.1 110
    user мой_юзверь
    pass мой_пароль

    Просто именно тут я понял что dovecot авторизует именно user'а а не user@domain.com

    ОтветитьУдалить
    Ответы
    1. А может быть почтовый клиент передавал в качестве логина user@domain, и из-за этого пришлось дописывать домен в /etc/dovecot/pass ?

      Удалить
    2. Может быть, я не знаю как правильно, мои пляски с этим начались после того, как у меня не авторизовывался thunderbird, и стал пробовать telnet'Ом.
      Попробую позже прописать в pass имена без доменов и проверю - будет ли авторизовывать thunderbird.

      Удалить
  10. Для тех, как я, кто хочет в конфиге довкота указать полный путь к сертификатам, указывать нужно так:
    ssl_cert = <

    ОтветитьУдалить
  11. А для тех кто хочет заюзать шифрованное соедние для smtp (у меня в арче так работает) нужно сделать так:
    в master.cf расскоментировать эти строки:

    smtps inet n - n - - smtpd
    # -o syslog_name=postfix/smtps
    -o smtpd_tls_wrappermode=yes
    -o smtpd_sasl_auth_enable=yes

    в main.cf добавить

    smtp_use_tls = yes
    smtpd_use_tls = yes
    smtp_tls_note_starttls_offer = yes
    smtpd_tls_key_file = /opt/cert/post.key
    smtpd_tls_cert_file = /opt/cert/arch.cert

    где post.key и arch.cert - это ключ и сертификат, которые использует довкот.

    smtpd_tls_loglevel = 1
    smtpd_tls_received_header = yes
    smtpd_tls_session_cache_timeout = 1s
    tls_random_source = dev:/dev/urandom[root@vps0-1 ~]#







    ОтветитьУдалить
    Ответы
    1. Большое спасибо, добавил в статью.

      Удалить
  12. Спасибо за статью. Очень помогла!

    ОтветитьУдалить
  13. для тех кто хочет выборочно включать pop3/imap/pop3s/imaps

    http://pastebin.com/5YyTrczE

    тут нужно править port = xxx
    укажите 0, чтобы отключить ненужный вам протокол.
    Или укажите число отличное, от стандартных, чтобы протоколы работали на не стандартных портах :)

    ОтветитьУдалить
  14. Здарвствуйте! Здесь не говорится о MX. Он нужен или нет, чтоб был связь с инетом?

    ОтветитьУдалить
  15. как я ВАМ благодарен, я уже вторые сутки бился в бестолку, и вот ваша статья просто для меня мана с неба =)

    ОтветитьУдалить
  16. Анонимный16 мая 2013 г., 2:45

    Из огромного кол-ва мусора в инете на тему Postfix+dovecot+mysql, реально ТОЛКОВАЯ СТАТЬЯ. Так держать!!!

    ОтветитьУдалить
  17. Анонимный25 июня 2013 г., 22:59

    а никто не знает, как выполнить некий скрипт при получении письма с заданным заголовком конкретному пользователю?

    ОтветитьУдалить
  18. Спасибо, действительно статья ценная, добавил в закладки.
    Автор красава, неделю искал такой ман.
    Респект!

    ОтветитьУдалить
  19. Подскажите можно ли без бд сделать на несколько доменов. У каждого просто будет пару учеток не хочется городить бд. Да и ssl мне не требуется.

    ОтветитьУдалить
  20. можно:
    изменить dovecot.conf с
    mail_location = maildir:/var/spool/mail/myubuntu.org/%n
    на
    mail_location = maildir:/var/spool/mail/%d/%n

    ОтветитьУдалить
  21. Убил целый день, в общем postfix 2.10.0 как не рыпался - аутентификация проводится, но на попытку отправить - relay access denied, в общем в новых версиях надо вместо smtpd_recipient_restrictions используется smtpd_relay_restrictions, на всякий случай в конфиге оставил оба параметра.

    ОтветитьУдалить
  22. Народ, помогите, пожалуйста.
    делал вроде все по инструкции, исходящие уходят, а входящие не проходят. в чем может быть проблема, второй день мучаюсь.

    на всякий:
    deynega.a@gmail.com

    ОтветитьУдалить
  23. Всем привет,
    поясните почему в пункте 21:
    21. Редактируем файл алиасов почтовых ящиков
    sudo gedit /etc/postfix/virtual

    Пишем:
    user3@myubuntu.org user1@myubuntu.org
    ?
    А не
    user1@myubuntu.org user1@myubuntu.org
    или
    user3@myubuntu.org user3@myubuntu.org
    ?
    Всем большое спасибо!

    ОтветитьУдалить
    Ответы
    1. кстати, ЭТО ВЕРНО!
      я долго голову ломал, почему почта не уходила. ошибка была:
      553 5.7.1 adress rejected: not owned by user bla bla bla

      РЕШЕНИЕ
      /etc/postfix/virtual нужно прописывать все ящики созданные в базе mysql
      user1@myubuntu.org user1@myubuntu.org

      Удалить
    2. хорошая статья, проверено, все работает!

      Удалить
    3. Потому что user3@myubuntu.org - это алиас реально существующего ящика user1@myubuntu.org

      Удалить
    4. Да не надо в /etc/postfix/virtual прописывать все ящики созданные в базе mysql . Данные о почтовых ящиках берутся только из базы данных mysql.

      Удалить
    5. Действительно работает и без прописывания почтовых ящиков в /etc/postfix/virtual
      Но есть интересный эффект. Без прописывания, в тандербёрд письмо почему-то приходит в папку спам, а если прописать то во "входящие"...

      Удалить
  24. Автор, Спасибо за толковую статью! Её бы копию на opennet.ru и хабр выложить.

    ОтветитьУдалить
  25. Все работает! Спасибо за столь подробный мануал!! Три дня наверно настравивал все это дело))
    Были проблемы с правами доступа при использовании этой директории:
    mail_location = maildir:/var/spool/mail/myubuntu.org/%n (и в других директивах где встречается этот путь)
    Заменил на
    mail_location = maildir:/var/mail/myubuntu.org/%n
    и все стало работать идеально
    Были проблемы с настройкой Тандербёрд.
    Но в конечном счете настроил прием почты на 993 порт, а отправку на 465 причем в обоих случаях с использованием SSL (а не STARTTLS как рекомендовалось в статье) только при таком раскладе все заработало!
    Ну и пришлось открыть (пробросить) внешние порты 25 и 465.
    Еще раз спасибо! Очень помогли!!!

    ОтветитьУдалить
    Ответы
    1. Спасибо за помощь. Внес исправления.

      Удалить
  26. что то телнет не может достучаться до сервера. поднял убунту серв, установил postfix и dovecot. открыл порты 25 и 110 input-ом и forward-ом. но попытки тчетны. помогите советом...

    ОтветитьУдалить
    Ответы
    1. Надо бы сначала на самом сервере проверить, работает ли Postfix с Dovecot'ом , логи их посмотреть. Вообще попробуй сделать все сначала по новой инструкции.

      Удалить
    2. При рестарте postfix выходит ошибка
      /usr/sbin/postconf: fatal: file /etc/postfix/master.cf line 115 bad filed count
      cannot execute /usr/sbin/postconf !

      и в dovecot выходит строка 107 '=' exception

      Удалить
  27. Привет.
    Сделал все по инструкции, работает все кроме одного. Отправить почту через веб-клиент на этой же машине получается без проблем, а вот удаленно через Thunderbird - нет. Клиент выдает сообщение: "Почтовый сервер ответил: 4.3.0 : Temporary lookup failure."
    В логе /var/log/mail.log следующие сообщения:

    Feb 9 01:21:18 host postfix/smtpd[12589]: Anonymous TLS connection established from unknown[x.x.x.x]: TLSv1 with cipher ECDHE-RSA-AES128-SHA (128/128 bits)
    Feb 9 01:21:19 host postfix/smtpd[12589]: warning: hash:/etc/postfix/virtual is unavailable. open database /etc/postfix/virtual.db: No such file or directory
    Feb 9 01:21:19 host postfix/smtpd[12589]: warning: hash:/etc/postfix/virtual lookup error for "user@host.com"
    Feb 9 01:21:19 host postfix/smtpd[12589]: NOQUEUE: reject: RCPT from unknown[x.x.x.x]: 451 4.3.0 : Temporary lookup failure; from= to= proto=ESMTP helo=

    В чем может быть дело?

    ОтветитьУдалить
    Ответы
    1. Снова выполните пункты 13 и 14 данной инструкции.

      Удалить
  28. При попытке настроить Thunderbird на хосте бесконечно идет "поиск конфигурацииЖ идет проверка сервера". В журнале ошибок /var/log/mail.log:

    Apr 6 19:43:36 main postfix/smtps/smtpd[5025]: Anonymous TLS connection established from main.rabbitohs.cz.cc[192.168.1.186]: TLSv1 with cipher ECDHE-RSA-AES128-SHA (128/128 bits)
    Apr 6 19:43:36 main postfix/smtps/smtpd[5025]: warning: TLS library problem: 5025:error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca:s3_pkt.c:1256:SSL alert number 48:
    Apr 6 19:43:36 main postfix/smtps/smtpd[5025]: lost connection after CONNECT from main.rabbitohs.cz.cc[192.168.1.186]

    ОтветитьУдалить
  29. В принципе было бы не плохо добавить к статье настройку roundcube что бы так сказать полностью решить вопрос с почтой.
    По rouncube:
    $rcmail_config['default_host'] = 'ssl://localhost';
    $rcmail_config['default_port'] = 993;
    $rcmail_config['imap_auth_type'] = 'PLAIN';

    $rcmail_config['smtp_server'] = 'ssl://localhost';
    $rcmail_config['smtp_port'] = 465;
    $rcmail_config['smtp_auth_type'] = 'PLAIN';

    Спасибо автору за статью, настроил исключительно по его мануалу.

    ОтветитьУдалить
  30. Вот такая проблема возникает - помогите, плз

    Apr 23 20:00:19 mail postfix/smtps/smtpd[3784]: connect from unknown[5.19.252.235]
    Apr 23 20:00:20 mail postfix/smtps/smtpd[3784]: Anonymous TLS connection established from unknown[5.19.252.235]: TLSv1 with cipher ECDHE-RSA-AES128-SHA (128/128 bits)
    Apr 23 20:00:20 mail postfix/smtps/smtpd[3784]: warning: TLS library problem: 3784:error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca:s3_pkt.c:1256:SSL alert number 48:
    Apr 23 20:00:20 mail postfix/smtps/smtpd[3784]: lost connection after CONNECT from unknown[5.19.252.235]
    Apr 23 20:00:20 mail postfix/smtps/smtpd[3784]: disconnect from unknown[5.19.252.235]

    ОтветитьУдалить
    Ответы
    1. При попытках подключиться из Thunderbird. В самос Thunderbird пишет, что thunderbird failed to find settings for your email account

      Удалить
  31. Этот комментарий был удален автором.

    ОтветитьУдалить
  32. Всем привет!

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

    С клиентской машины, где установлен почтовый клиент: проходит ping до ubuntu.myubuntu.org, проходит telnet ubuntu.myubuntu.org 993 и 465

    , где можно найти эти настройки и что может способствовать решению данной проблемы?

    Спасибо)

    ОтветитьУдалить
  33. Вопрос с альясами. Как правильно писать в базу альяс (для копирования, а не редиректа) почты с локального ящика на другие адреса?

    ОтветитьУдалить
  34. Помогите пожалуйста, все делал по статье, но потом вот такая штука получается, уже два дня не могу понять в чем дело:
    Oct 31 16:17:03 proxyub postfix/smtps/smtpd[6635]: connect from unknown[192.168.12.212]
    Oct 31 16:17:03 proxyub postfix/smtps/smtpd[6635]: Anonymous TLS connection established from unknown[192.168.12.212]: TLSv1.2 with cipher ECDHE-$
    Oct 31 16:17:13 proxyub postfix/smtps/smtpd[6635]: fatal: no SASL authentication mechanisms
    Oct 31 16:17:14 proxyub postfix/master[5815]: warning: process /usr/lib/postfix/smtpd pid 6635 exit status 1
    Oct 31 16:17:14 proxyub postfix/master[5815]: warning: /usr/lib/postfix/smtpd: bad command startup -- throttling

    Причем все механизмы кодирования и декодирования во всех файлах указаны((((
    и вот еще с лога

    2014-10-31 16:45:33 auth: Debug: Module loaded: /usr/lib/dovecot/modules/auth/libdriver_mysql.so
    2014-10-31 16:45:33 auth: Fatal: mysql: Missing value in connect string: default_pass_scheme
    2014-10-31 16:45:33 master: Error: service(auth): command startup failed, throttling for 60 secs
    2014-10-31 16:45:33 imap-login: Info: Disconnected: Auth process broken (disconnected before auth was ready, waited 0 secs): user=<>, rip=192.16$

    ОтветитьУдалить
  35. Переделал конфиги, на 25 порту Connection refused

    ОтветитьУдалить
    Ответы
    1. мне помогло добавить в dovecot.conf строчку:
      listen = *

      Удалить