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 elfile.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
esUS-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 ‘/ *’.