Heute ist ein Kollege auf ein Problem gestoßen, wenn es sich bei dem Empfänger um eine Liste handelt und die Empfängerliste durch Semikolons getrennt ist. Es kommt zu einer Ausnahme, die nicht normal analysiert werden kann Ein Blick, ich habe eine einfache Demo geschrieben, sehr einfach, zum Beispiel:
Kopieren Sie den Codecode wie folgt:
@Prüfen
public void testReceiveMail() {
versuchen {
String host = "pop3.163.com";
Properties pops = new Properties();
pops.put("mail.pop3.host", host);
pops.put("mail.pop.auth", "true");
Sitzung session = Session.getDefaultInstance(pops, null);
Store store = session.getStore("pop3");
//Mit dem Mailserver verbinden
store.connect(host, „chb_go“, „3870359346“);
//Posteingang empfangen
Ordner-Posteingang = store.getDefaultFolder().getFolder("INBOX");
//Nur lesen ist genug
inbox.open(Folder.READ_ONLY);
//Alle Mailinglisten abrufen
Message[] msg = inbox.getMessages();
FetchProfile-Profil = new FetchProfile();
Profile.add(FetchProfile.Item.ENVELOPE);
inbox.fetch(msg, Profil);
for (int i = 0; i < msg.length; i++) {
System.out.println("========================================= = ====");
System.out.println("Subject: "+msg[i].getSubject());
InternetAddress[] toAddress = (InternetAddress[]) msg[i].getRecipients(Message.RecipientType.TO);
for(InternetAddress adress:toAddress){
System.out.println(adress.getAddress());
}
}
//Schließen Sie die geöffnete Ressource
if (Posteingang != null)
inbox.close(true);
if (store != null)
store.close();
} Catch (NoSuchProviderException e) {
e.printStackTrace();
} Catch (MessagingException e) {
e.printStackTrace();
} Catch (Ausnahme e) {
e.printStackTrace();
}
}
Es ist ganz einfach, E-Mails normal zu empfangen und die Empfängerliste normal anzuzeigen. Wenn Sie jedoch eine Verbindung zu einem internen Mailserver herstellen und die Empfänger E-Mails mit Semikolons als Trennzeichen haben, können die Empfänger nicht normal angezeigt werden.
Nachdem ich die Spezifikationen durchsucht hatte, stellte ich fest, dass FRC 822 vorschreibt, dass Empfänger durch Kommas getrennt werden müssen. Es scheint, dass die Semikolon-Trennung kein Standardtrennzeichen ist, wie folgt:
Kopieren Sie den Codecode wie folgt:
Ziel = „An“ : 1#Adresse; Primär
/ „Resent-To“ :: 1#Adresse
/ "cc" : 1#Adresse ;
/ "Resent-cc" :: 1#Adresse
/ „bcc“ : „#address ; Blindkohlenstoff
/ "Resent-bcc" :: #address
Die #-Syntax stellt eine Liste dar und die Inhalte zwischen den Listen werden durch Kommas getrennt, zum Beispiel:
Kopieren Sie den Codecode wie folgt:
2.7. #REGEL: LISTEN
Ein Konstrukt „#“ wird ähnlich wie „*“ wie folgt definiert:
<l>#<m>Element
Angabe von mindestens <l> und höchstens <m> Elementen, jeweils getrennt durch ein oder mehrere Kommas (","). Dies macht die übliche Form von Listen sehr einfach, eine Regel wie '(element *("," element ))' kann als „1#element“ angezeigt werden. Wo immer dieses Konstrukt verwendet wird, sind Nullelemente zulässig, tragen jedoch nicht zur Anzahl der vorhandenen Elemente bei. Das heißt, „(element),,(element)“ ist zulässig , zählt aber nur als zwei Elemente. Daher muss, wenn mindestens ein Element erforderlich ist, mindestens ein Nicht-Null-Element vorhanden sein, sodass „#(element)“ jede beliebige Zahl zulässt, einschließlich Null; „1#element“ erfordert mindestens eins und „1#2element“ erlaubt eins oder zwei.
JAVA MAIL arbeitet strikt nach den RFC 822-Spezifikationen und verwendet keine Semikolons. Die meisten Mailserver halten sich strikt an die RFC 822-Spezifikation, wie z. B. Lotus Notes und Gmail (der Empfänger von Gmail kann kein Semikolon eingeben und es wird sogar automatisch durch ein Komma ersetzt, wie es jedoch auch beim Senden der Fall ist); E-Mails werden häufig durch Semikolons getrennt, da einige E-Mail-Tools wie Outlook, Outlook Express oder MAPI häufig Semikolons als Trennzeichen verwenden Ich verachte Microsoft zutiefst! Es gibt zu viele Unregelmäßigkeiten! !
Wenn Sie Pech haben und auf Benutzer stoßen, die es gewohnt sind, Semikolons als Trennzeichen zu verwenden, und deren Mailserver Semikolons nicht automatisch durch Kommas ersetzen, können wir die Kompatibilität nur über Programme herstellen. Sie können eine Überarbeitung des JAVA MAIL-Quellcodes in Betracht ziehen
Der Quellcode der Parse-Methode der InternetAddress-Klasse wird hier nicht angezeigt. Sie müssen lediglich die Verarbeitung von Semikolons so ändern, dass sie mit Kommas übereinstimmt (aber Semikolons sind auch in FRC 822 definiert. Solche Änderungen können versteckte Gefahren verursachen bitte seien Sie vorsichtig).