Plus devrait-il être encodé dans mailto: hyperliens?

39

Lorsque vous placez une adresse électronique avec une étiquette d'adresse (ou sous-adresse) dans un lien hypertexte mailto

<a href="mailto:[email protected]">mail us now!</a>

… Le plus dans l'email devrait-il être encodé en URL?

<a href="mailto:username%[email protected]">mail us now!</a>

Je ne peux pas comprendre cela, et la documentation est en conflit. Nos tests dans le monde réel ont également produit des résultats mitigés, ce qui rend encore plus confus.

Jeff Atwood
la source
Pouvez-vous être plus précis sur les méthodes et les résultats de vos tests réels? Certains clients / services de messagerie le traitent-ils correctement et d’autres s’étouffent? Peux-tu être plus précis?
Bryson
1
@bryson Je sais que l'extension chrome "send using gmail" a eu des problèmes de non codé avec mailto: par exemple, mais c'est peut-être un bogue.
Jeff Atwood
2
N'utilisez que celui qui fonctionne avec le chrome.
Hardwareguy

Réponses:

22

Le plus est utilisé pour coder les espaces dans les URL, pas dans HTML ni dans SMTP (RFC2821). Cependant, étant donné qu’il mailto:[email protected]s’agit d’un URI (il a un protocole, le séparateur de protocole et l’adresse de protocole), il doit être traité comme un URI et codé en pourcentage .

Par conséquent, il appartient au client de résoudre avec précision la représentation codée et de la décoder autant que de besoin. Voici la position officielle de Microsoft sur le sujet .

Vous devez appliquer le codage d’URL sur mailto: URL incorporées au format HTML si les caractères de l’adresse électronique sont réservés à l’URI. Cela garantit que vous faites la bonne chose. Il appartient au client de décoder l'URI de manière appropriée à partir duquel il est reçu. Oui, [email protected]est un email très valide; oui this%[email protected]est également valable. Oui, ces deux sont différents, mais c'est au client de décider s'ils seront traités différemment ...

Comme vous l'avez noté précédemment, tous les clients ne rendent pas cela correctement. Je suggère de rechercher le client le plus probable (gmail? Clients basés sur un navigateur? Outlook?) Que vos utilisateurs utiliseront et de faire ce que ce client fait. Vous avez dit que vous avez testé sur GMail? Comment l'avez-vous testé? Avec un client mailto: basé sur un navigateur (comme des add-ons à Firefox et à une offre gmail), l’URI n’est probablement pas décodé (comme il se doit).

Wez Furlong
la source
Quelqu'un at-il des données réelles sur ce qui fonctionne où?
Wez Furlong
Eh
C'est sur place. Gmail ne les gère pas correctement, mais comme Google ignore les rapports de bogue d'utilisateurs, vous ne pouvez rien faire à ce sujet.
Matthew Lu
5
Si vous avez encodé +en URI, vous devez @également le faire, car il s'agit également d'un caractère réservé. Si vous lisez attentivement le RFC, vous découvrirez que, dans une partie opaque, +c'est légal.
Eugene Yokota
J'ai peut-être tort, mais n'est-il pas réservé de séparer le nom d'utilisateur de l'hôte (comme dans [email protected]/path )? Ensuite, il ferait sa place dans l'adresse car il sépare le nom d'utilisateur de l'hôte.
Maciej Piechotka
8

Vous pouvez encoder +, mais vous n'êtes pas obligé.

Premièrement, nous devons convenir qu’il mailtos’agit d’un exemple d’URI générique, spécifié par le RFC 2396 . (C’est ce qu’utilisent XHTML et HTML 4).

Découvrons maintenant la liste des caractères réservés dans la RFC 2396.

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

L'URI se divise en absolu et relatif:

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

Et parce que le schéma mailto:est spécifié, il s'agit d'un URI absolu:

absoluteURI   = scheme ":" ( hier_part | opaque_part )

Et puisque les deux modèles pour hier_partcommencer /, mailtoest une partie opaque.

opaque_part   = uric_no_slash *uric

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

uric          = reserved | unreserved | escaped

La restriction est donc que vous devez vous échapper /s'il s'agit du premier caractère, mais vous pouvez ensuite mettre des caractères réservés, y compris +et @.

Voici un autre RFC pour supporter ceci. Dans le dernier RFC du système mailto publié en 2010, appelé RFC 6068 , il est dit:

Les logiciels créant des 'mailto'URI doivent également veiller à coder tous les caractères réservés utilisés. Les formulaires HTML sont un type de logiciel qui crée des 'mailto'URI. Les implémentations actuelles codent un espace comme '+', mais cela crée des problèmes car un tel '+'statut d'espace ne peut pas être distingué d'un réel '+'dans un 'mailto' URI. Lors de la production des 'mailto'URI, tous les espaces DEVRAIENT être codés sous %20, et les '+'caractères PEUVENT être codés sous %2B. Veuillez noter que les '+' caractères sont fréquemment utilisés dans le cadre d’une adresse électronique pour indiquer une sous-adresse, comme par exemple dans <[email protected]>.

Eugene Yokota
la source
Je ne connais pas très bien cette grammaire, cependant, elle répertorie les caractères séparément du pool non réservé, ce qui indique que + est un caractère réservé. Cela n'indique pas qu'il doit être encodé. Microsoft dit de l'encoder. C'est la vie, j'attends de voir.
jcolebrand
1
Lorsqu'une pièce ne commence pas par /, +ne devient plus un caractère réservé.
Eugene Yokota
Je ne suis pas d'accord. Les "adresses électroniques" sont définies de manière très particulière et doivent être traitées avec précaution. Cette norme est très déroutante. Heureusement, nous ne sommes pas d'accord ici.
jcolebrand
8

Une lecture stricte de la RFC pertinente indique que le "+" doit être codé.

La section 2, haut de la page 2 sur http://tools.ietf.org/html/rfc2368 dit:

"Notez que tous les caractères réservés" dans "de l'URL doivent être codés: en particulier les parenthèses, les virgules et le signe de pourcentage ("% "), qui apparaissent généralement dans la syntaxe" mailbox "."

La RFC pour les URI (http://tools.ietf.org/html/rfc3986#section-2.2) répertorie "+" en tant que caractère réservé.

Cela dit, ce qui est "correct" n'est pas nécessairement ce qui fonctionnera dans tous les navigateurs. Il est évident que certains navigateurs traitent toujours les choses correctes comme si elles étaient fausses et les fausses comme si elles avaient raison.

Edit: Quant à la RFC6068 et son "MAY", je lirais cela comme dépendant du contexte. Si vous écrivez l'URL pour la lecture de texte, "+" aurait plus de sens. Toutefois, si vous l'écrivez en HTML, l'interprétation plus stricte de RFC3986 serait plus en ligne avec les idées "HTML valide". attendez-vous à ce qu'il soit encodé.

IBBoard
la source
2
Dans la RFC 3986, mailtoserait traité comme path-rootlessce qui permet la séquence pchardéfinie par (unreserved / pct-encoded / sub-delims / ":" / "@"). +fait partie de sub-delims. Une lecture aussi stricte +ne nécessite pas d'encodage en pourcentage.
Eugene Yokota
3

Je pense que le coder ou non ne fera pas une réelle différence. Le problème sont les clients de messagerie. Par exemple, Yahoo Mail utilise uniquement un tiret pour l’adresse secondaire alors que gMail utilise le plus.

C'est mes 2 cents ...

EDIT: La réponse ci-dessous a un point solide.

Bruno
la source
vrai, bon point, il y a une certaine variance sur le sous-adressage du courrier électronique - mais dans ce cas, les courriers électroniques sont hébergés dans Gmail. Je sais que le plus est correct et fonctionnera à la réception par le serveur, en supposant que le courrier électronique passe par le client.
Jeff Atwood
Le problème est l'application qui analyse la demande URI. S'il s'attend à recevoir des données URLEncodées, il décodera les données, mais ce n'est pas juste pour vous (pour encoder faussement) ni pour le client (pour émettre des hypothèses). Le protocole ne dicte pas l'encodage attendu, c'est le client. Voir les modifications ultérieures apportées à A par @Wez
jcolebrand
3

Le RFC1738

3.5 MAILTO

Le schéma d'URL mailto est utilisé pour désigner l'adresse postale Internet d'un individu ou d'un service. Aucune information supplémentaire autre qu'une adresse postale Internet n'est présente ou implicite.

Une URL mailto prend la forme:

    mailto:<rfc822-addr-spec>

où est (l'encodage d'une) addr-spec, comme spécifié dans la RFC 822 . Dans les URL mailto, il n'y a pas de caractères réservés.

Notez que le signe de pourcentage ("%") est couramment utilisé dans les adresses RFC 822 et doit être codé.

Contrairement à beaucoup d'URL, le schéma mailto ne représente pas un objet de données auquel accéder directement. il n'y a pas de sens dans lequel il désigne un objet. Son utilisation est différente de celle du type message / external-body dans MIME.

Puisqu'il n'y a pas de caractères réservés, il devrait être codé.

S.Skov
la source
and yet per tools.ietf.org/html/rfc6068 "Lors de la production des URI" mailto ", tous les espaces DEVRAIENT être codés sous la forme% 20 et les caractères" + "PEUVENT être codés sous la forme% 2B"
Jeff Atwood le
1
Since there are no reserved characters it should be encoded.ummmm ça n'a aucun sens.
jcolebrand
@jcolebrand '+' est un caractère spécial dans le schéma d'URL et doit donc être codé lorsqu'il n'a pas de rôle spécial - c'est-à-dire. quand ce n'est pas réservé.
S.Skov
@ Jeff En effet - ma mauvaise pour vivre dans un ancien monde RFC. Ensuite, tools.ietf.org/html/rfc2119 vous dit fondamentalement de faire ce qui vous convient le mieux.
S.Skov
cela semble ... revenir en arrière dans l'esprit à la façon dont j'ai lu les instructions au départ.
jcolebrand
3

Conformément à la RFC 6068 mentionnée dans les réponses, vous POUVEZ coder le signe plus comme %2B.

La confusion est due au fait que la conversion d'un espace en un plus ne fait pas partie du codage d'URL standard, mais du codage de paramètre de formulaire (c'est-à-dire application/x-www-form-urlencoded).

C'est comme la différence entre PHP rawurlencode()et urlencode().

La RFC 6068 indique donc qu'une mailto:URL doit utiliser un codage d'URL standard "brut" (conformément à la RFC 3986 ), et qu'un signe plus apparaissant dans l'URL doit toujours être traité comme un signe plus littéral, et non comme un espace été forme codée.

Si le client local convertit le plus dans un espace, il est cassé.

Alnitak
la source