КОИНС.Студия - Статьи - Инсталляция и настройка программ - mail

mail

  • Использованные инструкции:
    http://sudouser.com/ustanovka-pochtovogo-servera-postfix-dovecot-mysql-i-virtualnyx-domenov.html
    http://redhat-club.org/2011/%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-postfix-dovecot-mysql-roundcube-webmail
    http://www.azure.org.ua/ru/articles/3-Mnogodomennaya_pochtovaya_sistema_na_baze_postifx_+_cyrus-imapd_+_MySQL.html
    http://flurdy.com/docs/postfix/
    http://workaround.org/ispmail/lenny

  • Удаляем sendmail:
    rpm -e --nodeps sendmail
    Ключ --nodeps используется для того, чтобы удалить sendmail несмотря на то, что его используют другие установленные в системе пакеты для своих нужд. С этими задачами будет справляться наш postfix.

  • Инсталлируем postfix (MTA) и dovecot (MDA):
    yum install postfix dovecot dovecot-mysql

  • Создаём базу данных в MySQL:
    create database mail;
    use mail;

    create table studio_mail_alias (
      k_mail_alias bigint unsigned not null auto_increment primary key,

      s_from varbinary(64) not null,
      s_to varbinary(64) not null,

      is_remove tinyint not null default 0,

      index(s_from)
    ) engine=InnoDB default character set=binary;

    create table studio_mail_domain (
      k_mail_domain bigint unsigned not null auto_increment primary key,

      is_active tinyint not null default 0,
      k_client bigint unsigned,
      s_comment blob not null,
      s_domain varbinary(64) not null,

      is_remove tinyint not null default 0,

      unique index(s_domain)
    ) engine=InnoDB default character set=binary;

    create table studio_mail_quota (
      s_mail varbinary(64) not null,
      i_byte bigint unsigned not null default 0,
      i_message bigint unsigned not null default 0,

      unique index (s_mail),
      foreign key(s_mail) references studio_mail_user(s_mail)
    ) engine=InnoDB default character set=binary;

    create table studio_mail_user (
      k_mail_user bigint unsigned not null auto_increment primary key,

      i_volume bigint unsigned not null, # volume limit, in bytes
      is_active tinyint not null default 0,
      k_mail_domain bigint unsigned not null,
      s_comment blob not null,
      s_mail varbinary(64) not null,
      s_net tinyblob not null, # с каких хостов разрешён вход
      s_password binary(32) not null,

      is_remove tinyint not null default 0,

      index(k_mail_domain),
      unique index(s_mail),

      foreign key(k_mail_domain) references studio_mail_domain(k_mail_domain) on delete cascade
    ) engine=InnoDB default character set=binary;

    # выдадим права пользователю (после создания таблиц, так как тут есть ссылки на таблицы)
    grant select on mail.* to u_mail@localhost identified by 'mailpass';
    grant delete,insert,update on mail.studio_mail_quota to u_mail@localhost;

    # Внесём запись о виртуальном домене:
    INSERT INTO studio_mail_domain (k_mail_domain, s_domain,is_active) VALUES (1, '01.site.1024.info',1);

    # Создадим первый тестовый ящик
    INSERT INTO studio_mail_user (k_mail_user, k_mail_domain, s_mail, s_password,is_active) VALUES (1, 1, 'test@01.site.1024.info', MD5('password'),1);

    # Создадим первый тестовый алиас
    INSERT INTO studio_mail_alias (k_mail_alias, s_from, s_to) VALUES (1, 'test@01.site.1024.info','test@01.site.1024.info'), (2, 'test@01.site.1024.info', 'yuri@popoff.donetsk.ua');
  • Создадим пользователей
    groupadd -g 5000 vmail
    useradd -g vmail -u 5000 vmail -d /var/vmail -m
    passwd vmail

  • /etc/postfix/mysql-virtual-mailbox-domains.cf
    user = mailuser
    password = mailuser2007
    hosts = 127.0.0.1:46157
    dbname = mailserver
    query = SELECT 1 FROM studio_mail_domain WHERE s_domain='%s' and is_active=1 and is_remove=0
  • /etc/postfix/mysql-virtual-mailbox-maps.cf
    user = mailuser
    password = mailuser2007
    hosts = 127.0.0.1
    dbname = mailserver
    query = SELECT 1 FROM studio_mail_user WHERE s_mail='%s' and is_active=1 and is_remove=0
  • /etc/postfix/mysql-virtual-alias-maps.cf
    user = mailuser
    password = mailuser2007
    hosts = 127.0.0.1
    dbname = mailserver
    query = SELECT s_to FROM studio_mail_alias WHERE s_from='%s' and is_remove=0
  • /etc/postfix/mysql-email2email.cf
    user = mailuser
    password = mailuser2007
    hosts = 127.0.0.1
    dbname = mailserver
    query = SELECT s_mail FROM studio_mail_user WHERE s_mail='%s' and is_active=1 and is_remove=0
  • /etc/postfix/mysql-quota.cf
    user = mailuser
    password = mailuser2007
    hosts = 127.0.0.1:46157
    dbname = mailserver
    query = SELECT
        '452 Mailbox is over quota'
      FROM.
        studio_mail_user left join
        studio_mail_quota on
          studio_mail_quota.s_mail=studio_mail_user.s_mail
      WHERE.
        studio_mail_user.s_mail = '%s' and
        studio_mail_user.i_volume>0 and
        (
          studio_mail_quota.s_mail is null or
          studio_mail_quota.i_byte>=studio_mail_user.i_volume
        )
  • Выставим правильные права доступа на файлы конфигкрации почтового сервера, ведь в них хранятся пароли от базы данных
    chgrp postfix /etc/postfix/mysql-*.cf
    chmod u=rw,g=r,o= /etc/postfix/mysql-*.cf

  • Внесём изменения в конфигурацию сервера postfix:
    postconf -e virtual_mailbox_domains=proxy:mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
    postconf -e virtual_mailbox_maps=proxy:mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
    postconf -e 'local_recipient_maps=$virtual_mailbox_maps,$virtual_alias_maps'
    postconf -e mydestination=
    postconf -e virtual_uid_maps=static:5000
    postconf -e virtual_gid_maps=static:5000
    postconf -e mydomain=01.site.1024.info
    postconf -e myhostname=01.site.1024.info
    postconf -e mynetworks=
    postconf -e inet_interfaces=all
    postconf -e virtual_alias_maps=proxy:mysql:/etc/postfix/mysql-virtual-alias-maps.cf,proxy:mysql:/etc/postfix/mysql-email2email.cf
    postconf -e 'proxy_read_maps=proxy:mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf,proxy:mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf,proxy:mysql:/etc/postfix/mysql-virtual-alias-maps.cf,proxy:mysql:/etc/postfix/mysql-email2email.cf,proxy:mysql:/etc/postfix/mysql-quota.cf'

  • Проверим правильность настройки виртуальных доменов:

    postmap -q 01.site.1024.info mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
    должны увидеть 1, если всё ок

    postmap -q test@01.site.1024.info mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
    должны увидеть 1, если всё ок

    postmap -q test@01.site.1024.info mysql:/etc/postfix/mysql-virtual-alias-maps.cf
    должны увидеть: test@01.site.1024.info,yuri@popoff.donetsk.ua

  • Далее настроим dovecot в качестве локального агента доставки писем, для этого отредактируйте файл /etc/postfix/master.cf добавив в конец это
      dovecot unix - n n - - pipe
      flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -d ${recipient}

    (вторая строка обязательно с пробелами!)

  • Запускаем сервер postfix:
    service postfix start
    chkconfig postfix on

    Если сервер уже был загружен, то нужно перезагрузить конфиг:
    postfix reload

  • Добавить информацию о виртуальном транспорте в главный конфиг Postfix
    postconf -e virtual_transport=dovecot
    postconf -e dovecot_destination_recipient_limit=1

  • Готовим каталог, где будет храниться почта.
    /var/vmail/
    удаляем эту ссылку и создаём вместо неё каталог с владельцем vmail:vmail и правами 0770

  • Настройка dovecot:
    /etc/dovecot/dovecot.conf
    # Это надо поменять:
    protocols = imap pop3
    login_greeting = Welcome to IMAP/POP3 server

    dict {
      quota = mysql:/etc/dovecot/dovecot-dict-sql.conf
      # expire = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext
    }

    # добавить
    service dict {
      unix_listener dict {
        mode = 0600
        user = vmail
      }
    }
  • /etc/dovecot/conf.d/10-auth.conf
    поменять:
    disable_plaintext_auth = no
    auth_mechanisms = plain login

    добавить:
    service auth {
      unix_listener /var/spool/postfix/private/dovecot-smtp-auth {
        group = postfix
        mode = 0660
        user = postfix
      }
      unix_listener auth-master {
        group = vmail
        mode = 0660
        user = vmail
      }
      unix_listener auth-userdb {
        mode = 0600
        user = vmail
        group = vmail
      }
    }


    закомментрировать:
    !include auth-system.conf.ext

    раскомментировать:
    !include auth-sql.conf.ext

  • /etc/dovecot/conf.d/10-logging.conf
    log_path=/var/log/dovecot/dovecot.log

  • /etc/dovecot/conf.d/10-mail.conf

    раскомментировать и поменять:
    mail_location = maildir:/var/vmail/%d/%n
    mail_uid = 5000
    mail_gid = 5000
    first_valid_uid = 5000 # только наш юзер может быть использован
    last_valid_uid = 5000

    найти #namespace и после него добавить:
    namespace {
      type = private
      separator =.
      prefix = INBOX.

      inbox = yes
    }
  • /etc/dovecot/conf.d/10-ssl.conf
    ssl = no

  • /etc/dovecot/conf.d/15-lda.conf
    postmaster_address = spam@01.site.1024.info
    protocol lda {
      log_path = /var/vmail/dovecot-deliver.log
      auth_socket_path = /var/run/dovecot/auth-master
      mail_plugins = $mail_plugins quota
    #  mail_plugins = cmusieve
    #  sieve_global_path = /home/vmail/globalsieverc
    }
  • /etc/dovecot/conf.d/20-imap.conf
    mail_plugins = $mail_plugins quota imap_quota

  • /etc/dovecot/conf.d/20-pop3.conf
    mail_plugins = $mail_plugins quota

  • /etc/dovecot/conf.d/90-quota.conf
    Надо только найти эти строчки и раскомментировать нужное:
    plugin {
      quota = dict:user::proxy::quotadict
      quota_rule = *:bytes=1073741824
      quota_rule2 = Trash:storage=+100M
    }
  • /etc/dovecot/conf.d/auth-sql.conf.ext
    Раскомментировать:
    userdb {
    driver = prefetch
    }

  • /etc/dovecot/conf.d/auth-static.conf.ext
    Раскомментировать и поменять:
    userdb {
      driver = static
      args = uid=5000 gid=5000 home=/var/vmail/%d/%n allow_all_users=yes
    }
  • /etc/dovecot/dovecot-sql.conf
    driver = mysql
    connect = host=/var/run/mysqld/mysqld.sock dbname=mail user=u_mail password=pass

    default_pass_scheme = PLAIN-MD5

    password_query = SELECT s_mail as user, s_password as password FROM studio_mail_user WHERE s_mail='%u' and is_active=1 and is_remove=0;

    user_query = SELECT CONCAT('/var/vmail/',CONCAT(SUBSTRING_INDEX(s_mail,'@',-1),'/',SUBSTRING_INDEX(s_mail,'@',1))) AS home,s_mail as user, 5000 AS uid, 5000 AS gid, CONCAT('*:bytes=',i_volume) AS quota_rule FROM studio_mail_user WHERE s_mail='%u';

    iterate_query = SELECT s_mail AS username FROM studio_mail_user;
  • /etc/dovecot/dovecot-dict-sql.conf
    connect = host=127.0.0.1 port=46157 dbname=mail user=u_mail password=ynwq8lLVu14U

    map {
      pattern = priv/quota/storage
      table = studio_mail_quota
      username_field = s_mail
      value_field = i_byte
    }
    map {
      pattern = priv/quota/messages
      table = studio_mail_quota
      username_field = s_mail
      value_field = i_message
    }
  • Выставим права доступа к конфигам dovecot:
    chgrp vmail /etc/dovecot/dovecot*.conf
    chmod g+r,o-rwx /etc/dovecot/dovecot*.conf

  • Поскольку журнал dovecot-deliver.log может быстро расти, нужно настроить ротацию журналов:
    /etc/logrotate.d/dovecot-deliver
    /var/vmail/dovecot-deliver.log {
      weekly
      rotate 14
      compress
    }
  • Запускаем сервер dovecot:
    service dovecot start
    chkconfig dovecot on

    Если сервер уже был загружен, то нужно перезагрузить конфиг:
    service dovecot restart

  • настроим аутентификацию SMTP в postfix:
    postconf -e mynetworks=192.168.50.0/24 # это только если надо разрешить локально отправлять без аутентификации
    postconf -e smtpd_sasl_type=dovecot
    1. можно добавить permit_mynetworks (обязательно после check_recipient_access, который должен быть обязательно первым)

    postconf -e 'smtpd_recipient_restrictions=check_recipient_access proxy:mysql:/etc/postfix/mysql-quota.cf,permit_sasl_authenticated,reject_unauth_destination'

    postconf -e smtpd_sasl_path=private/auth
    либо (проверить)
    postconf -e smtpd_sasl_path=private/dovecot-smtp-auth

    postconf -e smtpd_sasl_auth_enable=yes

    postconf -e smtpd_sasl_security_options=noanonymous

  • Проверим правильность настроек постфикса:
    postfix check
    (должен быть пустой результат)

  • Открыть порты 25 и 110 в Amazon Security Group

  • Надо настроить DNS для домена, прописанного в mydomain, а также для всех доменов, для которых создаются почтовые ящики.
    Прописать:
    • mx запись для домена

    • TXT запиись google-site-verification=e4z7nznn0KSyT5-EM-HNVWqkCyQwAGJ73gcLq0KnMi4

    • TXT v=spf1 ip4:85.214.93.191 ip4:85.214.149.150 -all
      The -all at the end tells you that no other IP addresses should be accepted (FAIL). Another definition like ~all means a SOFTFAIL - you should at least be suspicious and perhaps increase the spam score.
      Идти сюда, чтобы сгенерировать правильную запись:
      http://www.openspf.org/

    Воспользоваться визардом:
    http://www.microsoft.com/mscorp/safety/content/technologies/senderid/wizard/default.aspx

  • Чтобы снять ограничения с серверов амазона, надо заполнить форму:
    https://aws-portal.amazon.com/gp/aws/html-forms-controller/contactus/ec2-email-limit-rdns-request

Последняя модификация: 26.09.14 22:10