Mail

Транспорт “Mail” служит для отправки писем.

Письма формируются с помощью Шаблонов, а шаблоны привязываются к Событиям услуг

Настройки

Хост (host)
адрес сервера, например: smtp.mailgun.org:587
user
Имя пользователя для авторизации на почтовом сервере (не обязательное)
password
Пароль для авторизации на почтовом сервере (не обязательное)
ssl
Включить прямое SSL/TLS-соединение (порт 465). Значение: 1 или 0. Устанавливается автоматически при использовании порта 465 (не обязательное)
starttls
Использовать STARTTLS для шифрования внутри обычного SMTP-соединения (порты 587, 25). Значение: 1 или 0. Устанавливается автоматически при использовании портов 587 и 25 (не обязательное)
from
Адрес отправителя письма. По-умолчанию берется из config->mail->from
from_name
Поле “От-кого”. По-умолчанию берется из config->mail->from_name или “SHM”
subject
Тема письма. По-умолчанию берется из config->mail->subject или “SHM”
to
email адресата. Пытается получить это поле автоматически из логина клиента или его профиля
bcc
email адрес скрытой копии. Можно использовать в отладочных целях, для контроля отправляемых писем (не обязательное)
template_id
Идентификатор шаблона, по которому формируется тело письма
content_type
MIME-тип тела письма. По-умолчанию: text/plain. Для отправки HTML-писем используйте text/html
message
Простое текстовое сообщение для отправки. Используется только, если template_id не задан

Использование в шаблонах

Отправить письмо можно прямо из шаблона через метод user.mail.send(). Все параметры, описанные выше, можно передать в setup().

Простой пример:

{{ m = user.mail.setup( gid = 2 ).send("Текст письма") }}

Пример с расширенными параметрами:

{{ m = user.mail.setup(
    gid = 2
    from = "noreply@example.com"
    from_name = "MyService"
    subject = "Уведомление"
    content_type = "text/html"
) }}
{{ r = m.send("<b>Привет!</b> Ваш аккаунт активирован.") }}

Пример с шаблоном письма:

{{ m = user.mail.setup(
    gid = 2
    template_id = "welcome_mail"
).send }}

Параметр gid — идентификатор группы почтовых серверов (Server Group). Если он указан, все параметры подключения (host, port, user, password, ssl и т.д.) будут автоматически взяты из настроек сервера этой группы — указывать их вручную в шаблоне не нужно.

Использование gid является предпочтительным способом настройки почтового транспорта в шаблонах, так как позволяет централизованно управлять параметрами серверов через интерфейс администратора.

Если gid не указан, используется группа по умолчанию с id=6.

Проверка почтового сервера

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

Без шифрования / STARTTLS (порты 25, 587)

STARTTLS — это механизм «апгрейда» обычного незашифрованного SMTP-соединения до зашифрованного TLS прямо в процессе сессии. В отличие от SSL/TLS (порт 465), где шифрование устанавливается сразу при подключении, STARTTLS начинает работу в открытом виде и затем по команде STARTTLS переключается на шифрование.

Порядок работы:

  1. Клиент подключается к серверу на порт 587 (или 25) без шифрования
  2. Сервер сообщает о поддержке STARTTLS в ответе на EHLO
  3. Клиент отправляет команду STARTTLS
  4. Далее весь обмен идёт по зашифрованному каналу

Проверка соединения:

openssl s_client -starttls smtp -connect smtp.example.com:587

Или через telnet (без шифрования):

telnet smtp.example.com 25

Ручная сессия после подключения:

EHLO localhost
AUTH LOGIN
# ввести base64-encoded логин
# ввести base64-encoded пароль
MAIL FROM:<from@example.com>
RCPT TO:<to@example.com>
DATA
Subject: Test

Hello!
.
QUIT

Закодировать логин/пароль в base64:

echo -n "your_login" | base64
echo -n "your_password" | base64

SSL/TLS (порт 465)

SSL/TLS (или SMTPS) — режим, при котором шифрованное соединение устанавливается сразу при подключении, ещё до какого-либо обмена данными. Клиент и сервер выполняют TLS-рукопожатие (handshake) в самом начале сессии, после чего вся передача данных (команды, логин, пароль, письмо) идёт только в зашифрованном виде.

Порядок работы:

  1. Клиент подключается к серверу на порт 465
  2. Сразу начинается TLS-рукопожатие — открытых данных нет вообще
  3. После успешного handshake начинается обычная SMTP-сессия (EHLO, AUTH, и т.д.)
openssl s_client -connect smtp.example.com:465

Проверка доступности порта

nc -zv smtp.example.com 587
nc -zv smtp.example.com 465
nc -zv smtp.example.com 25

Отправка тестового письма через curl

curl --ssl-reqd \
  --url "smtps://smtp.example.com:465" \
  --user "login@example.com:password" \
  --mail-from "login@example.com" \
  --mail-rcpt "recipient@example.com" \
  --upload-file - <<EOF
From: login@example.com
To: recipient@example.com
Subject: Test

Hello!
EOF

Для STARTTLS (порт 587):

curl --ssl-reqd \
  --url "smtp://smtp.example.com:587" \
  --user "login@example.com:password" \
  --mail-from "login@example.com" \
  --mail-rcpt "recipient@example.com" \
  --upload-file - <<EOF
From: login@example.com
To: recipient@example.com
Subject: Test

Hello!
EOF
Изменено 12.03.2026: dnk: fixup (800bd2e)