Hoje, um colega encontrou um problema ao usar JAVA MAIL para receber e-mails, se o destinatário for uma lista e a lista de destinatários for separada por ponto e vírgula, ocorrerá uma exceção no JAVA MAIL e não poderá ser analisada normalmente. uma olhada, escrevi uma demonstração simples, muito simples, por exemplo:
Copie o código do código da seguinte forma:
@Teste
public void testReceiveMail() {
tentar {
String host = "pop3.163.com";
Propriedades pops = new Propriedades();
pops.put("mail.pop3.host", host);
pops.put("mail.pop.auth", "true");
Sessão sessão = Session.getDefaultInstance(pops, null);
Loja loja = session.getStore("pop3");
//Conecta-se ao servidor de e-mail
store.connect(host, "chb_go", "3870359346");
//Recebe caixa de entrada
Caixa de entrada da pasta = store.getDefaultFolder().getFolder("INBOX");
// Somente leitura é suficiente
caixa de entrada.open(Pasta.READ_ONLY);
//Obtém todas as listas de discussão
Mensagem[] mensagem = inbox.getMessages();
Perfil FetchProfile = new FetchProfile();
perfil.add(FetchProfile.Item.ENVELOPE);
caixa de entrada.fetch(msg, perfil);
for (int i = 0; i < comprimento da mensagem; i++) {
System.out.println("============================================ =====");
System.out.println("Assunto: "+msg[i].getSubject());
InternetAddress[] toAddress = (InternetAddress[]) msg[i].getRecipients(Message.RecipientType.TO);
for(InternetAddress endereço:toAddress){
System.out.println(adress.getAddress());
}
}
//Fecha o recurso aberto
if (caixa de entrada! = nulo)
caixa de entrada.close(true);
if (armazenar! = nulo)
store.close();
} catch (NoSuchProviderException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
} catch (Exceção e) {
e.printStackTrace();
}
}
É muito simples. Você pode receber e-mails normalmente e exibir a lista de destinatários normalmente, mas ao conectar-se a um servidor de e-mail interno e os destinatários são e-mails com ponto-e-vírgula como delimitadores, os destinatários não podem ser exibidos normalmente;
Depois de pesquisar as especificações, descobri que o FRC 822 estipula que os destinatários devem ser separados por vírgulas. Parece que a separação por ponto e vírgula não é um delimitador padrão, como segue:
Copie o código do código da seguinte forma:
destino = "Para" ":" 1#endereço Primário;
/ "Reenviar para" ":" 1#endereço
/ "cc" ":" 1#endereço;
/ "Reenviar-cc" ":" 1#endereço
/ "bcc" ":" #address ;
/ "Reenviar-coco" ":" #endereço
A sintaxe # representa uma lista, e o conteúdo entre as listas é separado por vírgulas, por exemplo:
Copie o código do código da seguinte forma:
2.7. #REGRA: LISTAS
Uma construção "#" é definida, semelhante a "*", como segue:
<l>#<m>elemento
indicando pelo menos <l> e no máximo <m> elementos, cada um separado por uma ou mais vírgulas (","). Isso torna a forma usual de listas muito fácil, como '(element *("," element; ))' pode ser mostrado como "1#element". Sempre que esta construção for usada, elementos nulos são permitidos, mas não contribuem para a contagem de elementos presentes. Ou seja, "(element),(element)" é permitido. , mas conta como apenas dois elementos. Portanto, onde pelo menos um elemento é necessário, pelo menos um elemento não nulo deve estar presente. Os valores padrão são 0 e infinito para que "#(element)" permita qualquer número, inclusive. zero; "1#element" requer pelo menos um e "1#2element" permite um ou dois;
JAVA MAIL opera estritamente de acordo com as especificações RFC 822 e não lida com ponto e vírgula. A maioria dos servidores de e-mail segue estritamente a especificação RFC 822, como Lotus Notes e Gmail (o destinatário do Gmail não pode inserir ponto e vírgula, e ele será até substituído automaticamente por uma vírgula, mas você também descobrirá isso ao enviar); Os e-mails geralmente são separados por ponto e vírgula. Isso ocorre porque algumas das ferramentas de e-mail da Microsoft, como o Outlook, o Outlook Express ou seu MAPI, usam ponto e vírgula como separadores. Além disso, o Outlook é amplamente usado por muitas pessoas. Eu desprezo fortemente a Microsoft! Existem muitas irregularidades! !
Se você tiver azar e encontrar usuários que estão acostumados a usar ponto-e-vírgula como delimitadores e seus servidores de e-mail não substituem automaticamente ponto-e-vírgula por vírgula, só podemos fazer a compatibilidade por meio de programas. Você pode considerar a revisão do código-fonte JAVA MAIL.
O código-fonte do método de análise da classe InternetAddress não será mostrado aqui. Você só precisa modificar o processamento do ponto e vírgula para ser igual ao das vírgulas (mas o ponto e vírgula também é definido no FRC 822. Tais modificações podem causar perigos ocultos, portanto. por favor tenha cuidado).