Sollte plus in mailto: hyperlinks verschlüsselt sein?

39

Beim Platzieren einer E-Mail-Adresse mit einem Adress-Tag (auch als Unteradresse bezeichnet ) in einem Mailto- Hyperlink ...

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

… Soll das Pluszeichen in der E-Mail URL-verschlüsselt sein?

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

Ich kann das nicht herausfinden und die Dokumentation ist widersprüchlich. Unsere Tests in der Praxis haben ebenfalls gemischte Ergebnisse geliefert, was die Sache noch verwirrender macht.

Jeff Atwood
quelle
Können Sie die Methoden und Ergebnisse Ihrer Praxistests genauer beschreiben? Behandeln einige E-Mail-Clients / -Dienste das Problem ordnungsgemäß und andere ersticken? Kannst du genauer sein?
Bryson
1
@bryson Ich weiß, dass die Chrome-Erweiterung "send using gmail" Probleme mit unverschlüsseltem Plus im mailto hatte: zum Beispiel, aber vielleicht ist das ein Fehler.
Jeff Atwood
2
Verwenden Sie einfach, was man mit Chrom arbeitet.
Hardwareguy

Antworten:

21

Das Pluszeichen wird zum Codieren von Leerzeichen in URLs verwendet, nicht in HTML und nicht in SMTP (RFC2821). Da es sich jedoch mailto:[email protected]um einen URI handelt (er hat ein Protokoll, das Protokolltrennzeichen und die Protokolladresse), sollte er als URI behandelt und in Prozent codiert werden .

Daher ist es Sache des Kunden, die codierte Darstellung genau aufzulösen und soweit angemessen zu decodieren. Hier ist die offizielle Meinung von Microsoft zu diesem Thema .

Sie sollten die URL-Codierung auf mailto: -URLs anwenden, die in HTML eingebettet sind, wenn die Zeichen in der E-Mail-Adresse URI-reserviert sind. Dies stellt sicher, dass Sie das Richtige tun. Es ist Aufgabe des Clients, den URI entsprechend zu dekodieren, von wo er empfangen wird. Ja, [email protected]ist eine sehr gültige E-Mail; ja this%[email protected]ist auch gültig. Ja, diese beiden sind unterschiedlich, aber ob sie anders behandelt werden, liegt beim Kunden ...

Wie Sie bereits bemerkt haben, wird dies nicht von allen Clients korrekt wiedergegeben. Ich schlage vor, den wahrscheinlichsten Client (Google Mail, browserbasierte Clients, Outlook) zu finden, den Ihre Benutzer verwenden, und das zu tun, was dieser Client tut. Sie sagten, Sie haben auf GMail getestet? Wie hast du es getestet? Bei einem "browserbasierten mailto: client" (wie Add-Ons zu Firefox und Google Mail) wird der URI höchstwahrscheinlich nicht entschlüsselt (wie er sein sollte).

Wez Furlong
quelle
Hat jemand irgendwelche aktuellen Daten darüber, was wo funktioniert?
Wez Furlong
Nun,
Das ist genau richtig. Google Mail behandelt sie nicht richtig, aber da Google Benutzerfehlerberichte ignoriert, können Sie nicht viel dagegen tun.
Matthew Read
5
Wenn Sie +in URI @codiert haben , muss auch codiert werden, da es auch ein reserviertes Zeichen ist. Wenn Sie den RFC sorgfältig lesen, werden Sie feststellen, dass ein undurchsichtiger Teil +legal ist.
Eugene Yokota
Ich kann mich irren, aber ist es nicht vorbehalten, den Benutzernamen vom Host zu trennen (wie in [email protected]/path )? Dann würde es seinen Platz in der Adresse einnehmen, da es den Benutzernamen vom Host trennt.
Maciej Piechotka
7

Sie KÖNNEN codieren +, müssen es aber nicht.

Zunächst müssen wir uns darauf einigen, dass dies mailtoein Beispiel für einen generischen URI ist, der in RFC 2396 angegeben ist . (Dies ist, was XHTML und HTML 4 verwenden).

Lassen Sie uns nun die Liste der reservierten Zeichen in RFC 2396 herausfinden.

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

URI unterteilt sich in absolute und relative:

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

Und da Schema mailto:angegeben ist , ist dies ein absoluter URI:

absoluteURI   = scheme ":" ( hier_part | opaque_part )

Und da beide Muster hier_partanfangen /, mailtoist das ein undurchsichtiger Teil.

opaque_part   = uric_no_slash *uric

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

uric          = reserved | unreserved | escaped

Die Einschränkung besteht also darin, dass Sie /beim ersten Zeichen entkommen müssen , danach jedoch reservierte Zeichen einschließlich +und eingeben können @.

Hier ist ein weiterer RFC, der dies unterstützt. In den neuesten RFCs des Mailto-Schemas aus dem Jahr 2010 mit dem Namen RFC 6068 heißt es:

Software, die 'mailto'URIs erstellt, muss ebenfalls darauf achten, reservierte Zeichen zu codieren, die verwendet werden. HTML-Formulare sind eine Art von Software, die 'mailto'URIs erstellt . Gegenwärtige Implementierungen codieren ein Leerzeichen als '+', aber dies schafft Probleme, da ein solches '+'Stehen für ein Leerzeichen nicht von einem Real '+'in einem 'mailto' URI unterschieden werden kann. Bei der Erzeugung von 'mailto'URIs MÜSSEN alle Leerzeichen wie folgt codiert werden %20, und '+'Zeichen KÖNNEN wie folgt codiert werden %2B. Bitte beachten Sie, dass '+' Zeichen häufig als Teil einer E-Mail-Adresse verwendet werden, um eine Unteradresse anzugeben, wie zum Beispiel in <[email protected]>.

Eugene Yokota
quelle
Ich bin mit dieser Grammatik nicht ganz vertraut, sie listet jedoch die Zeichen getrennt vom nicht reservierten Pool auf, was darauf hinweist, dass + ein reserviertes Zeichen ist. Es gibt nicht an, dass es codiert werden muss . Microsoft sagt, es zu kodieren. C'est la vie, ich warte ab.
Jcolebrand
1
Wenn ein Teil nicht mit beginnt /, wird es +nicht länger zu einem reservierten Zeichen.
Eugene Yokota
Ich stimme dir nicht zu. "E-Mail-Adressen" sind sehr speziell definiert und müssen in erster Linie mit Sorgfalt behandelt werden. Dieser Standard ist sehr verwirrend. Glücklicherweise können wir hier nicht zustimmen.
Jcolebrand
7

Ein striktes Lesen des relevanten RFC besagt, dass das "+" codiert werden sollte.

In Abschnitt 2, oben auf Seite 2, auf http://tools.ietf.org/html/rfc2368 heißt es:

"Beachten Sie, dass alle URL-reservierten Zeichen in" bis "codiert werden müssen: insbesondere Klammern, Kommas und das Prozentzeichen ("% "), die häufig in der" Mailbox "-Syntax vorkommen."

Der RFC für URIs (http://tools.ietf.org/html/rfc3986#section-2.2) listet "+" als reserviertes Zeichen auf.

Das heißt, was "richtig" ist, funktioniert nicht unbedingt in allen Browsern. Einige Browser behandeln die richtigen Dinge offensichtlich immer so, als wären sie falsch und die falschen so, als wären sie richtig.

Edit: Was RFC6068 und sein "MAI" betrifft, würde ich das als kontextabhängig lesen. Wenn Sie die URL für Text schreiben , liest , dann „+“ würde mehr Sinn machen, aber wenn Sie es in HTML zu schreiben sind dann wäre die strengere Auslegung der RFC3986 mehr inline mit „valid HTML“ Ideen und so etwas sollte den Wert mit erwarte, dass es verschlüsselt wird.

IBBoard
quelle
2
In RFC 3986 mailtowürde als behandelt path-rootless, was die Reihenfolge von pchardefiniert durch ermöglicht (unreserved / pct-encoded / sub-delims / ":" / "@"). +ist ein Teil von sub-delims. Strenges Lesen +erfordert also keine prozentuale Kodierung.
Eugene Yokota
3

Ich denke, dass Codierung es oder nicht, keinen wirklichen Unterschied machen wird. Das Problem sind die Mail-Clients. Beispielsweise verwendet Yahoo Mail nur einen Bindestrich für die Subadressierung, während gMail das Pluszeichen verwendet.

Das sind meine 2 Cent ...

BEARBEITEN: Die Antwort unten hat einen festen Punkt.

Bruno
quelle
Richtig, ein guter Punkt, dass es einige Unterschiede bei der E-Mail-Subadressierung gibt - aber die E-Mails in diesem Fall werden von Google Mail gehostet, sodass ich weiß, dass das Plus richtig ist und funktioniert, wenn es vom Server empfangen wird, sofern die E-Mail über den Client eingeht.
Jeff Atwood
Das Problem ist, dass die Anwendung die URI-Anforderung analysiert. Wenn es erwartet, URLEncoded-Daten zu erhalten, decodiert es die Daten, aber das ist weder für Sie (falsch zu codieren) noch für den Client (Annahmen zu treffen) fair. Das Protokoll schreibt nicht die erwartete Codierung vor, sondern der Client. Siehe die weiteren Änderungen, die ich am A von @Wez
jcolebrand am
3

Der RFC1738

3.5. MAILTO

Das mailto-URL-Schema wird verwendet, um die Internet-Postanschrift einer Person oder eines Dienstes zu bestimmen. Es sind keine zusätzlichen Informationen außer einer Internet-Postanschrift vorhanden oder impliziert.

Eine Mailto-URL hat die Form:

    mailto:<rfc822-addr-spec>

Dabei handelt es sich um die Codierung einer Adr-Spezifikation, wie in RFC 822 angegeben . In mailto-URLs sind keine Zeichen reserviert.

Beachten Sie, dass das Prozentzeichen ("%") häufig in RFC 822-Adressen verwendet wird und codiert werden muss.

Im Gegensatz zu vielen URLs stellt das mailto-Schema kein Datenobjekt dar, auf das direkt zugegriffen werden soll. Es gibt keinen Sinn, in dem es ein Objekt bezeichnet. Es hat eine andere Verwendung als der Typ message / external-body in MIME.

Da es keine reservierten Zeichen gibt, sollte es codiert werden.

S.Skov
quelle
und doch per tools.ietf.org/html/rfc6068 "Bei der Erstellung von Mailto-URIs MÜSSEN alle Leerzeichen als% 20 und '+' Zeichen als% 2B codiert werden"
Jeff Atwood
1
Since there are no reserved characters it should be encoded.ähm, das ergibt keinen Sinn.
Jcolebrand
@jcolebrand '+' ist ein Sonderzeichen im URL-Schema und muss daher codiert werden, wenn es keine besondere Rolle spielt - d. h. wenn es nicht reserviert ist.
S.Skov
@ Jeff In der Tat - mein schlechtes Leben in einer älteren RFC-Welt. Dann sagt tools.ietf.org/html/rfc2119 Ihnen im Grunde, was Sie für am besten geeignet halten.
S.Skov
das scheint ... im Geiste rückwärts zu sein, wie ich die Anweisungen anfangs gelesen habe.
Jcolebrand
3

Gemäß RFC 6068, wie in den Antworten erwähnt, KÖNNEN Sie das Pluszeichen als codieren %2B.

Der Grund für die Verwirrung ist, dass das Konvertieren eines Leerzeichens in ein Pluszeichen nicht Teil der Standard-URL-Codierung ist, sondern Teil der Codierung von Formularparametern (z. B. application/x-www-form-urlencoded).

Es ist wie der Unterschied zwischen PHP rawurlencode()und urlencode().

Was RFC 6068 sagt, ist, dass eine mailto:URL "rohe" Standard-URL-Codierung (gemäß RFC 3986 ) verwenden sollte und ein Pluszeichen, das in der URL erscheint, immer als wörtliches Pluszeichen und nicht als Leerzeichen behandelt werden sollte formularkodiert worden.

Wenn der lokale Client das Pluszeichen in ein Leerzeichen konvertiert, ist es kaputt.

Alnitak
quelle