Aujourd'hui, un collègue a rencontré un problème. Lors de l'utilisation de JAVA MAIL pour recevoir des e-mails, si le destinataire est une liste et que la liste des destinataires est séparée par des points-virgules, une exception se produira dans JAVA MAIL et ne pourra pas être analysée normalement. un coup d'oeil. , j'ai écrit une démo simple, très simple, par exemple :
Copiez le code comme suit :
@Test
public void testReceiveMail() {
essayer {
Chaîne hôte = "pop3.163.com" ;
Propriétés pops = new Properties();
pops.put("mail.pop3.host", hôte);
pops.put("mail.pop.auth", "true");
Session session = Session.getDefaultInstance(pops, null);
Magasin store = session.getStore("pop3");
//Se connecter au serveur de messagerie
store.connect(hôte, "chb_go", "3870359346");
//Recevoir la boîte de réception
Boîte de réception du dossier = store.getDefaultFolder().getFolder("INBOX");
//La lecture seule suffit
boîte de réception.open(Dossier.READ_ONLY);
//Obtenir toutes les listes de diffusion
Message[] msg = inbox.getMessages();
Profil FetchProfile = new FetchProfile();
profile.add(FetchProfile.Item.ENVELOPE);
inbox.fetch (msg, profil);
pour (int i = 0; i < msg.length; i++) {
System.out.println("============================================ = ====");
System.out.println("Sujet : "+msg[i].getSubject());
InternetAddress[] toAddress = (InternetAddress[]) msg[i].getRecipients(Message.RecipientType.TO);
pour (adresse InternetAddress : toAddress) {
System.out.println(adresse.getAddress());
}
}
//Ferme la ressource ouverte
si (boîte de réception != null)
boîte de réception.close(true);
si (magasin != null)
store.close();
} catch (NoSuchProviderException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
} attraper (Exception e) {
e.printStackTrace();
}
}
C'est très simple. Vous pouvez recevoir des emails normalement et afficher la liste des destinataires normalement ; mais lors de la connexion à un serveur de messagerie interne et que les destinataires sont des emails avec des points-virgules comme délimiteurs, les destinataires ne peuvent pas être affichés normalement.
Après avoir recherché les spécifications, j'ai découvert que FRC 822 stipule que les destinataires doivent être séparés par des virgules. Il semble que la séparation par point-virgule ne soit pas un délimiteur standard, comme suit :
Copiez le code comme suit :
destination = "À" ":" 1#adresse Principale ;
/ "Renvoyer à" ":" 1#adresse
/ "cc" ":" 1#adresse Secondaire ;
/ "Renvoyer-cc" ":" 1#adresse
/ "bcc" ": #adresse ; Carbone aveugle
/ "Renvoyer-bcc" ":" #adresse
La syntaxe # représente une liste et le contenu entre les listes est séparé par des virgules, par exemple :
Copiez le code comme suit :
2.7. #RÈGLE : LISTES
Une construction "#" est définie, similaire à "*", comme suit :
<l>#<m>élément
indiquant au moins <l> et au plus <m> éléments, chacun séparé par une ou plusieurs virgules ("," Cela rend la forme habituelle des listes très simple, une règle telle que '(élément *("," élément ; ))' peut être affiché sous la forme "1#element". Partout où cette construction est utilisée, les éléments nuls sont autorisés, mais ne contribuent pas au nombre d'éléments présents. Autrement dit, "(element),,(element)" est autorisé. , mais ne compte que pour deux éléments. Par conséquent, où. au moins un élément est requis, au moins un élément non nul doit être présent. Les valeurs par défaut sont 0 et l'infini afin que "#(element)" autorise n'importe quel nombre, y compris "1#element" en nécessite au moins un ; ; et "1#2element" en autorise un ou deux.
JAVA MAIL fonctionne strictement conformément aux spécifications RFC 822 et ne traite pas les points-virgules. La plupart des serveurs de messagerie suivent strictement la spécification RFC 822, comme Lotus Notes et Gmail (le destinataire de Gmail ne peut pas saisir de point-virgule, et il sera même automatiquement remplacé par une virgule, comme lui cependant, vous le constaterez également lors de l'envoi) ; Les e-mails sont souvent séparés par des points-virgules, car certains outils de messagerie de Microsoft, tels qu'Outlook, Outlook. Express ou son MAPI utilise des points-virgules comme séparateurs, et comme Outlook est largement utilisé par les utilisateurs, beaucoup de gens pensent même que la séparation par points-virgules est la norme, et méprisent fortement Microsoft ! Il y a trop d'irrégularités ! !
Si vous n'avez pas de chance et rencontrez des utilisateurs habitués à utiliser des points-virgules comme délimiteurs et que leurs serveurs de messagerie ne remplacent pas automatiquement les points-virgules par des virgules, nous ne pouvons assurer la compatibilité que via des programmes. Vous pouvez envisager de réviser le code source de JAVA MAIL.
Le code source de la méthode d'analyse de la classe InternetAddress ne sera pas affiché ici. Il vous suffit de modifier le traitement des points-virgules pour qu'il soit identique à celui des virgules (mais les points-virgules sont également définis dans FRC 822. De telles modifications peuvent entraîner des dangers cachés, donc soyez prudent s'il vous plaît).