2012-05-31 6 views
8

codice per inviare e-mail è il seguente:Come codificare l'indirizzo Internet

MimeMessage msg = new MimeMessage(session); 
    msg.setSubject("subject", "UTF-8"); // here you specify your subject encoding 
    msg.setContent("yourBody", "text/plain; charset=utf-8"); 

    msg.setFrom("senderAddress"); 
    msg.addRecipient(Message.RecipientType.TO, new InternetAddress(address)); 
    Transport.send(msg); 

mio probelem è che soggetto come ho codificato in utf-8 Come posso codificare l'indirizzo del destinatario vale a dire. new InternetAddress(address)

+1

Perché codificare l'indirizzo del destinatario? –

+0

@MichaelLaffargue: Poiché la posta è in lingua straniera, così come l'indirizzo del destinatario – Romi

+0

@Romi: da dove prendi il tuo indirizzo/i di posta elettronica? database o qualche file di proprietà? è 'address' a' String'? – HashimR

risposta

14

Indirizzo e-mail dovrebbe seguire RFC822 standard di

del JavaMail utilizza MIMEMessage InternetAddress:

Questa classe rappresenta un indirizzo di posta elettronica Internet utilizzando la sintassi di RFC822. La sintassi degli indirizzi tipica è del tipo "[email protected]" o "Nome personale < [email protected]>".

RFC822 format dice:

noti che RFC 822 limita il repertorio carattere ASCII. Nella pratica , altri caratteri (come ä o é) di solito funzionano all'interno delle stringhe citate utilizzate per scopi di commento (e commenti), ma non devono essere usati negli indirizzi corretti, .

nomi personali per l'indirizzo supporta diversi set di caratteri

InternetAddress utilizza un nome di persona:

Se il nome contiene caratteri non US-ASCII, allora il nome viene codificato con il set di caratteri specificato come da RFC 2047. Se il nome contiene solo caratteri US-ASCII, non viene eseguita alcuna codifica e il nome viene utilizzato così com'è.

Per impostare il set di caratteri per la codifica, c'è un InternetAddress#constructor. Guardando fonti:

public InternetAddress(String address, String personal, String charset) 
     throws UnsupportedEncodingException { 
    this.address = address; 
    setPersonal(personal, charset); 
} 

semplicemente chiama setPersonal(..), quindi scegliere il modo che è il più conveniente per voi.

Per cercare un set di caratteri, utilizzare Charset.forName().

+0

cos'è personale, ho un carattere speciale nell'indirizzo che non viene visualizzato correttamente – Romi

+1

@Romi nome personale è un nome per l'indirizzo di posta elettronica, ad esempio: ** "Евгений Мельник" <[email protected]> **, dove prima parte è il nome e la seconda parte è l'indirizzo. – JMelnik

3

faccio questo, in cui addressString è un indirizzo di posta elettronica con i caratteri NLS:

InternetAddress address = new InternetAddress(addressString); 
String personal = address.getPersonal(); 
if(personal != null) { 
    address.setPersonal(personal, "utf-8"); 
} 

getPersonal() ottiene il nome personale cruda se ce n'è una, perché se si costruì l'InternetAddress con una singola stringa, o utilizzando InternetAddress.parse() , non si avrà il nome della parte personale in una stringa separata:

pubblico java.lang.String getPersonal()

ottenere la persona al nome. Se il nome è codificato come da RFC 2047, viene decodificato e convertito in Unicode. Se la decodifica o la conversione falliscono, i dati grezzi vengono restituiti così come sono.

Poi setPersonal() imposta la stringa di nuovo, ma questa volta raccontando InternetAddress a codificarlo:

public void setPersonal (nome java.lang.String, java.lang.String charset)

Imposta il nome personale. Se il nome contiene caratteri non US-ASCII, il nome verrà codificato utilizzando il set di caratteri specificato come da RFC 2047. Se il nome contiene solo caratteri US-ASCII, non viene eseguita alcuna codifica e il nome viene utilizzato così com'è.