🚀 Начало работы

📜

1. Как приобрести лицензию

Перейдите в Аккаунт → 📜 Лицензии.
Выберите количество лицензий и период оплаты (месяц или год).
Нажмите Купить Лицензии и оплатите.
Лицензии активируются немедленно после успешной оплаты.

🌐

2. Как добавить свой домен

Перейдите в Мой Аккаунт → 🌐 Домены.
Нажмите + Добавить Домен и введите имя своего домена.
Нажмите Проверить. Проверка проходит автоматически в течение нескольких минут.
Система покажет DNS записи — добавьте их в DNS-менеджер своего домена.

2a. Или купите домен в разделе 🌐 + Купить домен — найдите свой домен с помощью поиска и оформите покупку.

📧

3. Как создать почтовый ящик

Перейдите в Мой Аккаунт → 📧 Почтовые Ящики.
Нажмите + Добавить Почтовый Ящик.
Выберите домен, введите имя пользователя и надёжный пароль (мин. 12 символов).
Почтовый ящик готов к использованию сразу после создания.

📬 Настройка Почтовых Клиентов

⚡

Mozilla Thunderbird

Откройте Thunderbird → Аккаунт → Добавить почтовый аккаунт.
Введите своё имя, email и пароль. Thunderbird обычно находит настройки автоматически.

POP3 server: mail.promail.lv, ports 995, SSL/TLS Normal pass.
SMTP server: mail.promail.lv, ports 465, SSL/TLS Normal pass.
Имя пользователя: полный email адрес
Пароль: пароль вашего аккаунта
🌍

Roundcube Webmail

Используйте почту прямо в браузере — установка не требуется.

Адрес: webmail.promail.lv
Имя пользователя: полный email адрес
Пароль: пароль вашего аккаунта
Открыть Webmail →
📜
1. Купите лицензию
→
🌐
2. Добавьте домен
→
📧
3. Создайте email
→
✅
Готово!
ДЛЯ РАЗРАБОТЧИКОВ
👨‍💻

Подробное руководство

Раздел ниже предназначен для веб-разработчиков, которые хотят добавить на свой сайт кнопку «Войти через ProMail».

✅ Если вы используете ProMail для почты — всё необходимое описано выше. Этот раздел можно пропустить.

🛠️ Если вы разрабатываете сайт — ниже вы найдёте конфигурацию, примеры кода и частые ошибки.

🔐 Вход через ProMail на вашем сайте

Позвольте посетителям входить на ваш сайт через аккаунт ProMail вместо создания ещё одного пароля. ProMail берёт на себя пароли, ключи доступа и проверку отпечатка пальца; ваш сайт получает подтверждённую личность.

ProMail использует стандартный протокол OpenID Connect. Если у вашей платформы есть OIDC-библиотека, интеграция займёт около 10 минут — криптографию писать не придётся.

⚙️ Как это работает

1️⃣

Пользователь переходит на ProMail

Он нажимает вашу кнопку и перенаправляется на promail.lv.

2️⃣

ProMail его идентифицирует

Ключ доступа, отпечаток пальца или пароль. Ваш сайт этого не видит.

3️⃣

Пользователь возвращается с кодом

Ваш сервер обменивает этот код на токен личности — незаметно для пользователя.

Пароль пользователя никогда не попадает на ваш сайт. Если ваш сайт когда-нибудь взломают, красть там будет нечего.

🔑 Как получить данные доступа

Перейдите в Аккаунт → 🔑 Приложения и нажмите ➕ Добавить приложение.
Введите название приложения и адрес возврата (redirect URI).

Каждое приложение занимает один слот лицензии. Та же лицензия может одновременно обслуживать домен и почтовый ящик — они не отнимают слоты друг у друга.

⚠️ Client Secret показывается только один раз. Скопируйте его сразу. Если потеряете, сможете создать новый, но старый перестанет работать.

📋 Конфигурация

Discovery URL: https://promail.lv/.well-known/openid-configuration
Issuer: https://promail.lv
Authorization: https://promail.lv/oidc/authorize
Token: https://promail.lv/oidc/token
User info: https://promail.lv/oidc/userinfo
Public keys: https://promail.lv/.well-known/jwks.json
Scopes: openid email profile
Flow: authorization_code + PKCE (S256) — обязательно
Signing: RS256

💡 Большинству библиотек нужен только Discovery URL — всё остальное они читают оттуда автоматически, включая ключи подписи.

⚡ Быстрый старт с библиотекой

Рекомендуемый способ. Укажите вашей OIDC-библиотеке Discovery URL.

WordPress

Установите плагин OpenID Connect Generic Client, затем укажите:

Client ID       : ваш client id
Client Secret   : ваш client secret
OpenID Scope    : openid email profile
Login Endpoint  : https://promail.lv/oidc/authorize
Userinfo        : https://promail.lv/oidc/userinfo
Token Validation: https://promail.lv/oidc/token
Identity Key    : sub

Node.js

Пакет openid-client:

const promail = await Issuer.discover(
  'https://promail.lv'
);

const client = new promail.Client({
  client_id:      CLIENT_ID,
  client_secret:  CLIENT_SECRET,
  redirect_uris:  [REDIRECT_URI],
  response_types: ['code'],
});

Laravel / PHP

Пакет jumbojett/openid-connect-php:

$oidc = new OpenIDConnectClient(
    'https://promail.lv',
    CLIENT_ID,
    CLIENT_SECRET
);
$oidc->addScope(['openid','email','profile']);
$oidc->setCodeChallengeMethod('S256');
$oidc->authenticate();

$sub = $oidc->requestUserInfo('sub');

Python

Библиотека Authlib:

oauth.register(
  name='promail',
  server_metadata_url=
    'https://promail.lv/.well-known/'
    'openid-configuration',
  client_id=CLIENT_ID,
  client_secret=CLIENT_SECRET,
  client_kwargs={
    'scope': 'openid email profile',
    'code_challenge_method': 'S256',
  },
)

🛠️ Чистый PHP, без библиотеки

Полностью рабочий пример. Два файла: один начинает процесс, другой обрабатывает возврат.

1. promail-login.php — кнопка ведёт сюда

<?php
session_start();

define('ISSUER',        'https://promail.lv');
define('CLIENT_ID',     'your_client_id');
define('CLIENT_SECRET', 'your_client_secret');
define('REDIRECT_URI',  'https://yoursite.lv/promail-callback');

function b64url($b) {
    return rtrim(strtr(base64_encode($b), '+/', '-_'), '=');
}

// PKCE. Verifier остаётся на вашем сервере; в URL уходит только его хеш,
// поэтому украденный код без него бесполезен.
$verifier = b64url(random_bytes(32));
$_SESSION['pm_verifier'] = $verifier;
$_SESSION['pm_state']    = $state = b64url(random_bytes(16));
$_SESSION['pm_nonce']    = $nonce = b64url(random_bytes(16));

header('Location: ' . ISSUER . '/oidc/authorize?' . http_build_query([
    'client_id'             => CLIENT_ID,
    'redirect_uri'          => REDIRECT_URI,
    'response_type'         => 'code',
    'scope'                 => 'openid email profile',
    'state'                 => $state,
    'nonce'                 => $nonce,
    'code_challenge'        => b64url(hash('sha256', $verifier, true)),
    'code_challenge_method' => 'S256',
]));

2. promail-callback.php — сюда указывает redirect URI

<?php
session_start();
// ... те же define() что и выше ...

if (isset($_GET['error'])) {
    exit('Вход не удался: ' . htmlspecialchars($_GET['error']));
}

// state должен совпасть, иначе это подделанный запрос с другого сайта
if (!hash_equals($_SESSION['pm_state'] ?? '', $_GET['state'] ?? '')) {
    exit('Проверка безопасности не пройдена');
}

// Обмен кода. Сервер к серверу через TLS - браузер не участвует,
// поэтому здесь безопасно передавать client secret.
$ch = curl_init(ISSUER . '/oidc/token');
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POSTFIELDS     => http_build_query([
        'grant_type'    => 'authorization_code',
        'code'          => $_GET['code'],
        'redirect_uri'  => REDIRECT_URI,
        'code_verifier' => $_SESSION['pm_verifier'],
        'client_id'     => CLIENT_ID,
        'client_secret' => CLIENT_SECRET,
    ]),
]);
$tokens = json_decode(curl_exec($ch), true);
curl_close($ch);

if (empty($tokens['id_token'])) { exit('Обмен токена не удался'); }

$claims = json_decode(base64_decode(strtr(
    explode('.', $tokens['id_token'])[1], '-_', '+/')), true);

if ($claims['iss'] !== ISSUER)    { exit('Неверный издатель'); }
if ($claims['aud'] !== CLIENT_ID) { exit('Неверная аудитория'); }
if ($claims['exp'] < time())      { exit('Токен истёк'); }
if ($claims['nonce'] !== $_SESSION['pm_nonce']) { exit('Nonce не совпадает'); }

unset($_SESSION['pm_verifier'], $_SESSION['pm_state'], $_SESSION['pm_nonce']);

// $claims['sub']   - постоянный ID пользователя. СОХРАНИТЕ ЕГО.
// $claims['email'] - может измениться. Не используйте как ключ.
// $claims['name']

$user = findUserByPromailSub($claims['sub']);
if (!$user) {
    // Первый раз. Свяжите с существующим аккаунтом или создайте новый.
}

⚠️ Частые ошибки

Email используется как ключ аккаунта

Используйте sub. Он никогда не меняется. Email меняется, и повторно выданный адрес передал бы аккаунт следующему владельцу.

Redirect URI не совпадает точно

ProMail сравнивает его посимвольно. https://site.lv/cb и https://site.lv/cb/ — это два разных адреса. Самая частая ошибка.

Доверие полю alg самого токена

Всегда требуйте RS256 из собственной конфигурации. Токен, заявляющий alg: none, должен быть отвергнут.

Пропущена проверка state

Без неё злоумышленник может завершить вход в браузере жертвы и привязать свой аккаунт ProMail к её сессии.

Client Secret попадает в JavaScript

Он должен находиться только на сервере. Всё, что в коде браузера, — публично.

PKCE не используется

ProMail его требует. Запросы без code_challenge отклоняются.

🎨 Кнопка

Используйте одинаковый текст и вид, чтобы пользователи узнавали кнопку на всех сайтах.

🔐 Войти через ProMail
<a href="/promail-login" class="promail-btn">
  <img src="https://promail.lv/img/promail-logo.webp" alt="" width="20" height="20">
  <span>Войти через ProMail</span>
</a>

<style>
.promail-btn{display:inline-flex;align-items:center;justify-content:center;
  gap:9px;padding:11px 18px;border:1px solid #d1d5db;border-radius:8px;
  background:#fff;color:#111827;font:600 14px system-ui,sans-serif;
  text-decoration:none}
.promail-btn:hover{background:#f9fafb;border-color:#9ca3af}
</style>
English: Sign in with ProMail
Latviski: Pieteikties ar ProMail
По-русски: Войти через ProMail

🧪 Тестирование

Отдельной тестовой среды нет. Зарегистрируйте второе приложение с адресом возврата http://localhost — localhost единственный адрес, разрешённый без https — и проверьте интеграцию перед запуском.

🔑
1. Регистрация приложения
→
⚙️
2. Настройка
→
🎨
3. Добавить кнопку
→
✅
Готово!