Русский

Инструменты разработчика · Кодер и декодер URL

Как закодировать mailto: ссылка с темой, переносами строк тела и амперсандами

· Почему это важно

почта URL-кодировка HTML

Структура ссылки Mailto с закодированной темой и телом
Оригинальная векторная иллюстрация ToolAcre

Ссылка mailto: с темой и телом — это URL, поэтому пробелы, разрывы строк и & должны быть закодированы в процентах. В этом посте показано, что ломается, когда их нет и как построить ссылку, которая корректно открывается в почтовых клиентах.

Ссылка на контакт, тема которой остановилась на первом пробеле — конкретный битый mailto: и что получил почтовый клиент

Ссылки на контакты, такие как <a href="mailto:test@example.com?subject=Support Inquiry">Send</a>, не работают, поскольку пробелы в «Запросе в службу поддержки» завершают ссылки в почтовых клиентах. Многие клиенты получают в качестве темы только «Поддержку». Это происходит потому, что ссылки mailto: следуют за RFC 6068, указывая, что пробелы и специальные символы требуют процентного кодирования в параметрах запроса. Амперсандам требуется кодировка %26, чтобы они не были разделителями параметров.

Неработающие ссылки mailto: наглядно демонстрируют проблему. Созданные ссылки типа <a href="mailto:test@example.com?subject=Support Inquiry&body=Reply">Contact</a> приводят только к сообщениям с темой «Поддержка». Тестирование в разных почтовых клиентах показывает разную устойчивость: Apple Mail частично обрабатывает ссылки, Gmail показывает только «Поддержка», Outlook полностью отказывает.

mailto: представляет собой схему URL — RFC 6068 вкратце, и какие части являются строкой запроса

RFC 6068 определяет схемы mailto: URL с правилами кодирования, специфичными для каждого компонента. В отличие от обычных URL-адресов, mailto: имеет определенные правила для каждого компонента. Части адреса (test@example.com) остаются незакодированными; @ и домены являются структурными. Параметры запроса (тема, тело, копия, скрытая копия) требуют кодирования. RFC 6068 ссылается на RFC 3986 для правил, требующих процентного кодирования для пробелов и специальных символов. Амперсанды внутри значений становятся %26, когда они отображаются как данные, а не как разделители.

Понимание структуры схемы mailto: предотвращает ошибки кодирования. Форма: mailto:адрес?параметр1=значение1&параметр2=значение2. Знаки вопроса обозначают разделы запроса. Параметры, разделяющие амперсанды, остаются незакодированными; только амперсанды внутри значений кодируются как %26. Если темы содержат «Том и Джерри», закодируйте как Tom%20%26%20Jerry. Амперсанды между субъектом и телом остаются незакодированными. Эта вложенная кодировка подвержена ошибкам.

Кодирование темы и тела — пробелы как %20, разрывы строк как %0D%0A и & как %26 внутри значений.

Кодирование субъектов и тел требует тщательного обращения с пробелами и специальными символами. В ссылках mailto: пробелы становятся %20, а не знаками плюса, в отличие от форм HTML. Это критическое различие сбивает с толку разработчиков, знакомых с веб-формами. Разрывы строк кодируются как %0D%0A (окончание строки CRLF в электронном письме). Амперсанды преобразуются в %26. Знаки процента становятся %25. Темы обычно содержат пробелы, акценты и круглые скобки. Тела содержат пробелы, диакритические знаки, разрывы строк.

Общие кодировки в ссылках mailto: включают: пробелы как %20, новые строки как %0D%0A, амперсанды как %26, проценты как %25, хеш как %23, вопрос как %3F. Не-ASCII такие акценты сначала преобразуются в UTF-8 байты, а затем кодируются в процентах. «Убер-отчет» становится %C3%9ber%20отчетом. «Здравствуйте! До свидания» становится Привет%21%0D%0AДо свидания. Кодировать только значения, а не структурные? и & персонажи.

Проработанный пример: построение ссылки с темой, двухстрочным телом и копией — закодированный результат и то, как он отображается в почтовом клиенте

Рабочий пример: построение ссылок с темой «Повестка дня встречи (сентябрь)», телом «Давайте обсудим: Ежеквартальные цели», а копия «manager@example.com» демонстрирует полное кодирование. Субъектам необходимы: пробелы как %20, круглые скобки как %28 и %29. Тела должны: «Давайте обсудим:» в основном без изменений (пробел — %20), разрывы строк как %0D%0A, «Квартальные цели» в основном без изменений. Поле cc не требует кодирования.

В результате mailto: будет: mailto:contact@example.com?subject=Повестка дня встречи%20%20%28Сент%29&body=Пусть%20uс%20discuss%3A%0D%0AЕжеквартально%20gоал&cc=manager@example.com. Тестирование в браузерах выявило разные интерпретации почтовых клиентов. Gmail открывает окна создания сообщения с правильной темой, двухстрочным текстом и копией. Outlook показывает аналогичные результаты. Apple Mail требует разрешений. Пожилые клиенты терпят неудачу из-за отсутствия поддержки тела.

Почему + здесь неправильный — mailto: следует за RFC 3986, а не за кодировкой формы, поэтому + остается плюсом

Почему знаки плюс неправильные — mailto: следует за RFC 3986, а не кодировкой формы, поэтому плюс остается буквальным — поясняет важные различия. Кодировка формы HTML использует плюс для пробелов в строках запроса. RFC 3986 и RFC 6068 оба указывают %20 для пробелов. mailto: with subject="Meeting+Agenda" создает темы с буквальными знаками плюс, а не с пробелами. Эта ошибка возникает при копировании логики кодирования формы в mailto:generation. Плюс означает плюс, а не пробел.

Почему это важно: разработчики копируют логику отправки формы GET в mailto: ссылки разрыва генерации. Тема «Повестка дня собрания» в формах становится «Встреча+Повестка дня». В mailto:links создается «Встреча+Повестка дня» с буквальными плюсами. Пользователи вручную исправляют темы. Тестирование ссылок mailto: требует нажатия на них или проверки сгенерированных ссылок, а не анализа правил формы.

Распространенные ошибки — забывание HTML — экранирование разделителей & в href и процентное кодирование @ в адресе.

Распространенные ошибки mailto: забывают экранирование HTML амперсанда в атрибутах href. В HTML амперсанды в атрибутах должны быть &amp; для допустимого XHTML. href="mailto:address?subject=Test&body=Test" недействителен HTML; это должно быть href="mailto:address?subject=Test&amp;body=Test". Это представляет собой кодировку, отличную от кодировки URL. Парсеры HTML интерпретируют &amp; как и до того, как браузеры обрабатывают URL-адреса.

Для проверки этих ошибок необходимо изучить исходный код HTML и консоли браузера. Щелкните правой кнопкой мыши и выберите «Проверить элемент», чтобы просмотреть фактические значения href. Скопируйте и вставьте значения href в адресную строку (с префиксом mailto:) и проверьте почтовые клиенты. Некоторые ссылки электронной почты работают в определенных браузерах, но не в других. Автоматическое тестирование затруднено, поскольку mailto: задействует внешних клиентов, что делает ручную проверку обычным явлением.

Что здесь не рассматривается — различия в поддержке почтовых клиентов и подробное описание нескольких получателей.

Сюда не входят различия в поддержке почтовых клиентов и наличие нескольких получателей. Не все клиенты одинаково поддерживают параметры RFC 6068. Параметр body имеет широкую поддержку, но некоторые старые клиенты его игнорируют. Параметры cc и bcc поддерживают переменные. Для нескольких получателей адреса электронной почты должны быть разделены запятыми, а для сложных адресов запятые кодируются как %2C. Для разных локалей требуется правильная кодировка UTF-8 для отображения.

Эволюция почтового клиента влияет на поведение mailto: на разных платформах. Современные почтовые веб-клиенты (Gmail, Outlook.com) лучше соответствуют RFC 6068, чем старые настольные клиенты. Мобильные клиенты иногда имеют более строгий анализ. Некоторые поддерживают форматированный текст, а другие поддерживают только обычный текст. Разработчикам следует протестировать почтовые клиенты, которые фактически использует их аудитория. Реальные реализации различаются, несмотря на спецификации RFC 6068.

Вывод: кодируйте каждое значение, сохраняя структуру — как режим однозначного кодера и декодера URL дает вам закодированный объект и тело для вставки.

Вывод: кодируйте каждое значение, сохраняя структуру — однозначный режим кодирования и декодера URL создает закодированные объекты и тела, готовые для вставки в ссылки. Инструмент принимает незакодированные значения, такие как «Повестка дня собрания (сентябрь)», и создает «Meeting%20agenda%20%28Sept%29». Скопируйте вывод непосредственно в атрибуты mailto: href. Для многострочных тел вставьте версии открытого текста с разрывами строк, получив версии в кодировке %0D%0A.

Лучшая практика — сборка ссылок mailto: из закодированных частей, а не создание вручную. При динамическом создании HTML в JavaScript или шаблонах кодируйте каждый параметр отдельно перед объединением с разделителями &. Для статических HTML, URL кодировщик и декодер надежно тестируют кодировку перед рукописным вводом. Процессы кодирования документов в комментариях к коду. Перед развертыванием протестируйте полученные ссылки mailto:, щелкнув их с помощью реальных почтовых клиентов.