Чи слід плюс кодувати в mailto: гіперпосилання?


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 "надіслати за допомогою gmail" виникли проблеми з некодованим плюсом у mailto: наприклад, але, можливо, це помилка.
Джефф Етвуд

2
Просто використовуйте те, що працює з хромом.
Hardwareguy

Відповіді:


22

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

Тому клієнт повинен точно вирішити закодоване представлення та розшифрувати його наскільки це доречно. Ось офіційне взяття Microsoft з цього питання .

Ви повинні застосувати кодування URL на mailto: URL-адреси, вбудовані в HTML, якщо символи адреси електронної пошти зарезервовані URI. Це забезпечує те, що ви робите правильно. Клієнт повинен розшифрувати URI належним чином з моменту його отримання. Так, this+address@gmail.comце дуже коректний електронний лист; так this%2Baddress@gmail.com, також діє. Так, ці двоє різні, але чи буде поводитися з ними по-різному, залежить від клієнта ...

Як ви раніше зазначали, не всі клієнти це правильно надають. Я пропоную знайти найімовірнішого клієнта (gmail? Клієнти, що базуються на браузері? Outlook?), Яким користуватимуться ваші користувачі та роблять те, що робить цей клієнт. Ви сказали, що ви протестували на GMail? Як ти це випробував? З "mailto: client" на базі браузера (наприклад, додатки до firefox та gmail) URI, швидше за все, не декодується (як це має бути).


Хтось має фактичні дані про те, що працює там?
Wez Furlong

добре, я зробив конкретну примітку про те, що Microsoft стверджує, що працює ...
jcolebrand

Це місце на. Gmail не працює з ними правильно, але оскільки Google ігнорує звіти про помилки користувачів, ви не можете багато з цим зробити.
Матвій

5
Якщо у вас є кодування +в URI, його @також потрібно закодувати, оскільки це також зарезервований символ. Якщо ви уважно прочитаєте RFC, то з’ясуєте, що в непрозорій частині +це законно.
Євген Йокота

Можливо, я помиляюся, але чи не зарезервовано це відокремлення імені користувача від хоста (наприклад, у example@example.com/path )? Тоді він буде робити своє місце за адресою, оскільки він відокремлює ім'я користувача від хоста.
Maciej Piechotka

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-адреси символів у" до "повинні бути закодовані: зокрема, дужки, коми та знак відсотка ("% "), які зазвичай зустрічаються в синтаксисі" поштової скриньки "."

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

Однак це те, що є "правильним" - це не обов'язково те, що буде працювати у всіх браузерах. Деякі браузери, очевидно, завжди поправлятимуться з правильними речами так, ніби вони помиляються, а неправильні, як ніби вони мають рацію.

Редагувати: Що стосується RFC6068 та його "МОЖА", я б читав це як залежне від контексту. Якщо ви пишете URL-адресу для читання тексту, тоді "+" матиме більше сенсу, але якщо ви пишете його в HTML, то більш сувора інтерпретація RFC3986 була б більш влучною з "дійсними HTML" ідеями, і тому все, що використовує значення, повинно очікуйте, що він буде закодований.


2
У RFC 3986, mailtoтрактується як path-rootless, що дозволяє послідовність, pcharвизначена (unreserved / pct-encoded / sub-delims / ":" / "@"). +є частиною sub-delims. Тож чітке читання говорить, +що не потрібно відсоткове кодування.
Євген Йокота


3

Я думаю, що кодування цього чи ні, справді не зміниться. Проблема - це поштові клієнти. Для іспиту Yahoo Mail використовує лише дефіс для додаткової адреси, тоді як gMail використовує плюс.

Це мої 2 копійки ...

EDIT: Відповідь, наведена нижче, має суттєвий результат.


Щоправда, добре, що в адресації електронної пошти є певна розбіжність - але електронні листи в цьому випадку розміщуються на gmail, тому я знаю, що плюс є правильним і працюватиме, коли він отримає сервер, якщо припустити, що електронна пошта отримує клієнт.
Джефф Етвуд

Проблема полягає в тому, що програма аналізує URI-запит. Якщо він очікує отримання даних, кодованих URLE, тоді він буде декодувати дані, але це не справедливо ні для вас (для помилкового кодування), ні для клієнта (робити припущення). Протокол не диктує очікуване кодування, робить клієнт. Дивіться подальші зміни, внесені до A від @Wez
jcolebrand,

3

RFC1738

3.5. МАЙЛТО

Схема URL-адреси mailto використовується для позначення поштової адреси в Інтернеті фізичної особи чи послуги. Ніякої додаткової інформації, окрім Інтернет-поштової адреси, немає або мається на увазі.

URL-адреса пошти має форму:

    mailto:<rfc822-addr-spec>

де (кодування ап) адр-специфікації, як зазначено в RFC 822 . У поштових URL-адресах немає зарезервованих символів.

Зауважте, що знак відсотка ("%") зазвичай використовується в межах RFC 822 і повинен бути закодований.

На відміну від багатьох URL-адрес, схема mailto не представляє об'єкт даних, до якого можна отримати доступ безпосередньо; немає сенсу, в якому він позначає предмет. У MIME використовується використання, ніж повідомлення / тип зовнішнього тіла.

Оскільки немає зарезервованих символів, його слід закодувати.


і все ж на 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-адресі, завжди повинен розглядатися як буквальний знак плюс, а не як пробіл, у якому є були закодовані форми.

Якщо локальний клієнт перетворить плюс у простір, він порушений.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.