Hoy, un colega encontró un problema al usar JAVA MAIL para recibir correos electrónicos. Si el destinatario es una lista y la lista de destinatarios está separada por punto y coma, se producirá una excepción en JAVA MAIL y no se puede analizar normalmente. Echa un vistazo, escribí una demostración simple, muy simple, por ejemplo:
Copie el código de código de la siguiente manera:
@Prueba
prueba pública vacíaReceiveMail() {
intentar {
Host de cadena = "pop3.163.com";
Propiedades emergentes = nuevas Propiedades();
pops.put("correo.pop3.host", anfitrión);
pops.put("correo.pop.auth", "verdadero");
Sesión sesión = Session.getDefaultInstance(pops, null);
Tienda tienda = session.getStore("pop3");
//Conéctate al servidor de correo
store.connect(host, "chb_go", "3870359346");
//Recibir bandeja de entrada
Carpeta bandeja de entrada = store.getDefaultFolder().getFolder("INBOX");
//Solo leer es suficiente
bandeja de entrada.open(Carpeta.READ_ONLY);
//Obtener todas las listas de correo
Mensaje[] msg = inbox.getMessages();
Perfil FetchProfile = nuevo FetchProfile();
perfil.add(FetchProfile.Item.ENVELOPE);
bandeja de entrada.fetch (mensaje, perfil);
for (int i = 0; i < msj.length; i++) {
System.out.println("============================================= = ====");
System.out.println("Asunto: "+msg[i].getSubject());
Dirección de Internet[] toAddress = (Dirección de Internet[]) msg[i].getRecipients(Message.RecipientType.TO);
para(Dirección de Internet dirección:aDirección){
System.out.println(dirección.getAddress());
}
}
//Cerrar el recurso abierto
si (bandeja de entrada! = nulo)
bandeja de entrada.cerrar (verdadero);
si (tienda! = nulo)
tienda.cerrar();
} captura (NoSuchProviderException e) {
e.printStackTrace();
} captura (MessagingException e) {
e.printStackTrace();
} captura (Excepción e) {
e.printStackTrace();
}
}
Es muy simple. Puede recibir correos electrónicos normalmente y mostrar la lista de destinatarios normalmente; pero cuando se conecta a un servidor de correo interno y los destinatarios son correos electrónicos con punto y coma como delimitadores, los destinatarios no se pueden mostrar normalmente.
Después de buscar en las especificaciones, descubrí que FRC 822 estipula que los destinatarios deben estar separados por comas. Parece que la separación de punto y coma no es un delimitador estándar, de la siguiente manera:
Copie el código de código de la siguiente manera:
destino = "Para" ":" 1#dirección Primaria;
/ "Reenviado a" ":" 1#dirección
/ "cc" ":" 1#dirección ;
/ "Reenviar-cc" ":" 1#dirección
/ "bcc" ":" #address ;
/ "Reenviar-cco" ":" #dirección
La sintaxis # representa una lista y el contenido entre las listas está separado por comas, por ejemplo:
Copie el código de código de la siguiente manera:
2.7. #REGLA: LISTAS
Se define una construcción "#", similar a "*", de la siguiente manera:
<l>#<m>elemento
indicando al menos <l> y como máximo <m> elementos, cada uno separado por una o más comas (","). Esto hace que la forma habitual de listas sea muy fácil con una regla como '(elemento *("," elemento); ))' se puede mostrar como "1#elemento". Siempre que se utilice esta construcción, se permiten elementos nulos, pero no contribuyen al recuento de elementos presentes. Es decir, se permite "(elemento),,(elemento)". , pero cuenta como solo dos elementos. Por lo tanto, donde. se requiere al menos un elemento, debe estar presente al menos un elemento no nulo. Los valores predeterminados son 0 e infinito para que "#(elemento)" permita cualquier número, incluido cero. ; y "1#2element" permite uno o dos.
JAVA MAIL funciona estrictamente de acuerdo con las especificaciones RFC 822 y no utiliza punto y coma. La mayoría de los servidores de correo siguen estrictamente la especificación RFC 822, como Lotus Notes y Gmail (el destinatario de Gmail no puede ingresar un punto y coma, e incluso será reemplazado automáticamente por una coma; sin embargo, también lo encontrará al enviar); Los correos electrónicos suelen estar separados por punto y coma. Esto se debe a que algunas de las herramientas de correo electrónico de Microsoft, como Outlook, Outlook. Express o su MAPI utilizan punto y coma como separadores, y debido a que Outlook es ampliamente utilizado por los usuarios, muchas personas incluso piensan que la separación de punto y coma es la norma, ¡y desprecian fuertemente a Microsoft! ¡Hay demasiadas irregularidades! !
Si tiene la mala suerte y se encuentra con usuarios que están acostumbrados a usar punto y coma como delimitadores y sus servidores de correo no reemplazan automáticamente el punto y coma con coma, entonces solo podemos hacer compatibilidad a través del programa. Puede considerar revisar el código fuente de JAVA MAIL.
El código fuente del método de análisis de la clase InternetAddress no se mostrará aquí. Solo necesita modificar el procesamiento de punto y coma para que sea igual a las comas (pero los punto y coma también están definidos en FRC 822. Dichas modificaciones pueden causar peligros ocultos, por lo que por favor tenga cuidado).