Пример использования валидирующих EAI и IDN библиотек в коде Python
Пример проекта для бэкенда на Python
Примеры кода на Python доступны по ссылке: readiness-sample-code/python.
Примеры кода на Python для универсального принятия
В этой папке вы найдете примеры кода для исполнения правил универсального принятия (UA) для библиотек Python. Исходный код находится в папке src.
Ниже перечислены используемые библиотеки, разъясняется процесс запуска скриптов на Python для проведения собственных тестов, а также приведена дополнительная информация.
Подготовка среды
Мы предлагаем использовать pip для установки зависимостей в Python, но можно использовать и другие методы. Установите Python и pip.
Следующие шаги рекомендуется выполнять из корневой папки Python.
Создайте виртуальную среду:
$ virtualenv venv
Создайте целевой каталог для виртуальной среды и установите необходимую библиотеку UA и зависимости:
$ source venv/bin/activate $ pip install .
Бэкенд на Python для демо-сайта с поддержкой UA
Подготовка к работе
Бэкенд на Python использует фреймворк Flask. Сначала установите его в свою среду:
$ pip install -r src/backend/requirements.txt
Теперь можно запустить бэкенд:
$ export FLASK_APP=src/backend/ua_samples $ export FLASK_ENV=development $ flask run
Задайте конфигурацию бэкенда, отредактировав файл config.py.
Создайте докерный образ
Чтобы создать докерный образ для бэкенда, выполните команду:
$ docker build . -t ua-backend-python
Запустите бэкенд и проверьте порт 1234, выполнив следующую команду:
$ docker run -d --name ua-py -p 1234:5000 ua-backend-python
Инструменты CLI
Примеры кода для IDNA
idna
idna можно использовать для конвертирования U-метки в A-метку и наоборот. Библиотека предлагает разные способы конвертирования, и они описаны в соответствующей документации. Один из таких способов используется в примерах кода idna.
Примеры кода idna конвертируют U-метку на входе в A-метку или возвращают ошибку, если указан недопустимый домен. Так как idna не выполняет нормализацию, для нормализации входного домена в NFC используется стандартный модуль в Python unicodedata.
Для запуска примера кода idna выполните:
$ (venv) python src/bin/idna/idna_main.py --domain <domain>
Примеры кода для EAI
Используются наиболее простые примеры SMTP без механизмов аутентификации. Вы можете использовать для тестирования SMTP-сервер Mailhog. Основная реализация не поддерживает расширение SMTPUTF8, но его поддерживает этот вариант.
email_validator
Пример email_validator проверяет действительность электронного адреса на входе или возвращает ошибку, если адрес недействителен. В документации по email_validator четко сказано: «данная библиотека НЕ принимает устаревшие формы электронных адресов». Поэтому валидатор выполняет так называемую «прагматичную» проверку.
Например, он не принимает символ @ в имени почтового ящика, приведенного в кавычках, и не принимает имя почтового ящика в кавычках, хотя такой вариант обычно допустим. Стандарт RFC 5321 не рекомендует использовать строки в кавычках, чтобы гарантировать доставку почты, поэтому в большинстве случаев это допустимо. Чтобы запустить email_validator, выполните команду:
$ (venv) python src/bin/eai/email_validator_main.py --e <email-address>
smtplib
Пример кода smtplib пересылает письма на электронный адрес, указанный на входе, помечая их соответствующим образом, если электронный адрес содержит символы в кодировке UTF-8.
smtplib выполняет частичную проверку электронного адреса и обеспечивает корректную обработку EAI. Для оптимальной проверки электронного адреса (например, на соответствие доменной части адреса протоколу IDNA 2008) используется email_validator. Если SMTP-сервер не поддерживает SMTPUTF8, доступен примерный код более низкого уровня с возможностью конвертирования доменной части адреса в ASCII библиотекой idna (Важно: email_validator выполняет конвертацию в процессе проверки, также используя библиотеку idna, поэтому результат проверки следует использовать столько раз, сколько это возможно, во избежание повторной проверки).
Чтобы запустить smtplib, выполните команду:
$ (venv) python src/bin/eai/smtplib_main.py --to="<email-address>" --host=<smtp-sever> --port=<port>