# Добавьте пользовательские клиенты веб-почты

По умолчанию Plesk для Linux поддерживает клиента веб-почты RoundCube. Чтобы добавить пользовательские клиенты веб-почты, их нужно настроить с помощью Plesk SDK.

Пользовательские клиенты веб-почты добавляются путем их интеграции как модулей веб-почты. После этого пользовательский клиент веб-почты станет доступен как вам, так и пользователям Plesk во всех интерфейсах Plesk: в GUI, CLI и через API.

## Хук PleskSDKHookWebmail

Чтобы добавить пользовательский клиент веб-почты, используйте хук `Plesk\SDK\Hook\Webmail`. Нужно вернуть анонимный класс, который отнаследован от хука и имплементирует метод `getWebmails`.

Этот класс должен находиться в папке `/usr/local/psa/admin/plib/modules/custom-webmail/hooks/`.

## Пример

`/usr/local/psa/admin/plib/modules/custom-webmail/hooks/Webmail.php`

    <?php

    return new class extends \Plesk\SDK\Hook\Webmail
    {
        public function getWebmails(): array
        {
            return [
                (new \Plesk\SDK\Webmail('custommail', 'Custom Webmail 1.2.5'))
                    ->setLoginLinkTemplate('{{ protocol }}://webmail.{{ domainName }}/?user={{ fullMailName }}')
                    ->setIsVisibleForDomainCallback(fn (\pm_Domain $domain): bool => $domain->hasPermission('custommail')),
            ];
        }
    }

Примечание

Метод должен вернуть массив классов `\Plesk\SDK\Webmail`. Первый аргумент конструктора `\Plesk\SDK\Webmail` должен быть уникальным внутри вашего модуля, так как неуникальные экземпляры перезаписывают ранее созданные записи.

## Настройка шаблона для входа по ссылке

Используя классы `\Plesk\SDK\Webmail`. вы можете задать шаблон входа по ссылке. Пользователи будут входить в веб-почту по ссылке, которая открывает веб-почту в отдельном окне браузера. Если в Настройках почты домена выбрана пользовательская веб-почта, ссылка будет отображаться справа от учетной записи электронной почты в Сайты и домены > домен > вкладка «Почта» > Учетные записи почты.

Шаблон ссылки для входа (`'{{ protocol }}://webmail.{{ domainName }}/?user={{ fullMailName }}')`) сделан на основе системы шаблонов Mustache и имеет следующую структуру:

- `protocol`: `http` или `https`

- `domainName`: имя домена символами ASCII. При необходимости оно автоматически конвертируется в Punycode.

- `mailName`: локальная часть адреса электронной почты (до символа «@»)

- `fullMailName`: полный адрес электронной почты, зашифрованный в URL-адресе (локальная и доменная части с символом «@»)

Шаблон автоматически заменяет части действительными значениями для создания ссылки для входа. Например, ссылка для входа `john_doe@example.com`, если для домена `example.com` включен HTTPS, будет выглядеть так:

    https://webmail.example.com/?user=john_doe%40example.com

## Удаление пользовательской веб-почты из интерфейса

Вы можете ограничить доступ к пользовательской веб-почте в зависимости от подписки или хостинг-плана. Таким образом, для всех доменов определенной подписки или хостинг плана пользовательский клиент веб-почты не будет отображаться в GUI, CLI и API.

Чтобы удалить пользовательскую веб-почту:

1. Задайте разрешение с помощью хука pm_Hook_Permissions:

       class Modules_CustomMail_Permissions extends pm_Hook_Permissions
       {
           public function getPermissions(): array
           {
               return [
                   'access_to_custommail' => [
                       'default' => true,
                       'place' => self::PLACE_ADDITIONAL,
                       'name' => 'Custom Webmail',
                       'description' => 'Grants access to Custom Webmail.',
                   ],
               ];
           }
       }

2. Используйте классы `\Plesk\SDK\Webmail`, чтобы провести обратный вызов, который принимает `\pm_Domain` в качестве параметра и возвращает значение типа boolean методу `setIsVisibleForDomainCallback`:

       <?php

       return new class extends \Plesk\SDK\Hook\Webmail
       {
           public function getWebmails(): array
           {
               return [
                   (new \Plesk\SDK\Webmail('custommail', 'Custom Webmail 1.2.5'))
                       ->setLoginLinkTemplate('{{ protocol }}://webmail.{{ domainName }}/?user={{ fullMailName }}')
                       ->setIsVisibleForDomainCallback(fn (\pm_Domain $domain): bool => $domain->hasPermission('access_to_custommail')),
               ];
           }
       }

3. Удаление пользовательской веб-почты для всех доменов определенной подписки или хостинг-плана:

   - (Подписка) Перейдите в Подписки > подписка > нажмите «Настроить» в правой панели > на вкладке «Разрешения» отключите разрешение «Пользовательская веб-почта».

   - (Хостинг-план) Перейдите в Тарифные планы > хостинг-план > вкладка «Разрешения» и отключите разрешение «Пользовательская веб-почта».

## Создание конфигурации веб-почты

Для стабильной работы всех клиентов веб-почты требуется определенная конфигурация веб-сервера. Чтобы настроить веб-почту, используйте методы `getWebmailApacheConfig` и `getWebmailNginxConfig` класса `pm_Hook_WebServer`. Подробнее об этом в этой теме.

Методы `getWebmailApacheConfig` и `getWebmailNginxConfig` получат объект `\pm_Domain` как первый параметр и строку с типом веб-почты как второй параметр. Конфигурацию можно создать на основе полученного типа веб-почты. Например, если он соответствует типу веб-почты, который вы зарегистрировали с помощью хука `\Plesk\SDK\Hook\Webmail`:

    class Modules_CustomMail_WebServer extends \pm_Hook_WebServer
    {
        private Configuration $generator;

        <...>

        public function getWebmailApacheConfig(pm_Domain $domain, string $type): string
        {
            if ($type === 'custommail') {
                return $this->generator->getApacheConfiguration();
            }

            return '';
        }

        public function getWebmailNginxConfig(pm_Domain $domain, string $type): string
        {
            if ($type === 'custommail') {
                return $this->generator->getNginxConfiguration();
            }

            return '';
        }
    }