2012-12-20 5 views
0

기본적으로받은 편지함에서 이메일을 읽는 응용 프로그램을 작성했습니다. 나는 항상 Gmail에서 보낸 전자 메일로 응용 프로그램을 테스트했습니다. 그러나 이제는 Outlook에서 보낸 전자 메일을 읽으려고 할 때 다시 내용을 얻지 못합니다. Gmail이 작동하는 동안 JavaMail을 사용하여 Outlook 메일을 읽을 수 없습니다.

나는 모두 전자 메일에서 contenttypes 기록 : Gmail은 반환 multipart/alternative; boundary=047d7b342bf2b6847f04d11df78a 전망 반환 : text/html; charset=iso-8859-1 참고 :이 그냥 다른 메일 클라이언트에서 보낸 같은 전자 메일입니다.

Gmail의 메일은 Multipart의 인스턴스입니다. Outlook 전자 메일은 String의 인스턴스입니다.

내 코드 :

메시지가 여러 부분 또는 문자열 instanceof를 인 경우 확인 방법. 메시지가없는이 직접 호출 될 경우

public void handleMultipart(Multipart multipart) 
     throws MessagingException, IOException, Exception { 
    mpMessage = getText(multipart.getBodyPart(0)); 

    for (int z = 1, n = multipart.getCount(); z < n; z++) { 
     handlePart(multipart.getBodyPart(z)); 

    } 
} 

:

public void getContent(Message msg) throws IOException, Exception { 

    Object contt = msg.getContent(); 
    System.out.println("Contenttype: " + msg.getContentType()); 

    if (contt instanceof Multipart) { 
     checkDisposition = true; 
     handleMultipart((Multipart) contt); 
    } else if (contt instanceof String) { 
     handlePart((Part) msg); 
    } 
    prepareEmail(mpMessage); 
} 

메시지가이 메소드가 호출됩니다 다중 경우

public void handlePart(Part part) 
     throws MessagingException, IOException, Exception { 



    Object con = messageCopy.getContent(); 

    String disposition = part.getDisposition(); 
    String contentType = part.getContentType(); 

    if (checkDisposition) { 


     if (disposition == null) { 

      System.out.println("Disposition is null"); 

     } else if (disposition.equalsIgnoreCase(Part.ATTACHMENT)) { 
      System.out.println("Attachment: " + part.getFileName() 
        + " : " + contentType); 
      input = part.getInputStream(); 
      bytes = IOUtils.toByteArray(input); 
     } else if (disposition.equalsIgnoreCase(Part.INLINE)) { 
      System.out.println("Inline: " 
        + part.getFileName() 
        + " : " + contentType); 
     } else { 
      System.out.println("Other: " + disposition); 
     } 
    }else{ 
     mpMessage = part.getContent().toString(); //returns nothing 



     System.out.println("mpMessage handlePart "+mpMessage); //returns nothing 
     System.out.println("mpMessage handlePart "+part.getLineCount()); //returns 0 
     System.out.println("mpMessage handlePart "+part.getContentType()); //returns text/html chartset=iso-8859-1 
     System.out.println("mpMessage handlePart "+part.getSize()); // returns 22334 
     part.writeTo(System.out); //See below 

    } 

}

각 부분으로부터 텍스트를 돌려주는 메소드 :

,451,515,
private String getText(Part p) throws 
     MessagingException, IOException { 

    System.out.println("getText contentType "+p.getContentType()); 

//This part gets called if trying to read an Outlook mail, its not clear for me how to retrieve the text from the part. Since `p.getContent()` returns nothing 
    if (p.isMimeType("text/*")) { 
     String s = (String) p.getContent(); 
     System.out.println(); 
     return String.valueOf(s); 
    } 

    if (p.isMimeType("multipart/alternative")) { 
     Multipart mp = (Multipart) p.getContent(); 
     String text = null; 
     for (int i = 0; i < mp.getCount(); i++) { 
      Part bp = mp.getBodyPart(i); 
      if (bp.isMimeType("text/plain")) { 
       String s = getText(bp); 
       if (s != null) { 
        return s; 
       } 
      } 
     } 
     return text; 
    } 
    return null; 
} 

part.writeTo(System.out) 반환 :

수신 :에서 AMSPRD0710HT005.eurprd07.prod.outlook.com 서버 (TLS) ID 00000; Thu, 2012 년 12 월 20 일 09:28:23 +0000 수신 : AMSPRD0710MB354.eurprd07.prod.outlook.com (00.000.0000) by AMSPRD0710HT005.eurprd07.prod.outlook.com ([00.000.0000]) mapi id와 함께 14.16.0245.002; 2012년 (목) 12월 20일 9시 28분 5초 0000 에서 : 시험 사람 : 지원 제목 : Verwerkingsverslag Kenmerk : 0,824,496 스레드 주제 : Verwerkingsverslag Kenmerk : 0,824,496 스레드 지수 : Ac3elFC2qYsSo + SOT2ii4HnbCCqgVw == 날짜 : 목 , 2012 년 12 월 20 일 10:28:05 +0100 메시지 ID : ...

기타 등등.

메시지 자체의 내용은 일반적인 텍스트가 아닌 HTML 코드로 반환됩니다.

HTML 코드 대신 Outlook 전자 메일에서 일반 텍스트를 검색하려면 어떻게합니까? 또는 handlePart에서 파트의 내용을 검색하려면 어떻게해야합니까?

도움이 되셨다면

감사합니다.

답변

2

Outlook이 HTML 버전으로 일반 텍스트와 함께 보낸 것으로 가정하는 것 같습니다.이 경우는 그렇지 않습니다. Outlook에서 기록한 전자 메일의 MIME 유형은 text/html이며 이는 HTML 형식의 문서임을 나타냅니다.한편 Gmail 버전은 multipart/alternative이라는 문서를 보냈습니다. 동일한 문서에 여러 버전의 이메일이 있음을 나타낼 수 있습니다 (일반 텍스트 및 HTML - Gmail의 기본 동작이라고 생각합니다). 따라서 HTML로 인코딩 된 버전을 얻는 경우 전자 메일의 "텍스트"가 보내집니다.

전자 메일을 일반 텍스트 버전 또는 실제로 다른 형식으로 보낼 필요는 없습니다. 메일 클라이언트가 소비하는 프로그램이 처리 할 수있는 형식으로 전자 메일을 보내거나 전송되는 형식을 처리하기 위해 소비 프로그램을 변경하는 것은 사용자의 책임입니다.

위 이외에, 당신이 줄을 재고 할 수 있습니다 :

멀티 파트 메시지의 첫 번째 부분은 일반 텍스트 문서와 메시지의 텍스트가 될 것이라고 가정하는 표시
mpMessage = getText(multipart.getBodyPart(0)); 

. 이는 잘못된 가정 일 수 있습니다.


그래서, 당신은 실제로 HTML의 내용으로 메일 메시지를받은 한 가정 getContent()null 또는 빈 문자열을 반환해서는 안됩니다. documentation on MimeBodyPart#getContent()에 따라 InputStream을 반환해야합니다. InputStream을 읽으면 HTML 태그가있는 문자열을 생성 할 수 있습니다.

HTML은 신경 쓰지 않고 내용 만 신경 쓰이기 때문에 Jsoup과 같은 Java HTML 구문 분석 라이브러리를 사용하면 프로세스가 크게 단순해질 수 있습니다. 기본적으로, 당신은 이런 식으로 getText()을 변경하여 현재 코드에이를 통합 할 수 있습니다 :이 이메일 읽고 메모리에 완전히 구문 분석 할 수있을만큼 작은 있다고 가정

private String getText(Part p) throws MessagingException, IOException { 
    System.out.println("getText contentType "+p.getContentType()); 
    if (p.isMimeType("text/plain")) { 
     String s = (String) p.getContent(); 
     System.out.println(s); 
     return s; 
    } else if (p.isMimeType("text/html")) { 
     // the last two parameters of this may need to be modified 
     String s = Jsoup.parse(p.getInputStream(), null, null).text(); 
     System.out.println(s); 
     return s; 
    } else if (p.isMimeType("multipart/alternative")) { 
     Multipart mp = (Multipart) p.getContent(); 
     String text = ""; 
     for (int i = 0; i < mp.getCount(); i++) { 
      Part bp = mp.getBodyPart(i); 
      if (bp.isMimeType("text/*")) { 
       String s = getText(bp); 
       if (s != null) { 
        text += s; 
       } 
      } 
     } 
     return text; 
    } 
    return null; 
} 

참고.

+0

의견을 보내 주셔서 감사합니다. 매우 도움이됩니다. 문제는 특정 단어를 '스캔'해야하는 전자 메일의 내용이 필요하다는 것입니다. 이 방법을 어떻게 제안합니까? 그 라인에 대해서, 나는 Gmail 이메일로 테스트 해 보았지만 정상적으로 작동하지만 Outlook 이메일과 같은 문제를 안고있다. 모든 메일을 Outlook 메일 클라이언트로 전달하도록 Gmail 계정을 설정하는 방법을 고려 중입니다. – Jef

+1

@Jef : 위의 편집을 참조하십시오. 그 점이 모두 불분명한지 알려주세요. – ig0774

+0

고마워요! 대단히 도와 줬어. – Jef

관련 문제