Saltar al contenido

El juego de caracteres UTF-8 no funciona con javax.mail

Solución:

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".

los mail.mime.charset Se puede utilizar la propiedad del sistema para especificar el juego de caracteres MIME predeterminado para usar con palabras codificadas y partes de texto que de otra manera no especifican un juego de caracteres. Normalmente, el juego de caracteres MIME predeterminado se deriva del juego de caracteres Java predeterminado, como se especifica en el file.encoding Propiedad del sistema. La mayoría de las aplicaciones no necesitarán 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 al juego de caracteres utilizado para los archivos almacenados en el sistema, esta propiedad debe establecerse.

Como puede leer arriba, por defecto no hay ningún valor para el mail.mime.charset y la codificación del archivo (file.encoding propiedad) se utiliza.

Para un correo electrónico específico

Sin embargo, si desea especificar una codificación específica para un correo electrónico específico, probablemente debería usar el parámetro 2 setSubject(subject,charset) y setText(text,charset) métodos.

Si eso no funciona, entonces probablemente su entrada ya esté dañada antes de llegar a este punto. En otras palabras, probablemente utilizó la codificación incorrecta para recopilar sus datos..

Los tipos de mimo son complicados

los setContent(content, "UTF-8") (como afirman otras fuentes) simplemente no funcionará. Solo mire la firma de este método: setContent(Object content, String mimetype). El tipo de mímica y el juego de caracteres son dos cosas totalmente diferentes. En mi humilde opinión, realmente deberías estar usando uno de los setText(...) métodos con un parámetro de juego de caracteres.

Pero si persiste en usar un mimetype para configurar el juego de caracteres setContent(content,mimetype), luego use el formato correcto. (No solo "UTF-8", pero algo como "text/plain; charset=UTF-8"). Pero mas importante, tenga en cuenta que cada tipo de mimo tiene su propia forma de manejar los juegos de caracteres.

  • Como se especifica en RFC-2046, el juego de caracteres predeterminado para text/plain es US-ASCII, pero se puede anular con un parámetro de juego de caracteres adicional.
  • Sin embargo, en RFC-6657 deja claro que el text/xml type determina el juego de caracteres usando el contenido del mensaje. El parámetro charset se ignorará aquí.
  • Y en RFC-2854 se afirma que text/html realmente siempre debería especificar un juego de caracteres. Pero si no lo hace, usará ISO-8859-1 (=Latin-1).

Tal vez debería 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

Después de pasar mucho tiempo depurando y buscando una pista en Internet, he encontrado una solución a mi problema.

Parece que cada vez que envié datos a través de una solicitud web, mi aplicación no codificó los caracteres con codificación UTF-8. Esto significó que los datos que se enviaron desde mi formulario de contacto, que contenían los caracteres æ, ø y å, no se pudieron manejar correctamente mediante la codificación de caracteres.

La solución pareció 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 la codificación en UTF-8 y fuerza la codificación a todas las solicitudes que llegan a la URL ‘/ *’.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *