setcontent - utf 8 charset no funciona con el correo javax
mimebodypart setcontent utf8 (4)
Para todos los correos electrónicos
Hay un par de propiedades del sistema relacionadas con el envío de correos , que probablemente puedan simplificar su código. Estoy hablando de esta propiedad específica en realidad: "mail.mime.charset"
.
La propiedad del sistema
mail.mime.charset
se puede usar para especificar el conjunto de caracteres MIME predeterminado que se utilizará para palabras codificadas y partes de texto que no especifiquen un juego de caracteres. Normalmente, el juego de caracteres MIME predeterminado se deriva delfile.encoding
caracteres predeterminado de Java, como se especifica en la propiedad del sistemafile.encoding
. La mayoría de las aplicaciones no tendrán que establecer explícitamente el juego de caracteres MIME predeterminado. En los casos en que el juego de caracteres MIME predeterminado que se utilizará para los mensajes de correo sea diferente del juego de caracteres utilizado para los archivos almacenados en el sistema, se debe establecer esta propiedad.
Como puede leer arriba, de manera predeterminada no hay ningún valor para mail.mime.charset
y se mail.mime.charset
la codificación del archivo (propiedad file.encoding
).
Para un correo electrónico específico
Sin embargo, si desea especificar una codificación específica para un correo electrónico específico, entonces probablemente debería utilizar los métodos de 2 parámetros setSubject(subject,charset)
y setText(text,charset)
.
Si eso no funciona, entonces probablemente su entrada ya está dañada antes de llegar a este punto. En otras palabras, probablemente usaste la codificación incorrecta para recolectar tus datos .
Los tipos MIME son complicados
El setContent(content, "UTF-8")
(como dicen otras fuentes) simplemente no funcionará. Basta con mirar la firma de este método: setContent(Object content, String mimetype)
. El tipo MIME y el juego de caracteres son 2 cosas totalmente diferentes. Imho, realmente deberías estar usando uno de los métodos setText(...)
con un parámetro de juego de caracteres.
Pero si persiste en usar un tipo mimet para establecer el juego de caracteres setContent(content,mimetype)
, entonces use el formato correcto. (no solo "UTF-8"
, sino algo como "text/plain; charset=UTF-8"
). Pero más importante aún, tenga en cuenta que cada tipo de mimo tiene su propia forma de manejar conjuntos de caracteres.
- Como se especifica en RFC-2046 el juego de caracteres predeterminado para
text/plain
esUS-ASCII
, pero puede anularse con un parámetro deUS-ASCII
caracteres adicional. - Sin embargo, en RFC-6657 deja en claro que el tipo
text/xml
determina el juego de caracteres utilizando el contenido del mensaje. El parámetro de conjunto de caracteres simplemente se ignorará aquí. - Y en RFC-2854 se afirma que
text/html
siempre debería especificar un juego de caracteres. Pero si no lo hace, usaráISO-8859-1
(=Latin-1
).
He utilizado Javax Mail API para enviar correos electrónicos. Estoy usando un formulario de contacto para enviar la entrada, que debe enviarse a un correo electrónico específico.
El correo electrónico se envía sin problemas, aunque soy un tipo danés, y por lo tanto necesito tres caracteres daneses que sean ''æ'', ''ø'' y ''å'', en el asunto y en el texto del correo electrónico.
Por lo tanto, he visto que puedo usar la codificación de caracteres UTF-8 para proporcionar estos caracteres, pero cuando se envía mi correo solo veo algunas letras extrañas: ''ã|'', ''ã¸'' y ''ã ¥'' - en lugar de la letra letras danesas - ''æ'', ''ø'' y ''å''.
Mi método para enviar el correo electrónico se ve así
public void sendEmail(String name, String fromEmail, String subject, String message) throws AddressException, MessagingException, UnsupportedEncodingException, SendFailedException
{
//Set Mail properties
Properties props = System.getProperties();
props.setProperty("mail.smtp.starttls.enable", "true");
props.setProperty("mail.smtp.host", "smtp.gmail.com");
props.setProperty("mail.smtp.socketFactory.port", "465");
props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.smtp.port", "465");
Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("my_username", "my_password");
}
});
//Create the email with variable input
MimeMessage mimeMessage = new MimeMessage(session);
mimeMessage.setHeader("Content-Type", "text/plain; charset=UTF-8");
mimeMessage.setFrom(new InternetAddress(fromEmail, name));
mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress("my_email"));
mimeMessage.setSubject(subject, "utf-8");
mimeMessage.setContent(message, "text/plain");
//Send the email
Transport.send(mimeMessage);
}
Por favor, ayúdame a descubrir cómo puedo corregir este ''error''.
Después de pasar mucho tiempo depurando y buscando una pista en Internet, encontré una solución a mi problema.
Parece que cada vez que enviaba datos a través de una solicitud web, mi aplicación no codificaba los caracteres con codificación UTF-8. Esto significaba que los datos que se enviaron desde mi formulario de contacto, que contenía caracteres æ, ø y å, no se pudieron manejar correctamente mediante la codificación de caracteres.
La solución parecía configurar un filtro de codificación de caracteres , en mi Descriptor de implementación, que codificaría todas las solicitudes entrantes de la web con la codificación de caracteres UTF-8.
private void registerCharacterEncodingFilter(ServletContext servletContext) {
CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
encodingFilter.setEncoding("UTF-8");
encodingFilter.setForceEncoding(true);
FilterRegistration.Dynamic characterEncodingFilter = servletContext.addFilter("characterEncodingFilter", encodingFilter);
characterEncodingFilter.addMappingForUrlPatterns(null, false, "/*");
}
Este filtro establece que la codificación sea UTF-8 y fuerza la codificación a todas las solicitudes que se reciban en la url ''/ *''.
Es fácil, ejecuta tu proyecto con el parámetro -Dfile.ecoding = UTF-8! ex: java -Dfile.encoding = UTF-8 -jar MyProject.jar
Tal vez deberías proporcionar también UTF-8 aquí
mimeMessage.setContent(message, "text/plain; charset=UTF-8");
Tienes que mirar http://www.coderanch.com/t/274480/java/java/JavaMail-set-content-utf