2012-05-31 8 views
8

código para enviar correo electrónico está siguiendo:cómo codificar dirección de 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); 

Mi probelem es que como sujetos como he codificado en UTF-8 cómo puedo codificar es decir, la dirección del destinatario. new InternetAddress(address)

+1

¿Por qué codificaría la dirección del destinatario? –

+0

@MichaelLaffargue: Como el correo está en un idioma extranjero, así como la dirección del destinatario – Romi

+0

@Romi: ¿de dónde obtiene su (s) dirección (es) de correo electrónico? base de datos o algún archivo de propiedad? es 'address' a' String'? – HashimR

Respuesta

14

dirección de correo electrónico debe seguir RFC822 estándar

MimeMessage de JavaMail utiliza InternetAddress:

Esta clase representa una dirección de correo electrónico de Internet usando la sintaxis de RFC822. La sintaxis típica de la dirección es de la forma "[email protected]" o "Nombre personal < [email protected]>".

RFC822 format dice:

Tenga en cuenta que el RFC 822 limita el repertorio de caracteres a ASCII. En la práctica , otros caracteres (como ä o é) suelen funcionar dentro de las cadenas de caracteres que se utilizan con fines de comentarios (y comentarios), pero no deben usarse en las direcciones propias de .

nombres personales para la dirección de soportes diferentes juegos de caracteres

InternetAddress utiliza un nombre personal:

Si el nombre contiene caracteres que no son US-ASCII, entonces el nombre se codifica mediante el juego de caracteres especificado según RFC 2047. Si el nombre contiene solo caracteres US-ASCII, no se realiza ninguna codificación y el nombre se usa tal cual.

Para establecer el conjunto de caracteres para la codificación, hay un InternetAddress#constructor. En cuanto a las fuentes:

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

que sólo llama setPersonal(..), por tanto, elegir la forma en que es el más conveniente para usted.

Para buscar un juego de caracteres, use Charset.forName().

+0

lo que es personal, tengo una char especial en la dirección que no se muestra correctamente – Romi

+1

@Romi nombre personal es un nombre para la dirección de correo electrónico, por ejemplo: ** "Евгений Мельник" <[email protected]> **, donde la primera parte es el nombre y la segunda parte es la dirección. – JMelnik

3

hago esto, donde addressString es una dirección de correo electrónico con caracteres NLS:

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

getPersonal() obtiene el nombre personal prima si es que existe, porque si se construyó el InternetAddress con una sola cadena, o el uso de InternetAddress.parse() , que no tendrá la parte personal en nombre de una cadena separada:

pública java.lang.String getPersonal()

Obtener la persona al nombre. Si el nombre está codificado según RFC 2047, se decodifica y se convierte en Unicode. Si la descodificación o conversión falla, los datos brutos se devuelven tal como están.

Entonces setPersonal() establece la cadena de nuevo, pero esta vez contando InternetAddress para codificarla:

vacío setPersonal (nombre java.lang.String, java.lang.String charset) pública

Establezca el nombre personal. Si el nombre contiene caracteres que no sean US-ASCII, el nombre se codificará utilizando el juego de caracteres especificado según RFC 2047. Si el nombre contiene solo caracteres US-ASCII, no se realiza ninguna codificación y el nombre se utiliza tal cual.

Cuestiones relacionadas