2014-12-09 8 views
6

Otrzymuję wiadomości e-mail od klienta, w którym zagnieżdżono wiadomość wieloczęściową/alternatywną w wiadomości wieloczęściowej/mieszanej. Kiedy dostaję treść komunikatu, po prostu zwraca poziom wieloczęściowy/alternatywny, kiedy naprawdę chcę, aby część tekst/html była zawarta w wieloczęściowym/alternatywnym.Parsowanie Multipart/Mixed z Multipart/Alternative body w java

Przeglądałem javadocs dla javax.mail i nie mogę znaleźć prostego sposobu na uzyskanie ciała części ciała, która sama jest wieloczęściowa lub pominięcie pierwszej części wieloczęściowej/mieszanej i przejście do wieloczęściowego/ciało alternatywne do czytania tekstu/html i tekstu/zwykłych sztuk.

Struktura email wygląda następująco:

... 
Content-Type: multipart/mixed; 
    boundary="----=_Part_19487_1145362154.1418138792683" 

------=_Part_19487_1145362154.1418138792683 
Content-Type: multipart/alternative; 
    boundary="----=_Part_19486_1391901275.1418138792683" 

------=_Part_19486_1391901275.1418138792683 
Content-Transfer-Encoding: 7bit 
Content-Type: text/plain; charset=ISO-8859-1 

... 

------=_Part_19486_1391901275.1418138792683 
Content-Transfer-Encoding: 7bit 
Content-Type: text/html; charset=ISO-8859-1 

... 

------=_Part_19486_1391901275.1418138792683-- 

------=_Part_19487_1145362154.1418138792683-- 

To jest zarys kodu służy do analizowania wiadomości e-mail:

Message [] found = fldr.search(searchCondition);   
for (int i = 0; i < found.length; i++) { 
    Message m = found[i]; 
    Object o = m.getContent(); 
    if (o instanceof Multipart) { 
     log.info("**This is a Multipart Message. "); 
     Multipart mp = (Multipart)o; 
     log.info("The Multipart message has " + mp.getCount() + " parts."); 
     for (int j = 0; j < mp.getCount(); j++) { 
      BodyPart b = mp.getBodyPart(j); 

      // Loop if the content type is multipart then get the content that is in that part, 
      // make it the new container and restart the loop in that part of the message. 
      if (b.getContentType().contains("multipart")) { 
       mp = (Multipart)b.getContent(); 
       j = 0; 
       continue; 
      } 

      log.info("This content type is " + b.getContentType()); 

      if(!b.getContentType().contains("text/html")) { 
       continue; 
      } 

      Object o2 = b.getContent(); 
      if (o2 instanceof String) { 
       <do things with content here> 
      } 
     } 
    } 
} 

Wydaje się zachować zatrzymując się na drugiej granicy i nie parsowania cokolwiek dalej. W przypadku powyższego komunikatu zatrzymuje się na granicy = "---- = _ Part_19486_1391901275.1418138792683" i nigdy nie dostaje się do tekstu wiadomości.

+1

Co to jest "log.info (" Ten typ zawartości to "+ b.getContentType());" podać? – ToYonos

+1

"Ten typ zawartości to wieloczęściowy/alternatywny;" Kiedy to działa, mówi "Ten typ treści to text/html; charset = ISO-8859-1" –

+1

Za każdym razem, dla każdej pętli zwrotnej? – ToYonos

Odpowiedz

2

W tym bloku:

if (b.getContentType().contains("multipart")) 
{ 
    mp = (Multipart)b.getContent(); 
    j = 0; 
    continue; 
} 

ustawić j do 0 i poprosić pętlę, aby kontynuować, mając nadzieję, zacznie ponownie na zero. Ale operacja inkrementacji j++ pojawi się wcześniej, a twoja pętla rozpocznie się od 1, nie 0.

Ustaw j na -1, aby rozwiązać problem.

if (b.getContentType().contains("multipart")) 
{ 
    mp = (Multipart)b.getContent(); 
    j = -1; 
    continue; 
} 
+1

@Psycho_Penguin: pomogło ci to? – ToYonos

+0

Przepraszam, byłem na wakacjach od kilku ostatnich dni. Do tej pory działa w środowisku testowym, ale nie w produkcji. –

+0

Dziwne. Zanim doszło do awarii w obu środowiskach? – ToYonos

1

Przetestowałem Twój kod i również mi się nie udało.

W moim przypadku b.getContentType() zwraca wszystkie wielkie litery (np. "TEXT/HTML; charset = UTF-8"). Więc przekonwertowałem to na małe litery i zadziałało.

String contentType=b.getContentType().toLowerCase(Locale.ENGLISH); 

if(!contentType.contains("text/html")) { 
    continue; 
} 
+1

Dlaczego po wydrukowaniu typu zawartości do dziennika zawsze ma on małe litery? –

+1

Jeśli jest to małe, nie ma problemu. Myślę, że jest to związane z używaną biblioteką klientów poczty e-mail. Niektórzy klienci poczty e-mail zwracają wielkie litery (testowałem na implementacji protokołu IMAP w Gmailu za pomocą Gmaila). –