Có nên cộng mã hóa trong mailto: hyperlinks?


39

Khi đặt một địa chỉ email bằng thẻ địa chỉ (còn gọi là địa chỉ phụ) trong một siêu liên kết mailto

<a href="mailto:username+foo@example.com">mail us now!</a>

Nên cộng điểm trong email có được mã hóa URL không?

<a href="mailto:username%2Bfoo@example.com">mail us now!</a>

Tôi không thể tìm ra điều này, và tài liệu này là xung đột. Các thử nghiệm trong thế giới thực của chúng tôi cũng đã tạo ra kết quả hỗn hợp, làm cho nó thậm chí còn khó hiểu hơn.


Bạn có thể cụ thể hơn về các phương pháp và kết quả của các bài kiểm tra trong thế giới thực của bạn? Do một số khách hàng / dịch vụ email đối xử với nó đúng cách và những người khác bị sặc? Bạn có thể cụ thể hơn không?
Bryson

1
@bryson Tôi biết tiện ích chrome "gửi bằng gmail" đã gặp sự cố với cộng với chưa được mã hóa trong mailto: ví dụ: nhưng có lẽ đó là một lỗi.
Jeff Atwood

2
Chỉ cần sử dụng bất cứ ai làm việc với chrome.
Phần cứng

Câu trả lời:


22

Dấu cộng được sử dụng để mã hóa khoảng trắng trong URL, không phải bằng HTML và không phải là SMTP (RFC2821). Tuy nhiên, vì mailto:address@server.comlà một URI (nó có một giao thức, dấu phân cách giao thức và địa chỉ giao thức) nên nó phải được coi là một URI và nó phải được mã hóa phần trăm .

Do đó, tùy thuộc vào ứng dụng khách để giải quyết chính xác biểu diễn được mã hóa và giải mã nó theo mức độ phù hợp. Đây là chính thức của Microsoft về vấn đề này .

Bạn nên áp dụng mã hóa URL trên mailto: URL được nhúng trong HTML nếu các ký tự trong địa chỉ email được bảo lưu URI. Điều này đảm bảo rằng bạn đang làm đúng. Tùy thuộc vào ứng dụng khách để giải mã URI một cách thích hợp từ khi nhận được. Vâng, this+address@gmail.comlà một email rất hợp lệ; vâng this%2Baddress@gmail.comcũng hợp lệ. Có, hai cái đó khác nhau, nhưng liệu chúng có được đối xử khác nhau hay không là tùy thuộc vào khách hàng ...

Như bạn đã lưu ý trước đây, không phải tất cả các máy khách đều hiển thị chính xác. Tôi khuyên bạn nên tìm ứng dụng khách có khả năng nhất (gmail? Máy khách dựa trên trình duyệt? Outlook?) Mà người dùng của bạn sẽ sử dụng và thực hiện những gì khách hàng đó làm. Bạn nói bạn đã thử nghiệm trên GMail? Làm thế nào bạn kiểm tra nó? Với "trình duyệt mailto: client (chẳng hạn như tiện ích bổ sung cho firefox và gmail), URI rất có thể không được giải mã (như vậy).


Có ai có bất kỳ dữ liệu thực tế về những gì làm việc ở đâu?
Wez Furlong

tôi cũng đã ghi chú cụ thể về những gì Microsoft khẳng định hoạt động ...
jcolebrand

Đây là vị trí trên. Gmail không xử lý chúng một cách chính xác, nhưng vì Google bỏ qua các báo cáo lỗi của người dùng nên bạn không thể làm gì nhiều về nó.
Matthew đọc

5
Nếu bạn đã mã hóa +trong URI, @cũng cần phải được mã hóa vì đó cũng là một ký tự dành riêng. Nếu bạn đọc RFC cẩn thận, bạn sẽ thấy rằng trong một phần mờ đục, +là hợp pháp.
Eugene Yokota

Tôi có thể sai nhưng không dành riêng để tách tên người dùng khỏi máy chủ (như trong example@example.com/path )? Sau đó, nó sẽ đặt vị trí của nó trong địa chỉ vì nó tách tên người dùng khỏi máy chủ.
Maciej Piechotka

8

Bạn CÓ THỂ mã hóa +, nhưng bạn không phải làm thế.

Đầu tiên, chúng ta cần đồng ý rằng đó mailtolà một ví dụ về URI chung, được chỉ định bởi RFC 2396 . (Đây là những gì XHTML và HTML 4 sử dụng).

Bây giờ chúng ta hãy tìm hiểu danh sách các nhân vật dành riêng trong RFC 2396.

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

URI chia thành tuyệt đối và tương đối:

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

Và bởi vì lược đồ mailto:được chỉ định nên đây là một URI tuyệt đối:

absoluteURI   = scheme ":" ( hier_part | opaque_part )

Và vì cả hai mẫu để hier_partbắt đầu /, mailtolà một phần mờ đục.

opaque_part   = uric_no_slash *uric

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

uric          = reserved | unreserved | escaped

Vì vậy, hạn chế là bạn phải thoát /nếu nói đến ký tự đầu tiên, nhưng sau đó bạn có thể đặt các ký tự dành riêng bao gồm +@.

Đây là một RFC khác để hỗ trợ này. Trong các RFC mới nhất của sơ đồ mailto được xuất bản năm 2010 được gọi là RFC 6068 , nó nói:

Phần mềm tạo 'mailto'URI tương tự phải cẩn thận để mã hóa bất kỳ ký tự dành riêng nào được sử dụng. Các biểu mẫu HTML là một loại phần mềm tạo 'mailto'URI. Các triển khai hiện tại mã hóa một không gian như '+', nhưng điều này tạo ra các vấn đề bởi vì '+'không thể phân biệt được chỗ đứng như vậy đối với không gian thực '+'trong 'mailto' URI. Khi tạo 'mailto'URI, tất cả các khoảng trắng NÊN được mã hóa thành %20và các '+'ký tự CÓ THỂ được mã hóa thành %2B. Xin lưu ý rằng các '+' ký tự thường được sử dụng như một phần của địa chỉ email để chỉ ra một phần phụ, ví dụ như trong <bill+ietf@example.org>.


Tôi không hoàn toàn quen thuộc với ngữ pháp đó, tuy nhiên, nó liệt kê các ký tự tách biệt với nhóm không được kiểm soát, điều này cho thấy + là một ký tự dành riêng. Nó không chỉ ra rằng nó phải được mã hóa. Microsoft nói để mã hóa nó. C'est la vie, tôi chờ xem.
jcolebrand

1
Khi một phần không bắt đầu /, +không còn trở thành một nhân vật dành riêng.
Eugene Yokota

Tôi không đồng ý. "Địa chỉ email" được xác định rất đặc biệt và phải được xử lý cẩn thận ngay từ đầu. Tiêu chuẩn đó rất khó hiểu. May mắn thay, chúng tôi nhận được bất đồng ở đây.
jcolebrand

8

Một bài đọc nghiêm ngặt của RFC có liên quan nói rằng "+" nên được mã hóa.

Mục 2, đầu trang 2 trên http://tools.ietf.org/html/rfc2368 nói:

"Lưu ý rằng tất cả các ký tự dành riêng URL trong" đến "phải được mã hóa: cụ thể là dấu ngoặc đơn, dấu phẩy và dấu phần trăm ("% "), thường xảy ra trong cú pháp" hộp thư "."

RFC cho URI (http://tools.ietf.org/html/rfc3986#section-2.2) liệt kê "+" dưới dạng ký tự dành riêng.

Điều đó nói rằng, "chính xác" không nhất thiết là những gì sẽ hoạt động trong tất cả các trình duyệt. Một số trình duyệt rõ ràng sẽ luôn xử lý những thứ chính xác như thể chúng sai và không chính xác như thể chúng đúng.

Chỉnh sửa: Đối với RFC6068 và "CÓ THỂ", tôi sẽ đọc đó là phụ thuộc vào ngữ cảnh. Nếu bạn đang viết URL để đọc văn bản thì "+" sẽ có ý nghĩa hơn, tuy nhiên nếu bạn viết nó bằng HTML thì cách giải thích chặt chẽ hơn của RFC3986 sẽ phù hợp hơn với các ý tưởng "HTML hợp lệ" và vì vậy mọi thứ sử dụng giá trị nên mong đợi nó được mã hóa


2
Trong RFC 3986, mailtosẽ được coi là path-rootless, cho phép trình tự pcharxác định bởi (unreserved / pct-encoded / sub-delims / ":" / "@"). +là một phần của sub-delims. Vì vậy, đọc nghiêm ngặt nói +không yêu cầu mã hóa phần trăm.
Eugene Yokota


3

Tôi nghĩ rằng mã hóa nó hay không, sẽ không tạo ra sự khác biệt thực sự. Vấn đề là các khách hàng thư. Đối với bài kiểm tra, Yahoo Mail chỉ sử dụng dấu gạch nối cho địa chỉ phụ trong khi gMail sử dụng dấu cộng.

Đó là 2 xu của tôi ...

EDIT: Phản hồi dưới đây có một điểm vững chắc.


đúng, điểm tốt là có một số phương sai trong việc đánh địa chỉ email - nhưng các email trong trường hợp này là gmail được lưu trữ để tôi biết dấu cộng là chính xác và sẽ hoạt động khi nhận được bởi máy chủ, giả sử email được gửi qua máy khách.
Jeff Atwood

Vấn đề là ứng dụng phân tích yêu cầu URI. Nếu nó mong nhận được dữ liệu URLEncoding thì nó sẽ giải mã dữ liệu, nhưng điều đó không công bằng với bạn (để mã hóa sai) cũng như cho khách hàng (để đưa ra các giả định). Giao thức không ra lệnh mã hóa dự kiến, khách hàng thực hiện. Xem các chỉnh sửa tiếp theo mà tôi thực hiện cho A của @Wez
jcolebrand

3

các RFC1738

3.5. MAILTO

Lược đồ URL mailto được sử dụng để chỉ định địa chỉ gửi thư Internet của một cá nhân hoặc dịch vụ. Không có thông tin bổ sung nào ngoài địa chỉ gửi thư Internet có mặt hoặc ngụ ý.

URL mailto có dạng:

    mailto:<rfc822-addr-spec>

trong đó (mã hóa của một) addr-spec, như được chỉ định trong RFC 822 . Trong URL mailto, không có ký tự dành riêng.

Lưu ý rằng dấu phần trăm ("%") thường được sử dụng trong các địa chỉ RFC 822 và phải được mã hóa.

Không giống như nhiều URL, lược đồ mailto không đại diện cho một đối tượng dữ liệu được truy cập trực tiếp; không có ý nghĩa trong đó nó chỉ định một đối tượng. Nó có cách sử dụng khác với loại tin nhắn / cơ thể bên ngoài trong MIME.

Vì không có ký tự dành riêng nên nó được mã hóa.


và trên mỗi công cụ.ietf.org / html / rfc6068 "Khi tạo URI 'mailto', tất cả các khoảng trắng NÊN được mã hóa thành% 20 và các ký tự '+' có thể được mã hóa thành% 2B"
Jeff Atwood

1
Since there are no reserved characters it should be encoded.ummmm không có ý nghĩa gì
jcolebrand

@jcolebrand '+' là một ký tự đặc biệt trong lược đồ URL và do đó phải được mã hóa khi nó không có vai trò đặc biệt - tức là. khi nó không được bảo lưu
S.Skov

@Jeff Thật vậy - điều tồi tệ của tôi khi sống trong một thế giới RFC cũ. Sau đó, tools.ietf.org/html/rfc2119 về cơ bản sẽ bảo bạn làm những gì bạn cảm thấy phù hợp nhất với bạn.
S.Skov

điều đó dường như .... ngược về tinh thần với cách tôi đọc hướng dẫn ban đầu.
jcolebrand

3

Theo RFC 6068 như được đề cập trong câu trả lời, bạn CÓ THỂ mã hóa dấu cộng dưới dạng %2B.

Lý do có sự nhầm lẫn là việc chuyển đổi một khoảng trắng thành dấu cộng thực sự không phải là một phần của mã hóa URL tiêu chuẩn, đó là một phần của mã hóa tham số biểu mẫu (nghĩa là application/x-www-form-urlencoded)

Nó giống như sự khác biệt giữa PHP rawurlencode()urlencode().

Vì vậy, điều mà RFC 6068 đang nói là một mailto:URL nên sử dụng mã hóa URL tiêu chuẩn "thô" (theo RFC 3986 ) và một dấu cộng xuất hiện trong URL phải luôn được coi là dấu cộng, và không phải là khoảng trắng có được mã hóa dưới dạng.

Nếu máy khách cục bộ chuyển đổi dấu cộng thành khoảng trắng thì nó bị hỏng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.