Должен ли плюс быть закодирован в mailto: hyperlinks?

39

При размещении адреса электронной почты с тегом адреса (он же подадресация ) в гиперссылку mailto

<a href="mailto:username+foo@example.com">mail us now!</a>

… Должен ли плюс в письме быть закодирован URL?

<a href="mailto:username%2Bfoo@example.com">mail us now!</a>

Я не могу понять это, и документация противоречива. Наши тесты в реальном мире также дали смешанные результаты, что делает его еще более запутанным.

Джефф Этвуд
источник
Можете ли вы более конкретно рассказать о методах и результатах ваших реальных испытаний? Некоторые почтовые клиенты / службы рассматривают это должным образом, и другие душат? Можете быть более конкретными?
Брайсон
1
@ Bryson Я знаю, что расширение Chrome "send using gmail" имело проблемы с незакодированным плюсом в mailto: например, но, возможно, это ошибка.
Джефф Этвуд
2
Просто используйте тот, который работает с Chrome.
Hardwareguy

Ответы:

22

Плюс используется для кодирования пробелов в URL, а не в HTML и не в SMTP (RFC2821). Однако, поскольку mailto:address@server.comэто URI (у него есть протокол, разделитель протокола и адрес протокола), его следует рассматривать как URI и кодировать его в процентах .

Следовательно, клиент должен точно разрешить закодированное представление и декодировать его, насколько это необходимо. Вот официальный взгляд Microsoft на этот вопрос .

Вы должны применять кодировку URL к mailto: URL, встроенным в HTML, если символы в адресе электронной почты зарезервированы. Это гарантирует, что вы делаете правильные вещи. Клиент должен самостоятельно декодировать URI, откуда он был получен. Да, this+address@gmail.comэто очень правильный адрес электронной почты; да this%2Baddress@gmail.comтакже действует. Да, эти два разные, но будут ли они рассматриваться по-разному, зависит от клиента ...

Как вы ранее заметили, не все клиенты отдают это правильно. Я предлагаю найти наиболее вероятный клиент (gmail, клиенты на основе браузера, Outlook), который ваши пользователи будут использовать, и делать то, что делает этот клиент. Вы сказали, что тестировали на GMail? Как вы это проверили? При использовании «mailto: client» на основе браузера (например, надстройки для Firefox и предложения Gmail) URI, скорее всего, не декодируется (как и должно быть).

Wez Furlong
источник
У кого-нибудь есть реальные данные о том, что где работает?
Wez Furlong
ну, я сделал особую заметку о том, что Microsoft утверждает, работает ...
Jcolebrand
Это место. Gmail обрабатывает их неправильно, но, поскольку Google игнорирует сообщения об ошибках пользователей, с этим ничего не поделаешь.
Мэтью Прочитал
5
Если у вас есть кодировка +в URI, @также необходимо кодировать, потому что это также зарезервированный символ. Если вы внимательно прочитаете RFC, вы обнаружите, что в непрозрачной части, +это законно.
Юджин Йокота
Я могу ошибаться, но не зарезервировано ли разделять имя пользователя от хоста (как в example@example.com/path )? Затем он занял бы свое место в адресе, поскольку отделяет имя пользователя от хоста.
Мацей Пехотка
8

Вы МОЖЕТЕ кодировать +, но не обязаны.

Во-первых, мы должны согласиться, что mailtoэто пример универсального URI, указанного в RFC 2396 . (Это то, что используют XHTML и HTML 4).

Теперь давайте выясним список зарезервированных символов в RFC 2396.

reserved    = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
              "$" | ","

URI разделяется на абсолютные и относительные:

URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ]

И поскольку схема mailto:указана, это абсолютный URI:

absoluteURI   = scheme ":" ( hier_part | opaque_part )

И поскольку оба шаблона для hier_partначала /, mailtoэто непрозрачная часть.

opaque_part   = uric_no_slash *uric

uric_no_slash = unreserved | escaped | ";" | "?" | ":" | "@" |
                "&" | "=" | "+" | "$" | ","

uric          = reserved | unreserved | escaped

Таким образом, ограничение заключается в том, что вам нужно бежать, /если речь идет о первом символе, но после этого вы можете добавить зарезервированные символы, включая +и @.

Вот еще один RFC, чтобы поддержать это. В последних RFC почтовой схемы, опубликованной в 2010 году под названием RFC 6068 , говорится:

Программное обеспечение, создающее 'mailto'URI, также должно быть осторожно, чтобы закодировать любые зарезервированные символы, которые используются. HTML-формы являются одним из видов программного обеспечения, которое создает 'mailto'URI. Текущие реализации кодируют пространство как '+', но это создает проблемы, потому что такое '+'положение для пространства нельзя отличить от реального '+'в 'mailto' URI. При создании 'mailto'URI все пробелы ДОЛЖНЫ быть закодированы как %20, а '+'символы МОГУТ быть закодированы как %2B. Обратите внимание, что '+' символы часто используются как часть адреса электронной почты для указания подадреса, как, например, в <bill+ietf@example.org>.

Евгений Йокота
источник
Я не совсем знаком с этой грамматикой, однако в ней перечислены символы отдельно от незарезервированного пула, что указывает на то, что + является зарезервированным символом. Это не означает, что оно должно быть закодировано. Microsoft говорит, чтобы закодировать это. C'est la vie, я жду, чтобы увидеть.
Jcolebrand
1
Когда часть не начинается с /, +больше не становится зарезервированным символом.
Юджин Йокота
Я не согласен. «адреса электронной почты» очень специфично определены, и с ними нужно обращаться с некоторой осторожностью. Этот стандарт очень запутанный. К счастью, мы здесь не согласны.
Jcolebrand
8

Строгое чтение соответствующего RFC говорит о том, что «+» должно быть закодировано.

Раздел 2, начало страницы 2 на http://tools.ietf.org/html/rfc2368, гласит:

«Обратите внимание, что все зарезервированные символы URL в« to »должны быть закодированы: в частности, круглые скобки, запятые и знак процента («% »), которые обычно встречаются в синтаксисе« почтового ящика ».»

RFC для URI (http://tools.ietf.org/html/rfc3986#section-2.2) перечисляет «+» как зарезервированный символ.

Тем не менее, то, что является «правильным», не обязательно то, что будет работать во всех браузерах. Некоторые браузеры, очевидно, всегда будут обрабатывать правильные вещи, как если бы они были неправы, а неправильные - как если бы они были правы.

Изменить: Что касается RFC6068 и его "МОЖЕТ", я бы прочитал это как контекстно-зависимый. Если вы пишете URL для чтения текста, тогда «+» имеет больше смысла, однако, если вы пишете его в HTML, тогда более строгая интерпретация RFC3986 будет в большей степени соответствовать идеям «правильного HTML», и поэтому все, что использует значение, должно ожидайте, что это будет закодировано.

IBBoard
источник
2
В RFC 3986, mailtoбудет рассматриваться как path-rootless, что позволяет последовательность pcharопределяется (unreserved / pct-encoded / sub-delims / ":" / "@"). +является частью sub-delims. Строгое чтение говорит, +что не требует кодирования процентов.
Евгений Йокота
3

Я думаю, что кодирование это или нет, ничего не изменит. Проблема в почтовых клиентах. Например, Yahoo Mail использует дефис только для подадресации, тогда как gMail использует плюс.

Это мои 2 цента ...

РЕДАКТИРОВАТЬ: ответ ниже имеет сплошную точку.

Bruno
источник
Да, хорошо, что есть некоторая разница в переадресации электронной почты, но электронные письма в этом случае размещаются на gmail, так что я знаю, что плюс правильный и будет работать при получении сервером, при условии, что электронная почта проходит через клиента.
Джефф Этвуд
Проблема заключается в том, что приложение анализирует запрос URI. Если он ожидает получения данных, закодированных URLE, он будет декодировать данные, но это не справедливо ни для вас (для ложного кодирования), ни для клиента (чтобы делать предположения). Протокол не определяет ожидаемую кодировку, а клиент. Смотрите дальнейшие правки, которые я делаю для A от @Wez
jcolebrand
3

RFC1738

3.5. MAILTO

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

URL-адрес mailto принимает форму:

    mailto:<rfc822-addr-spec>

где (кодировка) addr-spec, как указано в RFC 822 . В почтовых URL-адресах нет зарезервированных символов.

Обратите внимание, что знак процента («%») обычно используется в адресах RFC 822 и должен быть закодирован.

В отличие от многих URL-адресов, схема mailto не представляет объект данных, к которому осуществляется прямой доступ; нет никакого смысла, в котором он обозначает объект. Он имеет другое использование, чем тип сообщения / внешнего тела в MIME.

Поскольку нет зарезервированных символов, они должны быть закодированы.

S.Skov
источник
и все же по tools.ietf.org/html/rfc6068 "При создании URI 'mailto' все пробелы ДОЛЖНЫ быть закодированы как% 20, а символы '+' МОГУТ быть закодированы как% 2B"
Джефф Этвуд,
1
Since there are no reserved characters it should be encoded.ммм, это не имеет никакого смысла.
Jcolebrand
@jcolebrand '+' является специальным символом в схеме URL и, следовательно, должен кодироваться, когда ему не принадлежит особая роль, т.е. когда это не зарезервировано.
С.Сков
@Jeff Действительно - мой вред для жизни в старом мире RFC. Затем tools.ietf.org/html/rfc2119 в основном говорит вам делать то, что вам больше всего подходит.
С.Сков
это кажется .... назад в духе к тому, как я читал инструкции изначально.
Jcolebrand
3

Согласно RFC 6068, как указано в ответах, вы МОЖЕТЕ кодировать знак плюс как %2B.

Причина путаницы в том, что преобразование пробела в плюс на самом деле не является частью стандартного кодирования URL, а является частью кодирования параметров формы (т.е. application/x-www-form-urlencoded)

Это как разница между PHP rawurlencode()и urlencode().

Итак, что говорит RFC 6068, так это то, что mailto:URL должен использовать «стандартную» стандартную кодировку URL (согласно RFC 3986 ), а знак «плюс», который появляется в URL, всегда должен рассматриваться как буквенный знак плюс, а не как пробел, имеющий был закодирован в форме.

Если локальный клиент преобразует плюс в пробел, он ломается.

Альнитак
источник