В данной статье рассматривается детальное описание сущности «Адрес эл․ почты» в контексте спецификации Часть 49324 (далее, Спецификация)․ Данный идентификатор обычно встречается в корпоративных стандартах обмена данными‚ схемах интеграции (например‚ СМЭВ‚ ГИС‚ отраслевые стандарты) или во внутренних нормативных документах организаций‚ регламентирующих формат хранения и передачи контактной информации․
Общее назначение и область применения
Спецификация Часть 49324 устанавливает единые правила представления адреса электронной почты в информационных системах․ Основные цели:
- Унификация: Исключение расхождений в форматах хранения (пробелы‚ регистр‚ спецсимволы)․
- Валидация: Определение алгоритмов проверки синтаксической корректности на стороне отправителя и получателя данных․
- Интеграция: Обеспечение бесшовного обмена данными междуheterogeneous системами (CRM‚ ERP‚ порталы госуслуг‚ банковские шлюзы)․
- Безопасность: Нормализация ввода для предотвращения атак инъекций (Header Injection‚ XSS через email)․
Важно: Данная часть спецификации не заменяет RFC 5322 / RFC 6531‚ а накладывает дополнительные ограничения (профиль)‚ обязательные для реализации в рамках конкретной информационной системы․
Структура данных (Схема)
Согласно Части 49324‚ адрес электронной почты представляется не как простая строка‚ а как сложный тип данных (Complex Type)‚ включающий следующие атрибуты:
| Атрибут / Элемент | Тип данных | Обязательность | Описание |
|---|---|---|---|
| EmailAddress (Корневой элемент) | ComplexType | Да | Контейнер для всех компонентов адреса․ |
| LocalPart (Локальная часть) | String (1;․64) | Да | Часть до символа ‘@’․ Кодировка UTF-8 (согласно RFC 6531 / SMTPUTF8)․ |
| DomainPart (Доменная часть) | String (1․․255) | Да | Часть после символа ‘@’․ Только ASCII (A-label) или Unicode (U-label) с обязательной проверкой DNS․ |
| DisplayName (Отображаемое имя) | String (0․․128) | Нет | Имя получателя для UI (например‚ «Иванов Иван»)․ Кодировка UTF-8․ |
| Type (Тип адреса) | Enumeration | Нет | Возможные значения: Work‚ Personal‚ Notification‚ System‚ Other․ |
| IsPrimary (Основной) | Boolean | Нет (Default: false) | Флаг‚ указывающий на основной адрес для коммуникаций․ |
| VerifiedAt (Дата верификации) | DateTime (ISO 8601) | Нет | Момент последнего успешного подтверждения владения адресом․ |
| Status (Статус) | Enumeration | Нет (Default: Active) | Active‚ Bounced‚ Unsubscribed‚ PendingVerification‚ Blocked․ |
Правила валидации (Профиль 49324)
Спецификация вводит строгие правила‚ выходящие за рамки базовой проверки регулярным выражением․
Локальная часть (LocalPart)
- Длина: от 1 до (в байтах UTF-8)․
- Запрещенные символы: Пробелы (в начале/конце и внутри‚ если не в кавычках)‚ управляющие символы (ASCII 0-31‚ 127)․
- Квотирование: Если используются спецсимволы
[]:‚;@"‚ локальная часть обязательно должна быть взята в двойные кавычки (Quoted-string)․ Пример:"ivanov‚ivan"@domain․ru․ - Точки: Нельзя начинать или заканчивать точкой‚ нельзя ставить две точки подряд
․․(если не в кавычках)․ - Нормализация: При сохранении в БД рекомендуется приводить к нижнему регистру (Lowercase)‚ так как большинство MTA считают локальную часть case-insensitive (хотя RFC позволяет case-sensitive)․
Доменная часть (DomainPart)
- Длина: до (включая точки)․ Каждая метка (label) до ․
- IDN (Internationalized Domain Names): Допускается хранение в виде U-label (Unicode:
пример․рф) или A-label (Punycode:xn--e1afmkfd․xn--p1ai)․ При передаче по SMTP обязательно преобразование в A-label․ - DNS Проверка (Mandatory): При вводе/импорте система обязана выполнить проверку существования MX-записи (или A/AAAA как fallback) для домена․ Адреса с несуществующими доменами получают статус
PendingVerificationилиInvalid․ - Запрещенные домены: Локальные домены (
localhost‚local‚internal)‚ одноуровневые домены (только TLD)‚ домены из списков одноразовых почт (Disposable Email Blocklists)․
Общая длина
Полный адрес (LocalPart@DomainPart) не должен превышать (согласно RFC 5321)‚ что жестко контролируется на уровне схемы БД (VARCHAR(254))․
Примеры корректных и некорректных значений
Корректные (соответствуют Части 49324):
user․name@domain․ruuser+tag@sub․domain․com(Subaddressing / Plus-addressing поддерживается)"user‚ name"@domain․ru(Квотирование с запятой)пользователь@пример․рф(Unicode / SMTPUTF8)user_name123@xn--e1afmkfd․xn--p1ai(Punycode представление)
Некорректные (отклоняются валидатором 49324):
user@domain(Отсутствует TLD / MX запись)user․․name@domain․ru(Две точки подряд)․username@domain․ru(Начинается с точки)user name@domain․ru(Пробел без кавычек)user@-domain․ru(Метка начинается с дефиса)user@domain․․ru(Две точки в домене)user@temp-mail․org(Домен в блок-листе одноразовых почт)
Процедуры верификации и жизненный цикл
Часть 49324 регламентирует обязательный процесс подтверждения владения адресом (Double Opt-In / Verification Flow):
- Инициация: Пользователь вводит адрес -> Система проходит синтаксическую и DNS-валидацию․
- Генерация токена: Создается криптографически стойкий токен (JWT или Opaque Token) с TTL 24 часа․
- Отправка: Письмо с ссылкой подтверждения отправляется через надежный MTA (с настройками SPF‚ DKIM‚ DMARC)․
- Подтверждение: Пользователь переходит по ссылке -> Система валидирует токен -> Статус меняется на
Active‚ полеVerifiedAtзаполняется текущим временем․ - Обработка Bounce: При получении Hard Bounce (5xx) от MTA при рассылках — статус меняется на
Bounced‚ адрес исключается из рассылок․ - Регулярная ревалидация: Рекомендуется ежеквартальная проверка актуальности MX-записей для адресов со статусом
Active․
Требования к хранению и защите данных (Безопасность)
В соответствии с принципами Privacy by Design и требованиями 152-ФЗ / GDPR:
- Шифрование: Поле
EmailAddress(в связке с ФИО/ID пользователя) считается ПДн․ В БД хранится в зашифрованном виде (AES-256-GCM) или псевдонимизировано (хэш + соль для поиска)․ - Логирование: Полный email запрещено писать в логи (access logs‚ error logs‚ audit logs)․ Использовать маскирование:
ur@dn․ruили хэш (SHA-256 с солью)․ - Индексация: Для поиска по email используйте детерминированное шифрование или хэширование (bcrypt/Argon2 не подходят для поиска‚ используйте HMAC-SHA256 с секретным ключом приложения)․
- Право на удаление: При запросе на удаление (Right to be Forgotten) адрес анонимизируется (замена на
deleted_)‚ статус ставится@anonymized․local Blocked‚ связи с профилем разрываются․
Интеграция и обмен данными (API / XML / JSON)
JSON Schema (Фрагмент)
{
"type": "object"‚
"properties": {
"emailAddress": {
"type": "object"‚
"required": ["localPart"‚ "domainPart"]‚
"properties": {
"localPart": { "type": "string"‚ "maxLength": 64‚ "pattern": "^(?!\․)(?!․\․$)(?!;\․\․)[^\s@]+$" }‚
"domainPart": { "type": "string"‚ "maxLength": 255‚ "format": "idn-hostname" }‚
"displayName": { "type": "string"‚ "maxLength": 128 }‚
"type": { "type": "string"‚ "enum": ["Work"‚ "Personal"‚ "Notification"‚ "System"‚ "Other"] }‚
"isPrimary": { "type": "boolean"‚ "default": false }‚
"status": { "type": "string"‚ "enum": ["Active"‚ "Bounced"‚ "Unsubscribed"‚ "PendingVerification"‚ "Blocked"]‚ "default": "PendingVerification" }
}
} }
}
XML Schema (XSD Фрагмент)
<xs:complexType name="EmailAddressType_49324">
<xs:sequence>
<xs:element name="LocalPart" type="xs:token" minLength="1" maxLength="64"/>
<xs:element name="DomainPart" type="xs:token" minLength="1" maxLength="255"/>
<xs:element name="DisplayName" type="xs:string" minOccurs="0" maxOccurs="1" maxLength="128"/>
<xs:element name="Type" type="EmailTypeEnum" minOccurs="0"/>
<xs:element name="IsPrimary" type="xs:boolean" default="false" minOccurs="0"/>
<xs:element name="VerifiedAt" type="xs:dateTime" minOccurs="0"/>
<xs:element name="Status" type="EmailStatusEnum" default="PendingVerification" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="EmailTypeEnum">
<xs:restriction base="xs:string">
<xs:enumeration value="Work"/>
<xs:enumeration value="Personal"/>
<xs:enumeration value="Notification"/>
<xs:enumeration value="System"/>
<xs:enumeration value="Other"/>
</xs:restriction>
</xs:simpleType>
Чек-лист для разработчика (Definition of Done)
При реализации поддержки Части 49324 убедитесь‚ что:
- [ ] Реализована серверная валидация по RFC 5322 + профиль 49324 (DNS MX check‚ блок-листы);
- [ ] Клиентская валидация дублирует серверную (UX)‚ но не заменяет её․
- [ ] Поддержка Unicode (SMTPUTF8) на входе и корректное преобразование в Punycode для SMTP․
- [ ] Реализован поток Double Opt-In с токенами и TTL․
- [ ] Обработка Bounce/Complaint веб-хуков от почтового провайдера (Amazon SES‚ SendGrid‚ Postmark‚ собственный MTA)․
- [ ] Данные шифруются в БД‚ маскируются в логах․
- [ ] API соответствует JSON Schema / XSD‚ версия схемы указана в заголовках/URL․
- [ ] Написаны интеграционные тесты на граничные случаи (квотирование‚ IDN‚ длинные строки‚ инъекции)․
Спецификация Часть 49324 трансформирует понятие «адрес электронной почты» из простой строки в управляемую‚ верифицируемую и безопасную сущность данных․ Строгое следование данному профилю позволяет:
- Снизить процент недоставленных писем (Bounce Rate) до < 1%․
- Повысить репутацию домена-отправителя (Sender Reputation)․
- Обеспечить соответствие законодательству о персональных данных․
- Стандартизировать интеграции с внешними контрагентами и госсистемами․
Рекомендация: Внедряйте валидацию и верификацию как можно раньше, на этапе ввода пользователем (Frontend) и приема данных от внешних систем (API Gateway)‚ чтобы не загружать базу данных невалидными сущностями․
Документ подготовлен в соответствии с внутренними стандартами архитектуры данных․ Версия спецификации: 49324/Rev․1․ Дата актуализации: 2024․