В iRedMail Pro есть API для управления почтовыми ящиками. Мы же рассмотрим процесс создания почтового ящика с помощью своего скрипта в бесплатной версии почтового сервера. В статье будет описан случай, когда учетные записи для почты хранятся в СУБД (MariaDB).
Мы рассмотрим отдельно SQL-запрос для создания почтового ящика в базе данных, а после — скрипт на php, из которого можно будет сделать свой мини API.
Описание запроса в базу данных
Пример скрипта на PHP
Предварительная настройка СУБД
Листинг скрипта
Применение скрипта, как API
По умолчанию, почтовые ящики iRedMail хранятся в базе данных vmail , таблице mailbox . Чтобы создать новый, нужно просто выполнить SQL-запрос на вставку новой записи. В самой таблице более 50 полей, но нам нужно заполнить всего 6:
Остальные поля можно не указывать — значения для них по умолчанию нас, вполне, устроят.
И так, чтобы получить хэш для пароля нового почтового ящика в командной строке на сервере iRedmail выполняем команду:
doveadm pw -s ‘ssha512’ -p ‘password123’
* где doveadm — административная утилита dovecot, которая устанавливается вместе с iredmail; ssha512 — указание алгоритма шифрования; password123 — наш пароль.
В результате выполнения команды мы получим что-то на подобие:
{SSHA512}iNX3KgDLYVvA+nQKlJf4GUVOTLwiyxYpBoAD1NBs1CK0rIG4XVbPXWWeN5lRrMXljQD16s9q9ny+EO8iX7SpnbH/+K0=
Это и будет хэш пароля, который мы будем использовать для запроса.
И так, синтаксис самого запроса SQL выглядит так:
INSERT INTO mailbox (`username`, `password`, `language`, `maildir`, `domain`, `created`) VALUES (‘<username>’, ‘<password>’, ‘<language>’, ‘<maildir>’, ‘<domain>’, ‘<created>’);
Пример запроса:
INSERT INTO mailbox (`username`, `password`, `language`, `maildir`, `domain`, `created`) VALUES (‘testmaster@remontka.com’, ‘{SSHA512}iNX3KgDLYVvA+nQKlJf4GUVOTLwiyxYpBoAD1NBs1CK0rIG4XVbPXWWeN5lRrMXljQD16s9q9ny+EO8iX7SpnbH/+K0=’, ‘ru_RU’, ‘remontka.com/t/e/s/testmaster-2020.02.25.22.52.53/’, ‘remontka.com’, ‘2020-02-25 22:53:50’);
* в данном запросе мы добавим почтовый ящик testmaster@remontka.com с паролем password123 (хэш мы генерировали выше), по умолчанию для пользователя будет использоваться русский язык. Обратите внимание на каталог для почты remontka.com/t/e/s/testmaster-2020.02.25.22.52.53 — как и говорилось выше, его путь собран из домена, первых 3-х букв в имени пользователя, а также даты и времени создания почтового ящика.
Данный запрос можно выполнить в phpmyadmin или командной консоли mysql — для подключения к ней на почтовом сервере вводим:
mysql -uroot -p
… и вводим пароль пользователя root от СУБД. После подключаемся к базе vmail:
> use vmail
Можно выполнять запросы.
После можно проверить работоспособность почтовых ящиков с помощью roundcube или другого почтового клиента.
Разобравшись с процессом создания записи в базе данных, создадим скрипт, который будет проверять нет ли уже такой учетной записи и сложность ее пароля. Разобьем процесс на подготовку базы данных и написание самого скрипта.
Для того, чтобы максимально обезопасить работу с данными, мы создадим отдельного пользователя в MariaDB / MySQL, который будет иметь доступ на чтение и запись только в таблицу mailbox.
На сервере заходим в командную оболочку SQL:
mysql -uroot -p
Создаем пользователя, от которого будет вестись работа с таблицей mailbox:
> GRANT SELECT, UPDATE, INSERT ON vmail.mailbox TO ‘apiuser’@’localhost’ IDENTIFIED BY ‘123password!’;
* в данном примере мы создаем пользователя apiuser , который сможет подключиться к базе только с локального сервера (предполагается, что скрипт будет работать на сервере iRedMail). Пароль пользователя будет 123password! , а доступ ограничен только на запросы SELECT, UPDATE, INSERT и только на таблицу mailbox базы vmail .
Подробнее процесс создания пользователя в СУБД на базе MySQL описан в инструкции Создание пользователей MySQL/MariaDB и предоставление прав доступа .
После настройки привилегий, можно приступить к написанию самого скрипта.
И так, сам скрипт будет выглядеть так:
Описание скрипта:
Строки | Описание |
---|---|
3-7 | Функция подключения к базе данных. в данном примере идет соединение от учетной записи, которую мы создали при настройке MySQL выше. В итоге, функция возвращает переменную со ссылкой подключения к базе. |
9-22 | Данная функция проверяет корректность добавляемого пользователя. Сначала мы проверяем, есть ли уже такой пользователь в базе, и если есть — возвращаем ошибку. После мы проверяем формат введенного email адреса. |
24-37 | Проверяем пароль на сложность. В первую очередь мы проверяем, что пароль более 7 символов. Во вторую — что в пароле есть и символы и цифры. |
39-67 | Данная функция, собственно, создает учетную запись. Сначала мы вызываем функцию проверки на наличие в базе и правильности формата введенного имени создаваемой записи, затем проверяем пароль. Если проверки не вернули ошибку, мы выполняем запрос SQL на вставку записи. |
69 | Задаем переменную с именем учетной записи. В качестве значения мы принимаем переменную, отправленную в виде запроса POST. |
70 | Задаем переменную с паролем. В качестве значения мы принимаем переменную, отправленную в виде запроса POST. |
71 | Указываем минимальную длину пароля, который должен задаваться учетной записи. |
73 | Вызываем функцию подключения к базе, результат заносим в переменную. |
74 | Вызываем функцию создания учетной записи. Результат ее работы заносим в переменную $result. |
76 | Выводим содержимое переменной $result. |
Полученный нами скрипт нужно скопировать на веб-сервер — мы получим возможность отправлять на него запросы POST, что позволит говорить о создании примитивного API по созданию почтовых учетных записей на сервере iRedMail.
Для запуска написанного нами скрипта нужно отправить POST запрос на http-сервер. Пример скрипта на PHP, который это делает:
Описание скрипта:
Строки | Описание |
---|---|
3-15 | Функция отправки POST запроса с помощью CURL. В качестве аргументов она принимает http-адрес, на который нужно отправить запрос и массив данных. Возвращает функция ответ нашего скрипта. |
17 | Задаем переменную с адресом, на который будет отправлен запрос. В моем примере это api.remontka.com — от будет запускать написанный нами скрипт для создания почтового ящика. |
18 | Создаем массив данных — в качестве первого элемента передаем username, второго — password. |
19 | Вызываем нашу функцию по отправке запроса POST. Результат передаем в переменную $result. |
20 | Выводим на экран содержимое ответа (переменная $result). |
Zulip — программное обеспечение для реализации корпоративного чата. Разработан в 2012 году, в 2014 был…
Zookeeper — cервис-координатор, который позволяет обеспечить контроль синхронизации данных. Разработан на Java компанией Apache Software…
Zimbra — программное обеспечение для реализации почтового сервиса или, если сказать точнее, автоматизации совместной деятельности…
Zabbix — бесплатная система мониторинга. Позволяет отслеживать состояние сетевых узлов, компьютеров и серверов. Возможности: Поддержка…
YouTube — компания-владелец одноименного портала для просмотра и хранения видео. Чтобы пользоваться данным порталом достаточно…
Yota — провайдер, предоставляющий доступ к сети Интернет по беспроводной связи. Впервые, сервис начал работать…