2011-09-28 13 views
6

Sto cercando di capire come passare "direttamente" a un oggetto MimeMessage (dalla libreria Javamail) direttamente dalla libreria POI di Apache()) come allegato, senza doverlo scrivere direttamente nel filesystem.Aggiungere un POI Apache come allegato a MimeMessage di Javamail senza scrivere nel filesystem

Il modo più semplice per fare questo sembra il seguente:

File attachmentSource = new File("tmpsource.xls"); 

WorkBook tmpWorkbook = new HSSFWorkBook(); 
//Do stuff with workbook 
tmpWorkBook.write(new FileOutputStream(attachmentSource)); 

//Create all the Session, MimeMessage and MimeMultipart 
MimeBodyPart attachment = new MimeBodyPart(); 
attachment.setDataHandler(new DataHandler(new FileDataSource(attachmentSource))); 
attachment.setFileName(attachmentSource.getName()); 

//Do stuff with the message and send it 

In questo modo funziona, ma sono costretto a scrivere il file nella FS.

Durante la lettura delle domande correlate ho scoperto circa ByteArrayInputStream e ByteArrayOutputStream e sembrava risolvere il mio problema (A meno che il file si gonfia fino a 2GB che sembra molto improbabile).

Spero di essermi spiegato, penso che i flussi ByteArray faranno il trucco, tra l'altro qualsiasi aiuto o consiglio sono apprezzati!

[2011/09/29] ho creato un semplice DataSource implementazione chiamato (indovinate un po ') ByteArrayDataSource, quindi ho l'installazione intestazioni automatiche e la codifica Base64.

risposta

3

Uno dei costruttori MimeBodyPart accetta come argomento un array di byte (il contenuto dell'allegato). Quindi, basta scrivere la cartella di lavoro a un ByteArrayOutputStream, trasformare questo flusso a un array di byte, e passare questo array di byte al costruttore:

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
tmpWorkBook.write(baos); 
MimeBodyPart attachment = new MimeBodyPart(internetHeaders, baos.toByteArray()); 
// or MimeBodyPart attachment = 
//  new MimeBodyPart(new ByteArrayInputStream(baos.toByteArray())); 
+0

Ok, ho davvero sperato che in questo modo ha funzionato, ma i dati binari è scritto direttamente nel corpo della posta, quindi nessuna vera e propria impostazione automatica delle intestazioni e nessuna codifica base64 cool. :(Mi sto perdendo qualcosa? – Minkiele

Problemi correlati