2015-05-08 20 views
16

Given: URI (dưới hình thức của một đối tượng String):Làm thế nào để (chính xác) tạo URL mailto (URI) trong Java?

String email1 = "[email protected]"; 

// legal email address according to wikipedia [1] 
String email2 = "\"()<>[]:,;@\\\"!#$%&'*+-/=?^_`{}| ~.a\"@example.org"; 

các/cách chính xác nhất để tạo ra một mailto là gì?

tôi đã cố gắng:

String uri = new URI("mailto", the_email_address, null).toString(); 

này là gần nhất tôi nhận, nhưng nó không mã hóa các dấu hỏi ở phần cục bộ của địa chỉ email, nhưng theo RFC 6068 nó nên (?). Nó cũng không thành công trên các ví dụ trong RFC, như "[email protected]"@example.org hoặc không [email protected].

[1] Valid_email_addresses examples

PS: Có một số thông tin hữu ích trong Should plus be encoded in mailto: hyperlinks?


tôi giải quyết cho điều này như một giải pháp:

import org.apache.http.client.utils.URIBuilder; 
// from Apache HttpClient 
// maven group: org.apache.httpcomponents artifact: httpclient 

String emailURL = new URIBuilder().setScheme("mailto").setPath(the_email_address).toString(); 
+0

Tôi nhận thấy rằng ví dụ của bạn đang tạo URI từ email1 tuy nhiên nó không có dấu chấm hỏi, bạn có ý định sử dụng email2 không? –

+0

Dấu hỏi nằm trong ví dụ khác. Nhận xét đó là chung: phương thức đã sử dụng không hoạt động nếu địa chỉ thư có dấu chấm hỏi trong đó. –

+0

@ DavidBalažic là bạn không thể sử dụng Apache commons URI builder? hoặc là yêu cầu ur khác nhau? –

Trả lời

12

Bạn phải tự phần trăm mã hóa/thoát khỏi số ?&.

String email2 = "\"()<>[]:,;@\\\"!#$%&'*+-/=?^_`{}| ~.a\"@example.org"; 
String uri2 = (new URI("mailto", email2, null)).toString().replace("?", "%3F").replace("&", "%26"); 

Vì vậy, có vẻ như rằng ?& những biểu tượng không được trốn thoát một cách chính xác trong URI. Mọi thứ sau ? đều bị bỏ qua trong URI vì biểu tượng đó được dành riêng cho "chuỗi truy vấn" trong URL. Tham chiếu here.

Theo this và tài liệu tham chiếu, chúng tôi cũng cần thoát khỏi số &. Đối với một số lý do, Java không làm điều đó cho chúng tôi. Trên thực tế, RFC 6068 thậm chí còn cho biết:

Một số ký tự có thể xuất hiện trong PHẢI là được mã hóa phần trăm. Đây là các ký tự không thể xuất hiện trong một URI theo [STD66] cũng như "%" (vì nó được sử dụng cho phần trăm mã hóa) và tất cả các ký tự trong gen-delims ngoại trừ "@" và ":" (ví dụ: "/", "?", "#", "[" và "]"). Trong số các ký tự trong phân khúc phụ, ít nhất các phần sau cũng phải là phần trăm- được mã hóa: "&", ";" và "=".

Cách khắc phục (phần nào là hack, nhưng nó hoạt động) là tự thoát khỏi các ký tự này bằng cách sử dụng % tiếp theo là giá trị hex ASCII 2 chữ số cho ký hiệu. Tham chiếu this.

Tôi đã thử nghiệm bằng cách dán chuỗi kết quả vào Chrome và nó mở ra một cách chính xác lập email mặc định của tôi với một email đến

"()<>[]:,; @\"!#$%&'*+-/=?^_`{}| ~.a"@example.org 

nghiên cứu nhiều hơn

Vì vậy, có vẻ như lớp URI Java sử dụng RFC 2396, trong đó nêu rõ:

Nếu dữ liệu cho thành phần URI xung đột với rese mục đích được khắc phục, khi đó dữ liệu xung đột phải được thoát trước khi tạo thành URI.

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

Các "dành riêng" class cú pháp trên đề cập đến những nhân vật mà là phép trong vòng một URI, nhưng mà thể không được phép trong một thành phần đặc biệt của cú pháp URI chung;

4

Bạn sẽ phải sử dụng Apache Commons URI builder

Giá trị được dự kiến ​​sẽ không thoát và có thể chứa phi ASCII ký tự.

Bạn có thể không trực tiếp sử dụng java uri lớpJava URI doc nói
Tất cả các ký tự dấu được dành riêng cùng với những người trong chuỗi "?/[] @" ​​reserved.

lớp URI Java sử dụng RFC 2396, trong đó nêu: Nếu dữ liệu cho một thành phần URI sẽ mâu thuẫn với mục đích dành riêng , sau đó dữ liệu mâu thuẫn phải được thoát ra trước khi hình thành URI.

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

Bạn có thể sử dụng java.net.URLEncoder để mã hóa các user_name và sau đó sử dụng mã hóa tên người dùng để tạo ra các URI String uri = new URI("mailto", the_email_address, null).toString(); hoặc
Bạn có thể tự trăm mã hóa/thoát khỏi? và &.

String email2 = "\"()<>[]:,;@\\\"!#$%&'*+-/=?^_`{}| ~.a\"@example.org"; 
String uri2 = (new URI("mailto", email2, null)).toString().replace("?", "%3F").replace("&", "%26"); 

Trong JavaScript, bạn có thể sử dụng chức năng encodeURI(). PHP có chức năng rawurlencode() và ASP có chức năng Server.URLEncode().


0

Bạn có thể muốn sử dụng URI.create (String uri) phương pháp tĩnh để tạo ra của bạn mailto uri, thay vì sử dụng "mới" constructor. Ví dụ: điều này trả về URI hợp lệ (Tôi đang sử dụng jdk 7):

URI.create("mailto:[email protected]"); 

Tôi hy vọng điều đó sẽ hữu ích.

Chúc mừng.

+0

JavaDoc nói: "Phương pháp này được cung cấp để sử dụng trong các tình huống mà nó được biết rằng chuỗi đã cho là một URI hợp pháp" Vì vậy, tôi có thể sử dụng phương pháp này, khi tôi đã có một giải pháp. ;) –

Các vấn đề liên quan