오늘 동료가 JAVA MAIL을 사용하여 이메일을 받을 때 수신자가 목록이고 수신자 목록이 세미콜론으로 구분된 경우 JAVA MAIL에서 예외가 발생하여 정상적으로 구문 분석할 수 없는 문제가 발생했습니다. , 저는 매우 간단한 간단한 데모를 작성했습니다. 예를 들면 다음과 같습니다.
다음과 같이 코드 코드를 복사합니다 .
@시험
공공 무효 testReceiveMail() {
노력하다 {
문자열 호스트 = "pop3.163.com";
속성 pops = new Properties();
pops.put("mail.pop3.host", 호스트);
pops.put("mail.pop.auth", "true");
세션 세션 = Session.getDefaultInstance(pops, null);
상점 저장 = session.getStore("pop3");
//메일서버에 접속
store.connect(호스트, "chb_go", "3870359346");
//받은 편지함 받기
폴더 받은 편지함 = store.getDefaultFolder().getFolder("INBOX");
//읽기만 해도 충분하다
inbox.open(Folder.READ_ONLY);
//모든 메일링 리스트 가져오기
메시지[] msg = inbox.getMessages();
FetchProfile 프로필 = 새로운 FetchProfile();
profile.add(FetchProfile.Item.ENVELOPE);
inbox.fetch(msg, 프로필);
for (int i = 0; i < msg.length; i++) {
System.out.println("========================================== = ====");
System.out.println("제목: "+msg[i].getSubject());
InternetAddress[] toAddress = (InternetAddress[]) msg[i].getRecipients(Message.RecipientType.TO);
for(인터넷 주소 주소:toAddress){
System.out.println(adress.getAddress());
}
}
//열린 리소스를 닫습니다.
if (받은 편지함 != null)
inbox.close(true);
if (저장!= null)
store.close();
} 잡기(NoSuchProviderException e) {
e.printStackTrace();
} 잡기(MessagingException e) {
e.printStackTrace();
} 잡기(예외 e) {
e.printStackTrace();
}
}
아주 간단합니다. 이메일을 정상적으로 수신하고 수신자 목록을 정상적으로 표시할 수 있지만, 내부 메일 서버에 연결하여 수신자가 세미콜론으로 구분된 이메일인 경우 수신자를 정상적으로 표시할 수 없습니다.
사양을 검색한 결과 FRC 822에서는 수신자를 쉼표로 구분해야 한다고 규정하고 있는 것을 발견했습니다. 다음과 같이 세미콜론 구분은 표준 구분 기호가 아닌 것 같습니다.
다음과 같이 코드 코드를 복사합니다 .
목적지 = "받는 사람" ":" 1#주소 ;
/ "Resent-To" ":" 1#주소
/ "cc" ":" 1#주소 ;
/ "Resent-cc" ":" 1#주소
/ "bcc" ":" #주소 블라인드 카본 ;
/ "Resent-bcc" ":" #주소
# 구문은 목록을 나타내며 목록 사이의 내용은 쉼표로 구분됩니다. 예를 들면 다음과 같습니다.
다음과 같이 코드 코드를 복사합니다 .
2.7. #규칙: 목록
"#" 구성은 "*"와 유사하게 다음과 같이 정의됩니다.
<l>#<m>요소
최소 <l> 및 최대 <m>개의 요소를 나타내며, 각 요소는 하나 이상의 쉼표(",")로 구분됩니다. 이는 '(element *("," element)와 같은 일반적인 목록 형식을 매우 쉽게 만듭니다. ))'는 "1#element"로 표시될 수 있습니다. 이 구성이 사용되는 곳에서는 null 요소가 허용되지만 존재하는 요소 수에 영향을 주지는 않습니다. 즉, "(element),,(element)"가 허용됩니다. , 단 두 개의 요소로만 계산됩니다. 따라서 하나 이상의 요소가 필요한 경우에는 null이 아닌 요소가 하나 이상 존재해야 합니다. 기본값은 0과 무한대이므로 "#(요소)"는 다음을 포함하여 모든 숫자를 허용합니다. 0; "1#element"에는 적어도 하나가 필요하고 "1#2element"에는 1개 또는 2개가 허용됩니다.
JAVA MAIL은 RFC 822 사양에 따라 엄격하게 작동하며 세미콜론을 처리하지 않습니다. 대부분의 메일 서버는 Lotus Notes 및 Gmail과 같은 RFC 822 사양을 엄격하게 따릅니다(Gmail 수신자는 세미콜론을 입력할 수 없으며 자동으로 쉼표로 대체됩니다). 그러나 보낼 때도 이를 확인할 수 있습니다. 이메일은 세미콜론으로 구분되는 경우가 많습니다. 이는 Outlook, Outlook Express 또는 MAPI와 같은 일부 Microsoft 이메일 도구가 세미콜론을 구분 기호로 사용하기 때문입니다. 또한 Outlook은 많은 사람들이 세미콜론 구분을 표준으로 사용하고 있다고 생각합니다. 나는 마이크로소프트를 매우 경멸한다! 불규칙이 너무 많아요! !
운이 좋지 않고 세미콜론을 구분 기호로 사용하는 데 익숙한 사용자를 만나고 메일 서버가 자동으로 세미콜론을 쉼표로 바꾸지 않으면 프로그램을 통해서만 호환성을 만들 수 있습니다. JAVA MAIL 소스 코드 수정을 고려할 수 있습니다.
InternetAddress 클래스의 구문 분석 메소드의 소스 코드는 여기에 표시되지 않습니다. 세미콜론 처리를 쉼표와 동일하게 수정하기만 하면 됩니다(그러나 세미콜론은 FRC 822에도 정의되어 있습니다. 이러한 수정은 숨겨진 위험을 초래할 수 있으므로 주의해주세요) .