プラスは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「Gmailを使用して送信」クローム拡張機能は、mailtoでエンコードされていないプラスに問題があることを知っています。たとえば、おそらくそれはバグです。
ジェフアトウッド

2
クロムで動作するものを使用してください。
Hardwareguy

回答:


22

プラスは、HTMLおよびSMTP(RFC2821)ではなく、URLのスペースをエンコードするために使用されます。ただし、mailto:address@server.comURI(プロトコル、プロトコルセパレータ、およびプロトコルアドレスを持っている)であるため、URIとして扱われ、パーセントエンコードされる必要があります

したがって、エンコードされた表現を正確に解決し、適切な範囲でデコードするのはクライアント次第です。ここにMicrosoftの公式の問題があります。

メールアドレスの文字がURIで予約されている場合、mailto:HTMLに埋め込まれたURLにURLエンコードを適用する必要があります。これにより、正しいことを実行できます。URIを受信した場所から適切にデコードするのはクライアント次第です。はい、this+address@gmail.com非常に有効なメールです。yes this%2Baddress@gmail.comも有効です。はい、これら2つは異なりますが、それらが異なる方法で扱われるかどうかはクライアント次第です...

前述したように、すべてのクライアントがこれを正しくレンダリングするわけではありません。ユーザーが使用する可能性が最も高いクライアント(gmail?ブラウザーベースのクライアント?Outlook?)を見つけて、そのクライアントが行うことを行うことをお勧めします。GMailでテストしたと言いましたか?どのようにテストしましたか?「ブラウザベースのmailto:クライアント(firefoxやgmailオファーへのアドオンなど)を使用すると、URIがデコードされない可能性が高くなります(そうあるべきです)。


誰がどこで機能するかに関する実際のデータを持っていますか?
ウェズファーロング

まあ私はマイクロソフトが動作を確認するものの特定のメモをしました
...-jcolebrand

これはスポットです。Gmailはそれらを正しく処理しませんが、Googleはユーザーのバグレポートを無視するため、それに対してできることはあまりありません。
マシューリード

5
+URIでエンコードしている場合は@、予約文字でもあるためエンコードする必要もあります。RFCを注意深く読むと、不透明な部分+が合法であることがわかります。
ユージン横田

私は間違っているかもしれませんが、ホスト名とホスト名を分けるために予約されていません(example@example.com/pathのように)?次に、ホスト名とユーザー名を分離するため、アドレスにその場所を作成します。
マチェイピエチョトカ

8

エンコード+できますが、そうする必要はありません。

まず、RFC 2396mailtoで指定されいる汎用URIの例であることに同意する必要があります。(これは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を次に示します。2010年に公開されたRFC 6068と呼ばれるmailtoスキームの最新のRFC では、次のように述べています。

'mailto'同様に、URIを作成するソフトウェアは、使用される予約文字をエンコードするように注意する必要があります。HTMLフォームは、'mailto'URI を作成するソフトウェアの一種です。現在の実装では、スペースをとしてエンコードしますが、 URIのスペースを実際に区別できないため、'+'問題が発生します。URIを生成するとき、すべてのスペースはとしてエンコードされるべきであり(SHOULD )、文字はとしてエンコードされる 場合があります(MAY)。 たとえば、のように、サブアドレスを示すために文字が電子メールアドレスの一部として頻繁に使用されることに注意してください。'+''+''mailto''mailto'%20'+'%2B'+'<bill+ietf@example.org>


私はその文法に完全に精通しているわけではありませんが、予約されていないプールとは別に文字をリストしているため、+が予約文字であることを示しています。エンコードする必要があることを示すものではありません。マイクロソフトはそれをエンコードすると言っています。C'est la vie、私は見るのを待ちます。
-jcolebrand

1
一部が始まらない場合は/+もはや予約文字になりません。
ユージン横田

同意しません。「メールアドレス」は非常に独特に定義されており、そもそも慎重に扱わなければなりません。その標準は非常に紛らわしいです。幸いなことに、ここで意見が分かれます。
jcolebrand

8

関連するRFCを厳密に読むと、「+」をエンコードする必要があるとされています。

http://tools.ietf.org/html/rfc2368のセクション2、ページ2の上部には次のように記載されています。

「「to」のすべてのURL予約文字はエンコードする必要があることに注意してください。特に、括弧、コンマ、およびパーセント記号(「%」)は、「メールボックス」構文でよく使用されます。」

URIのRFC(http://tools.ietf.org/html/rfc3986#section-2.2)では、予約文字として「+」がリストされています。

つまり、「正しい」とは、必ずしもすべてのブラウザーで機能するわけではありません。一部のブラウザは、明らかに正しいものを間違っているように、正しくないものを正しいかのように常に処理します。

編集:RFC6068とその「MAY」については、コンテキスト依存として読みます。あなたが読んでテキストのURLを記述している場合は、「+」、より理にかなってしかし、あなたはHTMLでそれを書いているならば、RFC3986の厳しい解釈が値を使用して、「有効なHTML」のアイデアで、何ので、より多くのインラインだろうべきエンコードされることを期待してください。


2
RFC 3986において、mailtoとして扱われることになるpath-rootlessの配列可能にする、pcharによって定義します(unreserved / pct-encoded / sub-delims / ":" / "@")+の一部ですsub-delims。そのため、厳密な読み取りでは+、パーセントエンコーディングは必要ありません。
ユージン横田


3

エンコードしてもしなくても、実際の違いはないと思います。問題はメールクライアントです。たとえば、Yahoo Mailはサブアドレスにハイフンのみを使用しますが、gMailはプラスを使用します。

それは私の2セントです...

編集:以下の応答にはしっかりしたポイントがあります。


メールのサブアドレス指定には多少の違いがあるというのは本当の良い点ですが、この場合のメールはgmailでホストされているため、プラスが正しいことを知っており、メールがクライアントを通過するとサーバーが受信したときに機能します。
ジェフアトウッド

問題は、URIリクエストを解析するアプリケーションです。URLEncodedデータを受信すると予想される場合、データをデコードしますが、それはあなたにとって(誤ってエンコードすることも)クライアントにとっても(仮定を立てることにとって)公平ではありません。プロトコルは、予想されるエンコードを指示しませんが、クライアントは指示します。@Wez
jcolebrandによる

3

RFC1738

3.5。MAILTO

mailto URLスキームは、個人またはサービスのインターネットの住所を指定するために使用されます。インターネットの郵送先住所以外の追加情報は存在または暗示されません。

mailto URLは次の形式を取ります。

    mailto:<rfc822-addr-spec>

RFC 822で指定されている addr-spec(のエンコード)です。mailto URLには、予約文字はありません。

パーセント記号( "%")はRFC 822アドレス内で一般的に使用され、エンコードする必要があることに注意してください。

多くのURLとは異なり、mailtoスキームは直接アクセスされるデータオブジェクトを表しません。オブジェクトを指定する意味はありません。MIMEのmessage / external-bodyタイプとは異なる用途があります。

予約文字がないため、エンコードする必要があります。


まだtools.ietf.org/html/rfc6068に従って「「mailto」URIを作成する場合、すべてのスペースは%20としてエンコードされるべきであり、「+」文字は%2Bとしてエンコードされる場合があります」
ジェフアトウッド

1
Since there are no reserved characters it should be encoded.うーん、それは意味をなさない。
-jcolebrand

@jcolebrand '+'はURLスキームの特殊文字であるため、特別な役割がない場合はエンコードする必要があります。予約されていないとき。
S.Skov

@Jeff Indeed-古いRFCの世界に住んでいるのは悪いことです。それからtools.ietf.org/html/rfc2119が基本的にあなたがあなたに最もふさわしいと思うことをするように指示します。
S.Skov

それは…。最初に私が指示を読んだ方法に逆らって精神のようです。
jcolebrand

3

パーRFC 6068の回答で述べたように、あなたにプラス記号を符号化することができます%2B

混乱する理由は、スペースをプラスに変換することは実際には標準のURLエンコーディングの一部ではなく、フォームパラメータエンコーディングの一部であるということです(つまりapplication/x-www-form-urlencoded

これは、PHPの違いのようなものだrawurlencode()urlencode()

したがって、RFC 6068が言っているのは、mailto:URLが「RFC 3986による」「生の」標準URLエンコーディングを使用する必要があることです。フォームエンコードされています。

ローカルクライアントがプラスをスペースに変換すると、破損します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.