По умолчанию 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('://webmail./?user=')
                ->setIsVisibleForDomainCallback(fn (\pm_Domain $domain): bool => $domain->hasPermission('custommail')),
        ];
    }
}

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

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

Вы можете ограничить доступ к пользовательской веб-почте в зависимости от подписки или хостинг-плана. Таким образом, для всех доменов определенной подписки или хостинг плана пользовательский клиент веб-почты не будет отображаться в 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('://webmail./?user=')
                    ->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 '';
    }
}