2015-05-08 10 views
16

Dato:Come (correttamente) creare mailto URL (URI) in Java?

String email1 = "[email protected]"; 

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

Qual è il modo migliore/corretto per creare un mailto: URI (sotto forma di un oggetto String)?

ho provato:

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

Questo è il più vicino che ho ottenuto, ma non codifica il punto interrogativo nella parte locale dell'indirizzo di posta elettronica, ma secondo RFC 6068 dovrebbe (?). Fallisce anche sugli esempi nella RFC, come "[email protected]"@example.org o [email protected].

[1] Valid_email_addresses examples

PS: Ci sono alcune informazioni utili in Should plus be encoded in mailto: hyperlinks?


ho optato per questo come una soluzione:

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

Ho notato che il tuo esempio sta creando un URI da email1 ma non ha un punto interrogativo, intendevi usare email2? –

+0

Il punto interrogativo è in altro esempio. Quel commento era generale: il metodo usato non funziona se l'indirizzo mail contiene un punto interrogativo. –

+0

@ DavidBalažic non sei in grado di utilizzare il costruttore URI di Apache Commons? o il tuo requisito è diverso? –

risposta

12

Dovete manualmente per cento codifica/sfugge allo ? e allo &.

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

Così sembra che i ? e & simboli non vengono correttamente fuggiti nella URI. Qualunque cosa dopo lo ? viene ignorata nell'URI perché quel simbolo è riservato per "stringhe di query" negli URL. Riferimento here.

In base allo this e ai documenti di riferimento, è necessario sfuggire allo &. Per qualche ragione, Java non lo fa per noi. Infatti, RFC 6068 afferma anche:

Un numero di caratteri che può apparire in DEA essere percento-codificato. Questi sono i caratteri che non possono apparire in un URI secondo [STD66] e "%" (perché è utilizzato per la codifica percentuale ) e tutti i caratteri in gen-delim eccetto "@" e ":" (cioè "/", "?", "#", "[" e "]"). Dei caratteri in sub-delimitazioni, almeno i seguenti devono anche essere codificati in percentuale : "&", ";" e "=".

Il modo per risolvere il problema (un po 'di un hack, ma funziona) è quello di fuggire manualmente questi caratteri utilizzando un valore ASCII esadecimale % seguita da 2 cifre per il simbolo. Riferimento this.

ho provato incollando la stringa risultante in Chrome ed è aperto correttamente la mia e-mail di default con una mail a

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

Più ricerca

Così sembra che la classe URI di Java utilizza RFC 2396, che afferma:

Se i dati per un componente URI sono in conflitto con la risorsa scopo, i dati in conflitto devono essere preceduti da escape prima dello che forma l'URI.

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

Il "riservato" classe sintassi sopra si riferisce a quei caratteri che sono consentito entro URI, ma che può non consentita entro un particolare componente della sintassi URI generico ;

4

Si dovrà utilizzare Apache Commons URI costruttore

Il valore dovrebbe essere escape e può contenere non ASCII caratteri.

Non è possibile utilizzare direttamente java classe uriJava URI doc dice
Tutti i caratteri di punteggiatura sono riservati insieme a quelli nella stringa "?/[] @" ​​ sono riservati .

classe URI di Java utilizza RFC 2396, in cui si afferma: Se i dati di un componente URI sarebbero in conflitto con lo scopo riservata , poi i dati contrastanti deve essere sfuggito prima formare l'URI.

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

È possibile utilizzare java.net.URLEncoder per codificare il nome utente e quindi uso nome utente codificato per creare l'URI String uri = new URI("mailto", the_email_address, null).toString(); o
È possibile manualmente per cento di codifica/sfuggire alla? e &.

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

In JavaScript è possibile utilizzare la funzione encodeURI(). PHP ha la funzione rawurlencode() e ASP ha la funzione Server.URLEncode().


0

Probabilmente si desidera utilizzare l'URI.create (String uri) metodo statico per creare il vostro mailto uri, invece di utilizzare la funzione di costruzione "nuovo". Ad esempio, questo restituisce un URI valido (sto usando JDK 7):

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

spero che aiuta.

Cheers.

+0

JavaDoc dice: "Questo metodo è fornito per l'uso in situazioni in cui è noto che la stringa data è un URI legale" Così posso usare questo metodo, quando ho già una soluzione. ;) –

Problemi correlati