formato - Java: envíe un correo electrónico a una dirección de correo electrónico no ASCII
send email java (3)
Quiero enviar un correo electrónico a una dirección de correo electrónico que no sea ASCII y no estoy seguro de cuál es el procedimiento recomendado utilizando JDK8.
¿Cómo debo tratar con las siguientes direcciones de correo electrónico?
- Dö[email protected]
- test@Sörensen.de
- Dörte@Sörensen.de
¿Hay alguna consideración de seguridad a tener en cuenta?
¿Sería suficiente este código de ejemplo?
import java.net.IDN;
public class IDNMailHelper {
public static String toIdnAddress(String mail) {
if (mail == null) {
return null;
}
int idx = mail.indexOf(''@'');
if (idx < 0) {
return mail;
}
return localPart(mail, idx) + "@" + IDN.toASCII(domain(mail, idx));
}
private static String localPart(String mail, int idx) {
return mail.substring(0, idx);
}
private static String domain(String mail, int idx) {
return mail.substring(idx + 1);
}
}
Debido a RFC6530 , debe codificar el correo electrónico como UTF-8. Esto significa que no debes usar IDN aquí.
Si sus servidores SMTP salientes admiten EAI (correos electrónicos internacionalizados), eso no debería ser un problema.
Tenga en cuenta que EAI puede suponer un grave riesgo para la seguridad. Si decide manejar en su aplicación (¿servicio?), Asegúrese de evitar que los usuarios registren direcciones de correo electrónico de aspecto similar, es decir, las que usan diferentes scripts. Por ejemplo, uno de estos tipos debería ser rechazado:
- Dörte@Sörensen.de
- Döгtе@Sörensen.de
Para los encabezados de su correo electrónico, la solución a esto es RFC-2047 , que define un protocolo de codificación específico para los caracteres que no son ISO-646 en el correo electrónico. Java Mail tiene una clase para usar esto: MimeUtility . Punicode / IDNS no es apropiado para el uso del encabezado.
Como Bill Shannon, otro respondedor aquí, señaló en esta respuesta , Java Mail aplicará, en general, MimeUtil a sus encabezados automáticamente. En cuanto a una pregunta en un comentario sobre los servidores de correo intervinientes, solo estoy respondiendo su pregunta sobre el texto en los encabezados, lo que no molestará en nada. En cuanto a los mensajes del protocolo SMTP necesarios para llevar el mensaje al lugar correcto, no pretendo saberlo.
Paweł tiene razón esencialmente en que las direcciones deben codificarse como UTF-8 si su servidor admite la extensión SMTPUTF8. El soporte para SMTPUTF8 está en la versión JavaMail 1.6.
Para habilitar esta compatibilidad, debe configurar la propiedad de sesión JavaMail mail.mime.allowutf8
en true
. Asegúrese de configurarlo solo cuando el servidor de correo sea compatible con UTF-8.
Para versiones anteriores de JavaMail, una posible solución consiste en convertir la Cadena Unicode de Java en una matriz de bytes codificados en UTF-8, luego crear una Cadena Unicode de Java donde cada byte es un carácter iso-8859-1 separado. No he probado esto, así que no sé si se encontrará con otros problemas.
Por ejemplo:
address = new String(address.getBytes("utf-8"), "iso-8859-1");