Транспорт “Mail” служит для отправки писем.
Письма формируются с помощью Шаблонов, а шаблоны привязываются к Событиям услуг
Настройки
- Хост (host)
- адрес сервера, например:
smtp.mailgun.org:587 - user
- Имя пользователя для авторизации на почтовом сервере (не обязательное)
- password
- Пароль для авторизации на почтовом сервере (не обязательное)
- ssl
- Включить прямое SSL/TLS-соединение (порт 465). Значение:
1или0. Устанавливается автоматически при использовании порта465(не обязательное) - starttls
- Использовать STARTTLS для шифрования внутри обычного SMTP-соединения (порты 587, 25). Значение:
1или0. Устанавливается автоматически при использовании портов587и25(не обязательное)
Выбор шифрования по порту:
- Порт 465 → SSL/TLS (прямое шифрование)
- Порт 587 → STARTTLS
- Порт 25 → STARTTLS
- 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 переключается на шифрование.
Порядок работы:
- Клиент подключается к серверу на порт 587 (или 25) без шифрования
- Сервер сообщает о поддержке STARTTLS в ответе на
EHLO - Клиент отправляет команду
STARTTLS - Далее весь обмен идёт по зашифрованному каналу
Проверка соединения:
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) в самом начале сессии, после чего вся передача данных (команды, логин, пароль, письмо) идёт только в зашифрованном виде.
Порядок работы:
- Клиент подключается к серверу на порт 465
- Сразу начинается TLS-рукопожатие — открытых данных нет вообще
- После успешного 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