Используемые термины: Postfix , POP3 , SMTP , IMAP , MariaDB , PostfixAdmin , Dovecot , Roundcube
В данной инструкции выполнена настройка полноценного почтового сервера на Linux Debian (протестирована на версиях 10 и 11). Список всех особенностей и возможностей:
1. Преднастройка системы
2. Настройка веб-сервера: NGINX + PHP + MariaDB
3. Установка и настройка PostfixAdmin
4. Настройка Postfix
5. Настройка Dovecot
6. Проверка работы сервера
7. Настройка Roundcube Webmail
8. Защита от вирусов и СПАМа
Clamav + Amavisd
Настройка Postfix
Обновление антиспама
Проверка настройки
Пересылка СПАМа и вирусов на другой ящик
Антиспам средствами Postfix
Обучение антиспама
9. Отправка почты без попадания в СПАМ
10. Настройка DKIM
11. Настройка дисковых квот
12. Автоматическая настройка почтовых клиентов
13. Отображение папок IMAP в Outlook на русском
14. Дополнительные настройки
Настройка лимитов
Смена email
15. Возможные проблемы
И так, данная инструкция написана под систему Linux Debian. Предварительно, выполним следующие действия.
Обновляем систему:
apt update && apt upgrade
Задаем правильное имя серверу — это важный шаг, так как большинство антиспам систем выполняют проверки, обращаясь к серверу по имени в ожидании ответа:
hostnamectl set-hostname relay.remontka.com
* необходимо указать FQDN-имя, которое будет доступно из глобальной сети. В данном примере указано relay.remontka.com .
Устанавливаем пакет для синхронизации времени:
apt install chrony
Задаем временную зону (в данном примере московское время):
timedatectl set-timezone Europe/Moscow
* чтобы получить список всех возможных зон, вводим timedatectl list-timezones.
Разрешаем сервис для обновления времени:
systemctl enable chrony
Заранее открываем порты на брандмауэре с помощью iptables :
iptables -I INPUT 1 -p tcp —match multiport —dports 25,110,143,465,587,993,995 -j ACCEPT
iptables -I INPUT 1 -p tcp —match multiport —dports 80,443 -j ACCEPT
* где мы откроем следующие порты:
Для сохранения правил установим пакет:
apt install iptables-persistent
И выполняем команду:
netfilter-persistent save
Система управления PostfixAdmin работает как веб-приложение, разработанное на PHP , а информацию хранит в базе данных. В нашем примере будет использоваться веб-сервер на NGINX , а база данных — MariaDB.
Устанавливаем nginx командой:
apt install nginx
Разрешаем автозапуск сервиса:
systemctl enable nginx
Проверяем работоспособность веб-сервера, обратившись к нему в браузере по адресу http://<IP-адрес сервера> . Если видим заголовок «Welcome to nginx!», NGINX настроен верно.
Устанавливаем php и php-fpm :
apt install php php-fpm
Настраиваем NGINX:
vi /etc/nginx/sites-enabled/default
В разделах http — server указываем, чтобы первым индексным файлом был index.php, а также добавляем настройку для обработки запросов php (location):
server {
listen 80 default_server;
listen [::]:80 default_server;
…
index index.php …
…
location ~ .php$ {
set $root_path /var/www/html;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name;
include fastcgi_params;
fastcgi_param DOCUMENT_ROOT $root_path;
}
}
* где /var/www/html — каталог для размещения данных nginx по умолчанию; /run/php/php7.4-fpm.sock — путь до сокет-файла php-fpm (обратите внимание, что точное значение зависит от используемой вервии php).
Разрешаем автозапуск php-fpm:
systemctl enable php7.4-fpm
* где php7.4-fpm зависит от используемой версии php, которую можно посмотреть командой php -v .
Перезапускаем nginx:
systemctl reload nginx
Для проверки, создаем индексный файл в директории сайта со следующим содержимым:
vi /var/www/html/index.php
<?php phpinfo(); ?>
Открываем сайт в браузере по его IP-адресу. На открывшейся странице мы должны увидеть подробную информацию по php:
Устанавливаем сервер баз данных следующей командой:
apt install mariadb-server
Включаем автозапуск сервиса баз данных:
systemctl enable mariadb
Задаем пароль для пользователя sql root:
mysqladmin -u root password
Устанавливаем дополнительные компоненты для PHP:
apt install php-mysql php-mbstring php-imap
Для применения установленных пакетов, перезапускаем обработчик скриптов:
systemctl restart php7.4-fpm
Заходим на страницу релизов проекта PostfixAdmin в Github и смотрим его последнюю версию. На момент обновления инструкции это было 3.3.13. Для удобства, создадим переменную:
PA_VER=3.3.13
Теперь для загрузки PostfixAdmin выполняем команду:
wget https://github.com/postfixadmin/postfixadmin/archive/refs/tags/postfixadmin-${PA_VER}.tar.gz
В директории сайтов nginx создаем каталог для postfixadmin и распаковываем в него архив:
mkdir /var/www/html/postfixadmin
tar -C /var/www/html/postfixadmin -xf postfixadmin-*.tar.gz —strip-components 1
Создаем каталог templates_c внутри папки портала (без него не запустится установка):
mkdir /var/www/html/postfixadmin/templates_c
* в противном случае, при попытке зайти в панель управления после ее установки мы получим ошибку ERROR: the templates_c directory doesn’t exist or isn’t writeable for the webserver .
Задаем права на каталог:
chown -R www-data:www-data /var/www/html/postfixadmin
* несмотря на то, что мы используем веб-сервер nginx, php-fpm по умолчанию, запускается от пользователя www-data .
Создаем базу данных postfix и учетную запись в mariadb:
mysql -u root -p
> CREATE DATABASE postfix DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
* где postfix — имя базы.
> GRANT ALL ON postfix.* TO ‘postfix’@’localhost’ IDENTIFIED BY ‘postfix123’;
* где postfix — имя учетной записи; postfix123 — пароль; localhost разрешает подключение только с локального сервера.
Выходим из командной оболочки MariaDB:
> quit
Создаем конфигурационный файл postfixadmin:
vi /var/www/html/postfixadmin/config.local.php
* в предыдущих версиях использовался файл config.inc.php . В новых версиях его не рекомендуется править, а использовать config.local.php , который переопределяет настройки.
И добавляем следующее:
<?php
$CONF[‘configured’] = true;
$CONF[‘default_language’] = ‘ru’;
$CONF[‘database_password’] = ‘postfix123’;
$CONF[’emailcheck_resolve_domain’] = ‘NO’;
?>
* где configured говорит приложению, что администратор закончил его конфигурирование; default_language — используемый язык по умолчанию; database_password — пароль для базы данных, который мы задали на предыдущем шаге; emailcheck_resolve_domain — задает необходимость проверки домена при создании ящиков и псевдонимов.
Запускаем браузер и вводим адрес http://<IP-адрес сервера>/postfixadmin/public/setup.php — откроется страница для установки PostfixAdmin.
Задаем дважды пароль установки и генерируем хэш, кликнув по Generate setup_password hash :
После копируем хэш, который появится под кнопкой:
Открываем конфигурационный файл:
vi /var/www/html/postfixadmin/config.local.php
И добавляем строчку:
…
$CONF[‘setup_password’] = ‘$2y$10$D…R32’;
* где ‘$2y$10$D…R32’ — скопированный хэш.
Перезагружаем страницу http://<IP-адрес сервера>/postfixadmin/public/setup.php — теперь у нас появится форма для ввода нашего пароля, созданного на предыдущем этапе. Вводим его и кликаем по Login with setup_password :
Будет выполнена установка PostfixAdmin.
Если в процессе установки система выведет ошибки, необходимо самостоятельно с ними разобраться. Как правило, они могут сводиться к отсутствию необходимых пакетов, которых может не оказаться в системе по умолчанию.
После установки в нижней части страницы должна быть форма добавления суперпользователя — вводим данные:
* где Setup password — пароль, который мы ввели на предыдущей странице; Админ — учетная запись для входа в панель управления PostfixAdmin; Пароль — новый пароль для создаваемой учетной записи.
Установка завершена. Переходим в браузере на страницу http://<IP-адрес сервера>/postfixadmin/public/login.php
Вводим логин и пароль для созданного пользователя. Мы должны войти в postfix.admin.
Установка Postfix в Debian выполняется командой:
apt install postfix postfix-mysql
* помимо самого postfix , мы также установим postfix-mysql для возможности работы с СУБД.
В процессе установки должно появиться окно «Postfix Configuration» — оставляем Internet Site :
В следующем окне оставляем имя сервера и нажимаем Enter.
После установки пакетов создаем учетную запись, от которой мы будем работать с каталогом виртуальных почтовых ящиков:
groupadd -g 1024 vmail
useradd -d /var/mail -g 1024 -u 1024 vmail -m
* сначала мы создаем группу vmail и guid 1024 , после — пользователя vmail с uid 1024 и домашней директорией /var/mail — в ней у нас будет храниться почта. Обратите внимание, что в некоторых системах идентификатор группы и пользователя 1024 может быть занят. В таком случае необходимо создать другой, а в данной инструкции ниже заменить все 1024 на альтернативный.
Если директория для почты ранее уже была создана, то необходимо задать в качестве владельца нашего созданного пользователя:
chown vmail:vmail /var/mail
Теперь открываем на редактирование конфигурационный файл почтового сервера:
vi /etc/postfix/main.cf
И редактируем следующие строки:
mydestination = localhost.$mydomain, localhost, localhost.localdomain
…
inet_protocols = ipv4
…
smtpd_tls_cert_file = /etc/ssl/mail/public.pem
smtpd_tls_key_file = /etc/ssl/mail/private.key
* где:
Если имя сервера отличается от имени, по которому сервер будет зарегистрирован в DNS, задаем опцию:
myhostname = mx01.remontka.com
Теперь в конец конфигурационного файла допишем следующее:
virtual_mailbox_base = /var/mail
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_alias_domains = proxy:mysql:/etc/postfix/mysql_virtual_alias_domains.cf
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 1024
virtual_uid_maps = static:1024
virtual_gid_maps = static:1024
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
smtpd_sasl_auth_enable = yes
smtpd_sasl_exceptions_networks = $mynetworks
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtp_use_tls = yes
smtpd_use_tls = yes
smtpd_tls_auth_only = yes
smtpd_helo_required = yes
* где:
Создаем файл с настройками обращения к базе с алиасами для почтовых ящиков:
vi /etc/postfix/mysql_virtual_alias_maps.cf
user = postfix
password = postfix123
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address=’%s’ AND active = ‘1’
* где user и password — логин и пароль для подключения к MySQL; hosts — имя сервера баз данных (в нашем случае, локальный сервер); dbname — имя базы данных; query — шаблон запроса к данным.
Создаем файл с настройками обращения к базе с алиасами для доменов:
vi /etc/postfix/mysql_virtual_alias_domains.cf
user = postfix
password = postfix123
hosts = localhost
dbname = postfix
query = SELECT alias.goto FROM alias,domain WHERE alias.address=’%s’ AND alias.domain=’%d’ AND alias.domain=domain.domain AND alias.active=1 AND domain.backupmx=0 AND domain.active=1
Создаем файл с инструкцией получения данных по виртуальным доменам:
vi /etc/postfix/mysql_virtual_domains_maps.cf
user = postfix
password = postfix123
hosts = localhost
dbname = postfix
query = SELECT domain FROM domain WHERE domain=’%u’
И файл с почтовыми ящиками:
vi /etc/postfix/mysql_virtual_mailbox_maps.cf
user = postfix
password = postfix123
hosts = localhost
dbname = postfix
query = SELECT CONCAT(domain,’/’,maildir) FROM mailbox WHERE username=’%s’ AND active = ‘1’
Открываем файл master.cf и дописываем в самый конец:
vi /etc/postfix/master.cf
submission inet n — n — — smtpd
-o smtpd_tls_security_level=may
-o smtpd_sasl_auth_enable=yes
-o smtpd_sasl_type=dovecot
-o smtpd_sasl_path=/var/spool/postfix/private/auth
-o smtpd_sasl_security_options=noanonymous
-o smtpd_sasl_local_domain=$myhostname
smtps inet n — n — — smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
dovecot unix — n n — — pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}
* необходимо убедиться, что в содержимом файла нет других раскомментированных опций для submission, smtps и dovecot (по умолчанию, их нет). В данном случае, мы настроили работу postfix на портах 25, 465 и 587. В файле master.cf мы настраиваем работу вспомогательных сервисов для Postfix. Описание каждого сервиса начинается с новой строки без отступа. Затем идут настройки для сервиса и параметры запуска. Для примера, рассмотрим первую добавленную строку —
submission inet n — n — — smtpd:
* после команды идут аргументы ее запуска. Они могут переопределять параметры, заданные в main.cf. Каждый аргумент записывается с новой строки и начинается с двух пробелов. В данном примере мы используем следующие аргументы:
Генерируем сертификаты безопасности. Для этого создаем каталог, в котором их разместим:
mkdir -p /etc/ssl/mail
И сгенерируем их следующей командой:
openssl req -new -x509 -days 1461 -nodes -out /etc/ssl/mail/public.pem -keyout /etc/ssl/mail/private.key -subj «/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT Department/CN=relay.remontka.com»
* сертификат сгенерирован на 1461 день, ключи subj могут быть произвольными, CN необходимо указать в соответствии с именем сервера, по которому мы будем подключаться к почте.
* если мы хотим использовать сертификат, который будет проходить все проверки безопасности, его нужно купить или запросить у Let’s Encrypt .
Разрешаем запуск postfix:
systemctl enable postfix
Перезапускаем его:
systemctl restart postfix
Устанавливаем Dovecot с компонентом для работы с СУБД:
apt install dovecot-imapd dovecot-pop3d dovecot-mysql
Настраиваем способ хранения сообщений:
vi /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:/var/mail/%d/%u/
* в данном примере сообщения будут храниться в продвинутом формате maildir в каталоге /var/mail/<почтовый домен>/<логин пользователя> .
Настраиваем слушателя для аутентификации:
vi /etc/dovecot/conf.d/10-master.conf
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
unix_listener auth-userdb {
mode = 0600
user = vmail
group = vmail
}
}
* в данном примере мы настраиваем сервис для аутентификации и создаем два прослушивателя: /var/spool/postfix/private/auth — для возможности постфиксом использовать авторизацию через Dovecot (обращаем внимание, что /var/spool/postfix/private/auth — это тот же private/auth , который был прописан нами в postfix); auth-userdb — сокет для авторизации через dovecot-lda. Опция mode задает права на сокет, например, 666 позволит любому пользователю к нему подключиться; user и group задает пользователя и группу владельцев на сокет.
А также в этом файле добавим строки:
service stats {
unix_listener stats-reader {
user = vmail
group = vmail
mode = 0660
}
unix_listener stats-writer {
user = vmail
group = vmail
mode = 0660
}
}
* в противном случае, мы увидим в логе ошибку error net_connect_unix(/var/run/dovecot/stats-writer) failed permission denied , так как у пользователя vmail не будет прав.
Настраиваем аутентификацию в Dovecot:
vi /etc/dovecot/conf.d/10-auth.conf
#!include auth-system.conf.ext
!include auth-sql.conf.ext
* в данном случае мы просто комментируем обычную аутентификацию и снимаем комментарий для использования sql-аутентификации.
Настраиваем использование шифрования:
vi /etc/dovecot/conf.d/10-ssl.conf
ssl = required
…
ssl_cert = </etc/ssl/mail/public.pem
ssl_key = </etc/ssl/mail/private.key
* ssl = required укажет dovecot требовать от клиентов использования шифрования; ssl_cert — путь до открытого сертификата (также нами указывался в postfix); ssl_key — путь к закрытому ключу.
Настроим автоматическое создание каталогов при первом подключении пользователя к ящику:
vi /etc/dovecot/conf.d/15-lda.conf
lda_mailbox_autocreate = yes
Настраиваем подключение к нашей базе данных:
vi /etc/dovecot/conf.d/auth-sql.conf.ext
passdb {
…
args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
…
args = /etc/dovecot/dovecot-sql.conf.ext
}
* в данном примере мы указали на файл, в котором будут находиться настройки для получения пользователей и паролей из базы данных. Данная настройка является настройкой по умолчанию и, в большинстве случаев, ее не нужно менять без необходимости указать свой путь.
Откроем на редактирование файл с настройками работы с mysql:
vi /etc/dovecot/dovecot-sql.conf.ext
В самый низ добавим:
driver = mysql
connect = host=localhost dbname=postfix user=postfix password=postfix123
default_pass_scheme = MD5-CRYPT
password_query = SELECT password FROM mailbox WHERE username = ‘%u’
user_query = SELECT maildir, 1024 AS uid, 1024 AS gid FROM mailbox WHERE username = ‘%u’
user_query = SELECT CONCAT(‘/var/mail/’,LCASE(`domain`),’/’,LCASE(`maildir`)), 1024 AS uid, 1024 AS gid FROM mailbox WHERE username = ‘%u’
* в данном примере мы настроили запрос на получение данных из базы mysql (mariadb). password_query — запрос на получение пароля из таблицы mailbox; user_query — запрос на получение данных пользователя (домашняя почтовая директория, идентификатор 1024 (идентификатор созданного нами ранее пользователя vmail).
И, напоследок, настраиваем интерфейс, на котором будет слушать dovecot:
vi /etc/dovecot/dovecot.conf
listen = *
* по умолчанию, dovecot слушает также на ipv6 ( listen = *, :: ). Если на сервере не используется 6-я версия протокола TCP/IP, в логах dovecot появятся ошибки:
master: Error: service(imap-login): listen(::, 143) failed: Address family not supported by protocol
master: Error: service(imap-login): listen(::, 993) failed: Address family not supported by protocol
Разрешаем запуск dovecot:
systemctl enable dovecot
Перезапускаем dovecot:
systemctl restart dovecot
В браузере вводим в адресной строке путь до Postfixadmin — http://<IP-адрес сервера>/postfixadmin/public/ .
Вводим логин и пароль от административной учетной записи, которую мы создали на шаге 3. Перед нами появится страница управления учетными записями.
Переходим в Список доменов — Новый домен :
Заполняем формы и нажимаем по Добавить домен :
Теперь переходим в Обзор — Создать ящик :
Вводим данные нового пользователя и нажимаем по Создать ящик :
Теперь можно подключиться к серверу с помощью любой почтовой программы, например, Mozilla Thunderbird.
Параметры для подключения:
* для корректной работы сервера на портах 993, 995, 465 (SSL/TLS) необходим правильный сертификат (для нашего домена и выпущенный доверенным центром сертификации).
В данной инструкции мы разберем использование веб-клиента Roundcube. При необходимости, можно установить другой, например, WebMail Lite или несколько одновременно.
На официальном сайте заходим на страницу загрузки Roundcube. Смотрим ссылку на версию продукта с длительной поддержкой (LTS):
Используем ссылку, чтобы загрузить архив программы:
wget https://github.com/roundcube/roundcubemail/releases/download/1.5.3/roundcubemail-1.5.3-complete.tar.gz
Создаем каталог, где будут размещаться файлы портала:
mkdir /var/www/html/webmail
И распаковываем скачанный архив:
tar -C /var/www/html/webmail -xvf roundcubemail-*.tar.gz —strip-components 1
Копируем шаблон конфига:
cp /var/www/html/webmail/config/config.inc.php.sample /var/www/html/webmail/config/config.inc.php
И открываем его на редактирование:
vi /var/www/html/webmail/config/config.inc.php
$config[‘db_dsnw’] = ‘mysql://roundcube:roundcube123@localhost/roundcubemail’;
$config[‘enable_installer’] = true;
* первую строку мы редактируем, а вторую добавляем. В первой строке roundcube:roundcube123 — логин и пароль для доступа к базе данных; localhost — сервер базы данных; roundcubemail — имя базы данных. Вторая строка разрешает установку портала.
Также дописываем в конфигурационный файл следующее:
$config[‘drafts_mbox’] = ‘Drafts’;
$config[‘junk_mbox’] = ‘Junk’;
$config[‘sent_mbox’] = ‘Sent’;
$config[‘trash_mbox’] = ‘Trash’;
$config[‘create_default_folders’] = true;
* настройка $config[‘create_default_folders’] = true создает папки по умолчанию, если их нет:
* Без данной настройки, если не создавались папки другим клиентом, веб-клиент будет выдавать ошибки при перемещении писем, например, при их удалении.
Задаем владельца apache на папку портала:
chown -R www-data:www-data /var/www/html/webmail
Создаем в MariaDB базу для roundcubemail:
mysql -uroot -p
> CREATE DATABASE roundcubemail DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
> GRANT ALL PRIVILEGES ON roundcubemail.* TO roundcube@localhost IDENTIFIED BY ’roundcube123′;
> quit
И загружаем в созданную базу данные:
mysql -uroot -p roundcubemail < /var/www/html/webmail/SQL/mysql.initial.sql
Устанавливаем компоненты, необходимые для работы Roundcube:
apt install php-pear php-intl php-ldap php-net-smtp php-gd php-imagick php-zip php-curl
Настроим php:
vi /etc/php/7.4/fpm/php.ini
date.timezone = «Europe/Moscow»
…
post_max_size = 30M
…
upload_max_filesize = 30M
* в данном примере мы задаем московское время и возможность загружать файл размером в 30 Мб (это будет максимальным объемом вложений, которые можно отправлять через веб-интерфейс).
Перезагружаем php-fpm:
systemctl restart php7.4-fpm
Настроим nginx:
vi /etc/nginx/nginx.conf
Добавим строку в раздел http:
http {
…
client_max_body_size 30M;
…
* данной настройкой мы также разрешим загрузку файлов размером 30 Мб .
Перезапустим nginx для применения настройки:
systemctl restart nginx
Теперь открываем браузер и переходим по адресу http://<IP-адрес сервера>/webmail/installer/ . В самом низу нажимаем по кнопке Next . Если кнопка будет неактивна, проверяем, что нет ошибок ( NOT OK ).
На следующей странице проверяем, что все пункты находятся в состоянии OK . Установка выполнена.
Открываем конфигурационный файл roundcube:
vi /var/www/html/webmail/config/config.inc.php
Запрещаем установку портала:
$config[‘enable_installer’] = false;
После удаляем папку с установочными скриптами:
rm -rf /var/www/html/webmail/installer
И заходим в браузере по адресу http://<IP-адрес сервера>/webmail/ . Вводим в качестве логина адрес почты созданного пользователя и его пароль.
Если при попытке отправки письма через Roundcube мы получим ошибку аутентификации, переходим к описанию решения .
Антивирус требует много ресурсов. Будьте готовы, что после его запуска сервер начнет работать медленнее и понадобится добавить ресурсы.
Устанавливаем необходимые для работы антивируса и антиспама компоненты:
apt install amavisd-new clamav clamav-daemon spamassassin
Добавляем пользователя clamav в группу amavis:
usermod -a -G amavis clamav
Открываем конфигурационный файл amavis:
vi /etc/amavis/conf.d/15-content_filter_mode
Снимаем комментарии для строк:
…
@bypass_virus_checks_maps = (
%bypass_virus_checks, @bypass_virus_checks_acl, $bypass_virus_checks_re);
…
@bypass_spam_checks_maps = (
%bypass_spam_checks, @bypass_spam_checks_acl, $bypass_spam_checks_re);
…
* по умолчанию amavis не выполняем никаких проверок — для включения сканирования на вирусы снимаем комментарий с bypass_virus_checks_maps , а для сканирования на СПАМ — bypass_spam_checks_maps .
Затем открываем на редактирование:
vi /etc/amavis/conf.d/50-user
Добавим строки:
$allowed_header_tests{‘multiple’} = 0;
$allowed_header_tests{‘missing’} = 0;
* данные опции позволят программе Outlook без ошибок отправлять тестовое сообщение.
Разрешаем запуск антивируса и amavis:
systemctl enable clamav-daemon clamav-freshclam amavis
Перезапускаем сервисы:
systemctl restart amavis clamav-daemon clamav-freshclam
Добавляем в postfix:
vi /etc/postfix/main.cf
content_filter = scan:[127.0.0.1]:10024
* где content_filter указывает на приложение, которое будет сканировать сообщения;
Теперь редактируем master.cf:
vi /etc/postfix/master.cf
Дописываем следующее:
scan unix — — n — 16 smtp
-o smtp_send_xforward_command=yes
-o smtp_enforce_tls=no
127.0.0.1:10025 inet n — n — 16 smtpd
-o content_filter=
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
-o smtpd_helo_restrictions=
-o smtpd_client_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks_style=host
-o smtpd_authorized_xforward_hosts=127.0.0.0/8
* итак, данной настройкой мы создадим два вспомогательных сервиса scan и 127.0.0.1:10025 (сервис без имени, он просто будет слушать на порту 10025 — это порт по умолчанию, на который отправляет сообщение amavis после выполнения проверки). Также, мы используем следующие опции:
Перезапускаем postfix:
systemctl restart postfix
Для обновления базы антиспама выполняем команду:
sa-update —nogpg —verbose
Для настройки автоматического обновления, редактируем cron:
crontab -e
30 3 * * * /usr/bin/sa-update
* в данном примере, каждый день в 03:30 будет запускаться процесс обновления антиспама.
Так как серверы обновление антивируса заблокированы для российских IP-адресов, вносим изменения в конфигурацию.
Открываем файл:
vi /etc/clamav/freshclam.conf
Комментируем строки, которые начинаются на ##DatabaseMirror
##DatabaseMirror …
##DatabaseMirror …
Добавляем строку:
PrivateMirror https://clamav-mirror.ru/
PrivateMirror http://mirror.truenetwork.ru/clamav/
PrivateMirror https://packages.microsoft.com/clamav/
ScriptedUpdates no
Останавливаем службу clamav-freshclam:
systemctl stop clamav-freshclam
Удаляем старую информацию об обновлениях:
rm -f /var/lib/clamav/freshclam.dat
Запускаем обновление:
freshclam
Ждем обновления, после запускаем службу clamav-freshclam и перезапускаем clamav-daemon:
systemctl start clamav-freshclam
systemctl restart clamav-daemon
Для проверки антивируса отправляем сообщение со следующим содержимым:
X5O!P%@AP[4PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
Большинство почтовых систем экранируют вирусную последовательность и письмо нормально пройдет мимо нашего антивируса. Чтобы сделать корректный тест, необходимо отправить письмо SMTP-командами .
Письмо не должно дойти, а в логе (/var/log/maillog) мы увидим строку:
… amavis[17688]: (17688-04) Blocked INFECTED (Eicar-Signature) {DiscardedOutbound,Quarantined}, MYNETS LOCAL …
… relay=127.0.0.1[127.0.0.1]:10024, delay=0.25, delays=0.19/0/0/0.06, dsn=2.7.0, status=sent (250 2.7.0 Ok, discarded, id=17688-04 — INFECTED: Eicar-Signature )
Для проверки работы контентного антиспама, отправляем письмо со следующим содержимым:
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
В итоге, письмо не должно прийти, а в логах мы увидим:
… amavis[17689]: (17689-04) Blocked SPAM {DiscardedOutbound,Quarantined}, MYNETS LOCAL …
… status=sent (250 2.7.0 Ok, discarded, id=17689-04 — spam )
Все письма со спамом и вирусами будут перемещаться в карантин. Если мы хотим перенаправлять все подобные сообщения на специальный ящик, то необходимо настроить amavis.
Открываем конфигурационный файл:
vi /etc/amavis/conf.d/50-user
Добавляем такие опции:
$spam_quarantine_to = «spam@remontka.com»;
$virus_quarantine_to = «virus@remontka.com»;
* где $spam_quarantine_to указываем на адрес для перенаправления СПАМ-писем; $virus_quarantine_to — почта для писем с обнаруженными вирусами.
После перезагрузим amavis:
systemctl restart amavis
Пробуем отправить сообщения с тестовыми сигнатурами на СПАМ и вирус — письма должны быть перенаправлены на указанные адреса.
Мы рассмотрим несколько разных методов борьбы со СПАМом средствами Postfix, которые дополняют друг друга, делаю защиту более эффективной.
В MTA Postfix встроен свой механизм проверки заголовков входящих сообщений. Правила размещаются в 7 секций, обработка которых выполняется в следующем порядке:
client -> helo -> sender -> relay -> recipient -> data -> end_of_data
Чтобы лучше понять принцип, мы должны знать SMTP-команды при выполнении отправки почты. И так, порядок, следующий:
И так, для настройки антиспама открываем конфигурационный файл main.cf :
vi /etc/postfix/main.cf
Комментируем строку:
#smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
И добавляем:
smtpd_client_restrictions =
permit_mynetworks
permit_sasl_authenticated
reject_unauth_pipelining
permit
smtpd_helo_restrictions =
permit
smtpd_sender_restrictions =
permit_mynetworks
permit_sasl_authenticated
reject_non_fqdn_sender
reject_unknown_sender_domain
permit
smtpd_relay_restrictions =
permit_mynetworks
permit_sasl_authenticated
defer_unauth_destination
smtpd_recipient_restrictions =
permit_mynetworks
permit_sasl_authenticated
reject_non_fqdn_recipient
reject_unauth_destination
reject_unknown_recipient_domain
reject_unverified_recipient
permit
smtpd_data_restrictions =
permit
smtpd_end_of_data_restrictions =
permit
* где параметры:
… и значения для них:
* это более или менее мягкие правила. Их можно использовать первое время, пока тестируем сервер.
Для усиления защиты добавляем:
smtpd_recipient_restrictions =
…
reject_unknown_client_hostname
reject_invalid_helo_hostname
reject_non_fqdn_helo_hostname
reject_unknown_helo_hostname
reject_rbl_client bl.spamcop.net
reject_rbl_client cbl.abuseat.org
reject_rbl_client dul.ru
reject_rbl_client dnsbl.abuse.ch
permit
* где:
* более подробное описание опций для защиты можно найти на странице main.cf(5) .
После внесения всех правок, необходима перезагрузка Postfix:
systemctl restart postfix
Проверка SPF позволит отбрасывать все попытки отправить сообщения от доменов, которые не прошливалидацию по SPF.
Устанавилваем пакет:
apt install postfix-policyd-spf-python
Открываем конфигурационный файл postfix:
vi /etc/postfix/main.cf
Добавляем опции:
policy-spf_time_limit = 3600s
…
smtpd_recipient_restrictions =
…
check_policy_service unix:private/policy-spf
permit
* где:
Открываем файл:
vi /etc/postfix/master.cf
Добавим строки:
…
policy-spf unix — n n — — spawn
user=nobody argv=/usr/bin/policyd-spf
Перезапускаем постфикс:
systemctl restart postfix
По умолчанию, политика блокирует письма, только если владелец домена указал жесткую блокировку (использовал -all, вместо ~all). Если мы хотим указать более жесткую политику, открываем файл:
vi /etc/postfix-policyd-spf-python/policyd-spf.conf
Задаем значения для опций HELO_reject и Mail_From_reject :
…
HELO_reject = Fail
Mail_From_reject = Softfail
* в данном примере мы будем блокировать письма:
Подробнее информацию об опциях конфигурационного файла policyd-spf.conf можно узнать командой:
man policyd-spf.conf
Часто можно наблюдать ситуацию, когда приходит спам от своих же ящиков (или ящиков своего домена, хотя таких почтовых адресов у нас не существует).
Это происходит из-за возможности в поле FROM подставить любой адрес. А адрес от своей организации может внушить доверие, что побудит пользователя откликнуться на нежелательное сообщение.
Для решения проблемы в Postfix нужно добавить простое правило:
vi /etc/postfix/main.cf
smtpd_sender_restrictions =
…
check_sender_access hash:/etc/postfix/sender_access
permit
Создадим сам файл:
vi /etc/postfix/sender_access
remontka.com REJECT Relay from remontka.com are denied
* в данном примере мы будет отклонять все попытки отправить почту с чужих серверов от нашего домена remontka.com .
Создаем карту:
postmap /etc/postfix/sender_access
Перезапускаем постфикс:
systemctl restart postfix
Мы установили amavis, который проверяет почту на СПАМ средствами spamassassin. Последний без обучения, практически, бесполезен. Синтаксис команды для обучения следующий:
sa-learn —spam <папка с нежелательными письмами>
sa-learn —ham <папка письмами, которые ошибочно определены как СПАМ>
Таким образом, первая команда укажет spamassassin какие письма являются нежелательными, а вторая — не несущими рекламный характер.
Хорошей практикой будет договориться с пользователями о ручном помещении нежелательной почты из входящих в папку СПАМ. Тогда мы сможем пройтись скриптом по всем ящикам на сервере и обучать антиспам. Например, такой командой:
sa-learn —spam /var/mail/remontka.local/*/{.&BCEEPwQwBDw-,.Spam,.Junk E-mail,.Junk}/cur
* в данном примере мы сказали spamassassin найти в каталогах пользователей папки Спам, Spam, Junk, Junk E-mail (данные каталоги являются типичными для помещения СПАМа) и провести обучение.
Чтобы минимизировать количество ложных срабатываний, необходимо проводить обучение с ключом —ham. В нашем примере мы отправляем все нежелательные письма на ящик spam. В таком случае, необходимо вручную находить ложные срабатывания и переносить их в специальную папку, например, Ham. Тогда команда для обучения будет такой:
sa-learn —ham /var/mail/remontka.local/spam@remontka.local/.Ham/cur
Статистику обучения можно посмотреть командой:
sa-learn —dump magic
Для отправки почты на другие почтовые серверы необходимо правильно сконфигурировать сервер, чтобы письма не попадали в СПАМ. Чтобы это сделать, выполняем инструкции ниже.
Многие почтовые серверы делают запросы в систему доменных имен для проверки легитимности почтового сервера, отправляющего почту. При настройке MTA очень важно правильно добавить необходимые записи в DNS.
1. rDNS. Обратная зона используется для проверки соответствия имени сервера в приветствии с именем, которое возвращает NS сервер при запросе по PTR-записи.
И так, для создания записи в обратной зоне, необходимо написать письмо Интернет провайдеру, к сети которого подключен сервер или хостеру, если почтовый сервер настроен на VPS. IP-адрес нашего сервера должен вести на имя, которым приветствуется наш postfix — можно посмотреть командой:
postconf -n smtpd_banner
Если мы получим пустой ответ, то вводим:
postconf -n myhostname
Если и в этот вариант не вернет ответ, вводим:
hostname
2. А-запись. Также необходимо, чтобы имя сервера, которым представляется почтовый сервер разрешалось в IP-адрес.
Для этого заходим в консоль управления зоной нашего домена и создаем запись типа А для сопоставления имени сервера с IP-адресом, на котором слушает запросы данный сервер.
Для каждого домена, для которого будем отправлять почту создаем записи:
Для проверки корректности настройки сервера, воспользуемся ресурсами:
Подпись писем не является обязательной, но помогает не попадать в СПАМ. DKIM настраивается для каждого домена, а также должна создаваться специальная запись в DNS. Рассмотрим создание и настройку DKIM в amavisd.
Для удобства создадим переменную, в которую внесем имя домена, для которого будем получать подпись DKIM:
export DOMAIN=remontka.com
Создаем каталог для хранения ключей:
mkdir -p /var/lib/dkim
Генерируем последовательность для нашего домена:
amavisd genrsa /var/lib/dkim/${DOMAIN}.pem 1024
Для версий постарее используется команда amavisd-new:
amavisd-new genrsa /var/lib/dkim/${DOMAIN}.pem 1024
* где ${DOMAIN} — домен, для которого мы сгенерируем подпись dkim.
Задаем права на созданный файл:
chown amavis:amavis /var/lib/dkim/*.pem
chmod 0400 /var/lib/dkim/*.pem
Открываем конфигурационный файл amavisd:
vi /etc/amavis/conf.d/20-debian_defaults
Редактируем запись:
#$inet_socket_port = 10024;
$inet_socket_port = [10024,10026];
* в данном примере мы закомментировали первую строку и раскомментировали вторую. Это укажет amavis, что он должен запускаться и работать на двух портах.
А также добавим:
$forward_method = ‘smtp:[127.0.0.1]:10025’;
$notify_method = $forward_method;
$interface_policy{‘10026’} = ‘ORIGINATING’;
$policy_bank{‘ORIGINATING’} = {
originating => 1,
smtpd_discard_ehlo_keywords => [‘8BITMIME’],
os_fingerprint_method => undef,
bypass_banned_checks_maps => [1],
bypass_header_checks_maps => [1],
bypass_banned_checks_maps => [1],
virus_admin_maps => [«virusalert@$mydomain»],
};
Выводим на экран настройку для amavis:
cat <<EOF
dkim_key(‘${DOMAIN}’, «dkim», «/var/lib/dkim/${DOMAIN}.pem»);
@dkim_signature_options_bysender_maps = ( {
«${DOMAIN}» => { d => «${DOMAIN}», a => ‘rsa-sha256’, ttl => 10*24*3600 },
});
EOF
Копируем содержимое и добавляем ее в конфигурационный файл 50-user.
Открываем его:
vi /etc/amavis/conf.d/50-user
Добавляем:
…
$enable_dkim_verification = 1;
$enable_dkim_signing = 1;
…
Также добавляем содержимое, которое выводили на экран. В моем случае получилось так:
…
dkim_key(‘remontka.com’, «dkim», «/var/lib/dkim/remontka.com.pem»);
@dkim_signature_options_bysender_maps = ( {
«remontka.com» => { d => «remontka.com», a => ‘rsa-sha256’, ttl => 10*24*3600 },
});
…
* где remontka.com — домен, для которого мы настраиваем dkim; /var/lib/dkim/remontka.com.pem — путь до сгенерированного файла с последовательностью.
Перезапускаем amavis:
systemctl restart amavis
Посмотреть DKIM последовательность для нового домена можно командой:
amavisd showkeys
В старых версиях Debian нужно использовать amavisd-new :
amavisd-new showkeys
Мы должны увидеть что-то на подобие:
; key#1 1024 bits, i=dkim, d=remontka.com, /var/lib/dkim/remontka.com.pem
dkim._domainkey.remontka.com. 3600 TXT (
«v=DKIM1; p=»
«MIGfMA0SDFqGSIb3DQEBAQUAA4GNADCBiQKBgQC44iOK+99mYBxsnIl1Co8n/Oeg»
«4+x90sxqWzoGW42d/GCP4wiYqVqncc37a2S5Berv0OdoCGcmkDkKWh4CHhFD4blk»
«x6eMYXsp1unAdo2mk/OVK7M2ApraIkh1jVbGBZrREVZYTE+uPOwtAbXEeRLG/Vz5»
«zyQuIpwY2Nx3IgEMgwIDAQAB»)
Теперь нам нужно на основе данного вывода создать в DNS запись TXT. В данном примере, нужно создать запись c именем dkim._domainkey в зоне remontka.com и значением «v=DKIM1; p=MIGfMA0SD…wIDAQAB».
Проверить корректность настройки DKIM можно командой:
amavisd testkeys
Переходим к настройке Postfix. Мы должны добавить отправку всех исходящих писем на проверку в amavis на порт 10026 и принимать обратно письма на порт 10027.
Открываем файл:
vi /etc/postfix/master.cf
Отредактируем submission и smtps , добавив content_filter :
smtp inet n — y — — smtpd
-o content_filter=scan:[127.0.0.1]:10026
…
submission inet n — n — — smtpd
-o content_filter=scan:[127.0.0.1]:10026
…
smtps inet n — n — — smtpd
-o content_filter=scan:[127.0.0.1]:10026
…
И добавим:
127.0.0.1:10027 inet n — n — 16 smtpd
-o content_filter=
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
-o smtpd_helo_restrictions=
-o smtpd_client_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks_style=host
-o smtpd_authorized_xforward_hosts=127.0.0.0/8
Перезапускаем postfix:
systemctl restart postfix
Настраиваем Roundcube:
vi /var/www/html/webmail/config/config.inc.php
Находим строки:
$config[‘smtp_server’] = »;
…
$config[‘smtp_port’] = 25;
… и меняем ее на:
$config[‘smtp_server’] = ‘tls://localhost’;
…
$config[‘smtp_port’] = 587;
* в данном примере мы указали, что соединение для отправки почты должно быть защищенным. Это важно для нашей настройки DKIM.
Пробуем отправить письмо — в заголовках мы должны увидеть:
dkim=pass header.d=remontka.com
Задаем переменную:
export DOMAIN=remontka2.ru
Генерируем последовательность для нашего домена:
amavisd genrsa /var/lib/dkim/${DOMAIN}.pem 1024
Задаем права на созданный файл:
chown amavis:amavis /var/lib/dkim/*.pem
chmod 0400 /var/lib/dkim/*.pem
Выводим на экран настройку для amavis:
cat <<EOF
dkim_key(‘${DOMAIN}’, «dkim», «/var/lib/dkim/${DOMAIN}.pem»);
«${DOMAIN}» => { d => «${DOMAIN}», a => ‘rsa-sha256’, ttl => 10*24*3600 },
EOF
Открываем конфигурационный файл amavis:
vi /etc/amavis/conf.d/50-user
Добавляем содержимое, которое выводили на экран. В моем случае получилось так:
…
dkim_key(‘remontka.com’, «dkim», «/var/lib/dkim/remontka.com.pem»);
dkim_key(‘remontka.com’, «dkim», «/var/lib/dkim/remontka2.ru.pem»);
@dkim_signature_options_bysender_maps = ( {
«remontka.com» => { d => «remontka.com», a => ‘rsa-sha256’, ttl => 10*24*3600 },
«remontka2.ru» => { d => «remontka2.ru», a => ‘rsa-sha256’, ttl => 10*24*3600 },
});
…
* где remontka2.ru — второй домен, для которого мы настраиваем dkim; /var/lib/dkim/remontka2.ru.pem — путь до сгенерированного файла с последовательностью.
Перезапускаем amavis:
systemctl restart amavis
Посмотреть DKIM последовательность для нового домена можно командой:
amavisd showkeys
В PostfixAdmin у нас есть возможность задать квоты на почтовые ящики, но они работать не будут, так как о них ничего не знает Dovecot.
Процесс настройки не сложен и описан отдельно в статье Настройка квот в Dovecot + PostfixAdmin .
После применения квот мы сможем наблюдать в почтовом клиенте Roundcube информацию об оставшемся дисковом пространстве:
… или в Webmail Lite:
Для автоматического конфигурирования почтовых клиентов необходимо настроить сервис autodiscover. Для этого настраиваем веб-сервер, который будет возвращать почтовые настройки для домена.
Подробнее процесс настройки описан в статье Настройка Autodiscover для своего почтового сервера .
По умолчанию, все почтовые клиенты, кроме Outlook распознают служебные папки IMAP:
Данные каталоги переводятся на русский язык и корректно отображаются в клиенте. В Outlook эти папки отображаются как есть — на английском языке.
Для решения проблемы мы должны открыть файл:
vi /etc/dovecot/conf.d/15-mailboxes.conf
Найти блок настроек namespace inbox . Для каждого из служебного каталога настроить следующее:
namespace inbox {
…
mailbox Черновики {
auto = subscribe
special_use = Drafts
}
mailbox Drafts {
auto = no
special_use = Drafts
}
mailbox Спам {
auto = subscribe
special_use = Junk
}
mailbox Junk {
auto = no
special_use = Junk
}
mailbox Spam {
auto = no
special_use = Junk
}
mailbox «Junk E-mail» {
auto = no
special_use = Junk
}
mailbox Удаленные {
auto = subscribe
special_use = Trash
}
mailbox Trash {
auto = no
special_use = Trash
}
mailbox «Deleted Messages» {
auto = no
special_use = Trash
}
mailbox Отправленные {
auto = subscribe
special_use = Sent
}
mailbox Sent {
auto = no
special_use = Sent
}
mailbox «Sent Messages» {
auto = no
special_use = Sent
}
mailbox «Sent Items» {
auto = no
special_use = Sent
}
..
}
* и так, мы задали несколько вариантов служебных каталогов:
Для применения настроек перезапускаем dovecot:
systemctl restart dovecot
Рассмотрим дополнительные настройки для нашего сервера.
Также важно настроить некоторые ограничения, например:
Подробнее, информацию можно найти в статье Лимиты в Postfix .
Предположим, мы сделали ошибку в написании адреса электронной почты, но не хотим удалять учетную запись и создавать ее по новой. Рассмотрим смену email-адреса на примере sekretar@remontka.com -> secretar@remontka.com.
Нам нужно внести изменения в базу данных — для этого заходим в оболочку sql:
mysql -uroot -p
Вводим пароль, который создавали после установки СУБД.
Используем базу postfix:
> use postfix
Редактируем алиасы командой:
> UPDATE alias SET `address`=’secretar@remontka.com’, `goto`=REPLACE(`goto`, ‘sekretar@remontka.com’, ‘secretar@remontka.com’) WHERE `address`=’sekretar@remontka.com’;
Редактируем почтовый ящик:
> UPDATE mailbox SET `username`=’secretar@remontka.com’, `local_part`=’secretar’, `maildir`=REPLACE(`maildir`, ‘/sekretar/’, ‘/secretar/’) WHERE `username`=’sekretar@remontka.com’;
И квоту:
> UPDATE quota2 SET `username`=’secretar@remontka.com’ WHERE `username`=’sekretar@remontka.com’;
С базой данных закончили — выходим из sql:
> quit
Переходим в каталог с почтовыми ящиками пользователей для нашего домена:
cd /var/mail/remontka.com/
Перемещаем папку с почтой старого ящика в новый:
mv sekretar@remontka.com secretar@remontka.com
Проверяем работу через веб-интерфейс. Если используем почтовый клиент, меняем настройки для использования нового email-адреса.
Рассмотрим некоторые проблемы, с которыми столкнулся я.
При попытке подключиться к серверу мы можем увидеть ошибку «Невозможно установить безопасное соединение с сервером «IMAP».
Причина: в старых системах используется по умолчанию TLS 1.0, поддержка которого уже отсутствует.
Решение: необходимо выполнить 3 действия.
1. Устанавливаем обновление KB3140245 .
2. Создаем две ветки реестра:
Это можно выполнить вручную в утилите regedit или ввести команды:
reg add «HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSchannelProtocolsTLS 1.1Client»
reg add «HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSchannelProtocolsTLS 1.2Client»
В созданных ветках создаем параметр DisabledByDefault с типом DWORD (32 бита) и значением 0 . Это можно выполнить командами:
reg add «HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSchannelProtocolsTLS 1.1Client» /v DisabledByDefault /t REG_DWORD /d 0
reg add «HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSchannelProtocolsTLS 1.2Client» /v DisabledByDefault /t REG_DWORD /d 0
3. Перезагружаем компьютер.
При попытке отправки письма программа выдает ошибку аутентификации.
Причина: ошибка при передаче пароля самой программой Roundcube.
Решение: необходимо отредактировать конфигурационный файл Roundcube.
Открываем файл:
vi /var/www/html/webmail/config/config.inc.php
Находим опцию:
$config[‘smtp_pass’] = ‘%p’;
И приводим к виду:
$config[‘smtp_pass’] = »;
Zulip — программное обеспечение для реализации корпоративного чата. Разработан в 2012 году, в 2014 был…
Zookeeper — cервис-координатор, который позволяет обеспечить контроль синхронизации данных. Разработан на Java компанией Apache Software…
Zimbra — программное обеспечение для реализации почтового сервиса или, если сказать точнее, автоматизации совместной деятельности…
Zabbix — бесплатная система мониторинга. Позволяет отслеживать состояние сетевых узлов, компьютеров и серверов. Возможности: Поддержка…
YouTube — компания-владелец одноименного портала для просмотра и хранения видео. Чтобы пользоваться данным порталом достаточно…
Yota — провайдер, предоставляющий доступ к сети Интернет по беспроводной связи. Впервые, сервис начал работать…