2014-12-09 13 views
6

Ricevo email da un client in cui hanno annidato un messaggio multipart/alternativo all'interno di un messaggio multipart/mixed. Quando ottengo il corpo del messaggio restituisce il livello multipart/alternativo quando quello che voglio veramente è la parte text/html che è contenuta nella multipart/alternativa.Analisi multiparto/misto con corpo multipart/alternativo in java

Ho guardato attraverso i javadoc per javax.mail e non riesco a trovare un modo semplice per ottenere il corpo di una parte corporea che è a sua volta multipart o saltare la prima parte multipart/mista e andare nella multipart/corpo alternativo per leggere il testo/html e testo/pezzi semplici.

La struttura email si presenta come questo:

... 
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-- 

Questa è una descrizione dei codice utilizzato per analizzare i messaggi di posta elettronica:

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> 
      } 
     } 
    } 
} 

sembra mantenere fermandosi al secondo contorno e non parsing qualsiasi altra cosa Nel caso del messaggio sopra, si ferma a boundary = "---- = _ Part_19486_1391901275.1418138792683" e non arriva mai al testo del messaggio.

+1

Cosa significa 'log.info (" Questo tipo di contenuto è "+ b.getContentType());' fornire? – ToYonos

+1

"Questo tipo di contenuto è multipart/alternativo;" Quando funziona dice "Questo tipo di contenuto è text/html; charset = ISO-8859-1" –

+1

Ogni volta, per ogni ciclo di svolta? – ToYonos

risposta

2

In questo blocco:

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

si imposta j-0 e chiedere il ciclo di continuare, nella speranza che possa ricominciare da zero. Ma l'operazione di incremento j++ verrà eseguita prima e il ciclo inizierà a 1, non a 0.

Impostare j su -1 per risolvere il problema.

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

@Psycho_Penguin: ti ha aiutato? – ToYonos

+0

Scusa, sono in vacanza da alcuni giorni. Finora funziona nell'ambiente di test ma non in produzione. –

+0

Strano. Prima che fallisse in entrambi gli ambienti? – ToYonos

1

Ho testato il codice e non è riuscito anche per me.

Nel mio caso, b.getContentType() restituisce tutti i caratteri maiuscoli (ad esempio "TEXT/HTML; charset = UTF-8"). Quindi l'ho convertito in minuscolo e ha funzionato.

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

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

Perché quando stampo il tipo di contenuto nel registro è sempre in minuscolo? –

+1

Se questo è in minuscolo, nessun problema. Penso che sia correlato a quale libreria di client di posta elettronica utilizzi. Alcuni client di posta elettronica restituiscono lettere maiuscole (ho testato l'implementazione IMAP di sun con gmail). –