더하기는 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>

나는 이것을 알 수 없으며 문서가 충돌합니다. 우리의 실제 테스트는 결과가 혼합되어 더욱 혼란스러워졌습니다.


실제 테스트의 방법과 결과에 대해 더 구체적으로 설명 할 수 있습니까? 일부 이메일 클라이언트 / 서비스는 올바르게 처리하고 다른 이메일 클라이언트는 질식합니까? 더 자세하게 얘기해 주 시겠어요?
Bryson

1
@bryson 나는 "gmail을 사용하여 보내기"크롬 확장 프로그램이 mailto에서 인코딩되지 않은 더하기 문제가 있음을 알고 있습니다. 예를 들어, 아마도 버그 일 것입니다.
Jeff Atwood

2
크롬으로 작동하는 것을 사용하십시오.
Hardwareguy

답변:


21

플러스는 SMTP가 아닌 HTML이 아닌 URL로 공백을 인코딩하는 데 사용됩니다 (RFC2821). 그러나 mailto:address@server.comURI (프로토콜, 프로토콜 구분 기호 및 프로토콜 주소가 있음)이므로 URI처리해야하며 백분율로 인코딩되어야합니다 .

따라서, 인코딩 된 표현을 정확하게 해석하고 적절하게 디코딩하는 것은 클라이언트의 몫이다. 다음은 Microsoft의 공식 문제 입니다.

이메일 주소의 문자가 URI 예약 된 경우 mailto : HTML에 포함 된 URL에 URL 인코딩을 적용해야합니다. 이렇게하면 올바른 작업을 수행 할 수 있습니다. URI를 수신 한 시점부터 적절하게 디코딩하는 것은 클라이언트의 책임입니다. 예, this+address@gmail.com매우 유효한 이메일입니다. 예 this%2Baddress@gmail.com도 유효합니다. 예,이 두 가지가 다르지만 다르게 취급 될지는 고객에게 달려 있습니다.

앞에서 언급했듯이 모든 클라이언트가이를 올바르게 렌더링하는 것은 아닙니다. 사용자가 사용할 가능성이 가장 높은 클라이언트 (gmail? 브라우저 기반 클라이언트? Outlook?)를 찾아 해당 클라이언트의 기능을 수행하는 것이 좋습니다. 당신은 당신이 GMail에서 테스트했다고 말했다? 어떻게 테스트 했습니까? "브라우저 기반 mailto : 클라이언트 (예 : firefox 및 gmail 제공에 대한 애드온)를 사용하면 URI가 디코딩되지 않을 가능성이 높습니다.


어디에서 작동하는지에 대한 실제 데이터가 있습니까?
Wez Furlong

글쎄, 나는 마이크로 소프트가 작동하는 것을 구체적으로 언급했다.
jcolebrand

이 자리에 있습니다. Gmail은이를 제대로 처리하지 못하지만 Google은 사용자 버그 보고서를 무시하기 때문에 할 수있는 일이 많지 않습니다.
Matthew 읽기

5
당신은 인코딩이있는 경우 +URI에, @그것은 또한 예약 된 문자이기 때문에 또한 인코딩 할 필요가있다. RFC를주의 깊게 읽으면 불투명 한 부분 +이 합법적 이라는 것을 알 수 있습니다.
유진 요코타

내가 틀렸을 수도 있지만 example@example.com/path 와 같이 사용자 이름을 호스트와 분리하도록 예약되어 있지 않습니까? 그런 다음 사용자 이름을 호스트와 분리하므로 주소에 위치합니다.
Maciej Piechotka

7

인코딩 +할 수도 있지만 반드시 할 필요는 없습니다.

먼저 RFC 2396에mailto 지정된 일반 URI의 예라는 것에 동의해야합니다 . (이것은 XHTML과 HTML 4가 사용하는 것입니다).

이제 RFC 2396에서 예약 문자 목록을 찾아 보겠습니다.

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

URI는 절대 및 상대로 분할됩니다.

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

그리고 scheme 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

따라서 /첫 번째 문자의 경우 이스케이프 해야하지만 이후에는 +and를 포함한 예약 문자를 넣을 수 있습니다 @.

이를 지원하기위한 다른 RFC가 있습니다. RFC 6068 이라는 2010 년에 게시 된 mailto 체계의 최신 RFC에서 다음과 같이 말합니다.

'mailto'마찬가지로 URI를 생성하는 소프트웨어 는 사용 된 예약 문자를 인코딩 할 때주의해야합니다. HTML 양식은 'mailto'URI 를 생성하는 일종의 소프트웨어입니다 . 현재 구현은 공백을로 인코딩 '+'하지만 '+'공백에 대한 이러한 순위 '+''mailto' URI 에서 실제와 구별 될 수 없기 때문에 문제가 발생 합니다. 'mailto'URI를 생성 할 때 모든 공백은로 인코딩해야 %20하고 '+'문자 는로 인코딩해야 합니다 (MAY) %2B. 주의하시기 바랍니다 '+' 문자가 자주 예를 들면 같은 하위 주소를 표시하기 위해 이메일 주소의 일부로서 사용된다 <bill+ietf@example.org>.


나는 그 문법에 완전히 익숙하지는 않지만, 예약되지 않은 풀과는 별개로 문자를 나열합니다. +는 예약 된 문자임을 나타냅니다. 인코딩 해야 함을 나타내지는 않습니다 . 마이크로 소프트는 그것을 인코딩하라고 말했다. C'est la vie, 나는 기다린다.
jcolebrand

1
일부가로 시작하지 않는 경우 /, +더 이상 예약 문자가된다 없습니다.
유진 요코타

동의하지 않습니다. "이메일 주소"는 매우 구체적으로 정의되어 있으며, 우선주의해서 다루어야합니다. 그 표준은 매우 혼란 스럽습니다. 다행히도 우리는 여기에 동의하지 않습니다.
jcolebrand

7

관련 RFC를 엄격히 읽으면 "+"를 인코딩해야합니다.

http://tools.ietf.org/html/rfc2368 의 섹션 2, 2 페이지 상단에 다음과 같이 나와 있습니다.

"to"의 모든 URL 예약 문자는 인코딩해야합니다. 특히 괄호, 쉼표 및 퍼센트 기호 ( "%")는 일반적으로 "mailbox"구문에서 발생합니다. "

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로 호스팅되므로 전자 메일이 클라이언트를 통과한다고 가정하면 플러스가 정확하고 서버가 수신하면 작동합니다.
Jeff Atwood

문제는 애플리케이션이 URI 요청을 구문 분석하는 것입니다. URLEncoded 데이터를 수신 할 것으로 예상되는 경우 데이터를 디코딩하지만 사용자에게 (가상으로 인코딩) 또는 클라이언트에게 (가정을) 공평하지 않습니다. 프로토콜은 예상되는 인코딩을 지시하지 않으며 클라이언트는 지시합니다. 내가 @Wez에 의해 A에 추가 수정 사항을 참조하십시오
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의 메시지 / 외부 본문 유형과 다른 용도로 사용됩니다.

예약 된 문자가 없으므로 인코딩해야합니다.


그리고 여전히 tools.ietf.org/html/rfc6068에 따르면 " ' mailto'URI를 생성 할 때 모든 공백은 % 20으로 인코딩되어야하고 '+'문자는 % 2B로 인코딩 될 수 있습니다"
Jeff Atwood

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은 "원시"표준 URL 인코딩 ( RFC 3986에 따라 )을 사용해야하며 URL에 나타나는 더하기 부호는 항상 공백이 아니라 리터럴 더하기 부호로 취급해야합니다. 양식 인코딩되었습니다.

로컬 클라이언트가 플러스를 공백으로 변환하면 깨진 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.