2009-12-17 16 views
6

Sto cercando di sviluppare un client di posta elettronica IMAP utilizzando l'API javax.mail. Sono stato in grado di contattare i server, recuperare e-mail, allegati e altre operazioni senza alcun problema.IMAP - javax.mail. - Recupero solo corpo senza allegato

Tuttavia, non vorremmo recuperare l'allegato finché l'utente non vuole vederlo esplodere per migliorare le prestazioni. Ciò significherebbe che avremmo bisogno di informazioni che indichino se l'e-mail ha un allegato, se sì, il nome del file (s) e la dimensione (s) ma sarebbe non inviarmi il contenuto effettivo del messaggio di posta elettronica. Tuttavia, non sono riuscito a trovare un metodo nella descrizione dell'API che restituisca solo il contenuto multiparte.

Esiste un modo per recuperare solo il corpo e i dettagli dell'allegato ma non l'effettivo allegato?

Grazie, Aravind

risposta

2

Il metodo getContent() di javax.Part restituisce

il contenuto come un oggetto Java. Il tipo dell'oggetto restituito è ovviamente dipendente dal contenuto stesso. Per l'esempio , l'oggetto restituito per il contenuto "text/plain" è in genere un oggetto stringa . L'oggetto restituito per un contenuto "multipart" è sempre una sottoclasse Multipart .

Vedi http://download.oracle.com/javaee/6/api/javax/mail/Part.html#getContent%28%29

Se Message (che è un Part) contiene allegati, il metodo getContent restituirà un oggetto Multipart. Inoltre, è possibile conoscere il tipo MIME della parte con getContentType.

Le informazioni mancanti nella documentazione sono che questo oggetto MultiPart restituito da getContent è solo una rappresentazione vuota della struttura del messaggio. Il contenuto di ogni dello Multipart verrà prelevato dal server solo quando richiesto espressamente. Ad esempio, per analizzare un multipart Message si dovrebbe fare:

if(p.isMimeType("multipart/*")) { 

    Multipart mp = (Multipart)p.getContent(); 
    // the content was not fetched from the server 

    // parse each Part 
    for (int i = 0; i < mp.getCount(); i++) { 
     Part inner_part = mp.getBodyPart(i) 

     if(inner_part.isMimeType("text/plain")) { 
      String text = inner_part.getText(); 
      // the content of this Part was fetched from the server 
     } 
    } 
} 

Un'altra cosa da considerare è che per ottenere prestazioni ottimali si dovrebbe ottenere le informazioni struttura della carrozzeria dal server in modalità batch per la raccolta di messaggi che si desidera analizzare (vedi http://download.oracle.com/javaee/6/api/javax/mail/FetchProfile.Item.html#CONTENT_INFO). In caso contrario, ogni

Multipart mp = (Multipart)p.getContent();

si tradurrà in una richiesta al server per recuperare la struttura del corpo. Se viene utilizzato l'approccio FetchProfile, la struttura del corpo per la raccolta di messaggi verrà recuperata con una sola richiesta. È possibile vedere le richieste al server nel registro se si attiva la modalità di debug sulla sessione:

session.setDebug(true); 

Detto questo, per ottenere dimensioni e nomi dei file allegati basta usare rispettivamente Part.getSize() e Part.getFileName(),.