users@javamail.java.net

Re: removing attachments from locally stored message

From: <xoot123_at_yahoo.it>
Date: Tue, 30 Apr 2013 09:02:45 +0100 (BST)

Thank you very much!



M. R.




>________________________________
> Da: Bill Shannon <bill.shannon_at_oracle.com>
>A: xoot123_at_yahoo.it
>Cc: "users_at_javamail.java.net" <users_at_javamail.java.net>
>Inviato: Luned́ 29 Aprile 2013 20:52
>Oggetto: Re: removing attachments from locally stored message
>
>
>xoot123_at_yahoo.it wrote on 04/29/13 11:33:
>> Hello,
>> My application offers the possibility to save emails from IMAP accounts to a
>> local database.
>> Later on, the user can remove the attachments from those saved messages, with
>> two options:
>> a) remove the original message;
>> b) keep the original message.
>>
>> The whole original message is saved locally, meaning that an OutputStream is
>> used to write the message (writeTo()) to it and from that an InputStream is
>> obtained that populates a BLOB column.
>>
>> The problem is, in case (b) I can only create a MimeMessage from the saved
>> stream, with new MimeMessage(null, myInputStream).
>> The new message is passed to a method that removes all its attachments.
>> I saw that when removing the attachments (and precisely when saveChanges() is
>> called) all the MimeMessage internal stream references are nullified, so that a
>> call to getSize() returns -1.
>>
>> Since I need to store the message size on the database, along with other
>> informations, the only solutions I found to make JavaMail give me that is to
>> create a new MimeMessage from the attachments-removed MimeMessage.
>>
>> So, to sum it up: <database column> -> msg = new MimeMessage(null, myIS) ->
>> removeAttachments(msg) -> newMsg = new MimeMessage(null, msg).
>>
>> Are all those steps necessary or is there a more efficient way to do this?
>
>It would be very complicated to keep track of the final size of a message
>after each of those "edits" to the message, so JavaMail doesn't even try.
>
>The technique you're using is implemented by "serializing" the entire message
>to a MIME byte stream, then deserializing the message to create a new
>MimeMessage object.  If all you want is the size, a more efficient approach
>is to serialize the message (using writeTo) to an OutpuStream that does
>nothing with the data but counts how much data is written.  After writeTo
>is done, ask the stream how much data was written.
>
>
>
>