( i cross posted this question here, which i initially placed in Sockets and Internet Protocols)
I have developed an online auction system which, has a function to generate invoices using the iText libraries.
The invoices are stored as a ByteArray in a database and are mailed to the customer. This works find when running
the application within my IDE (Netbeans) on Mac OS X and Apache Tomcat 6.0.29 and javamail 1.4.3. When running the application on
Windows 2003 Server with same tomcat and javamail version the attachment is not readable on the client.
The attachment is added to the e-mail using the following code;
The raw e-mail of the attachment when it is correctly encoded (running from my IDE)
And again when encoded from the server
Both attachments have the same length, and are similar (but are exactly the same).
In the third line of the correctly encoded attachment the characters are; "gf" which are
encoded in the not correctly encoded attachment to "P/".
Also setting "-Dmail.mime.multipart.bmparse=false" did not make any difference.
Any ideas, suggestions, solutions ?
I ask because sometimes e-mail systems will insert or remove line-ending characters for various reasons. Possibly that's what happened in your example, but since you only posted the encoded attachment, we can't tell that.
@Paul Clapham, The difference is that the mime-encoded attachment is not readable (corrupt) when sending it from the Windows server. Difference in line-endings do indeed not matter when the body part is of content type text, but when the content type is application/pdf it does make a difference
@Rob Prime, Yes they are exactly the same. The PDFs in the example do come from the same database. The invoices also can be viewed in a webpage and are therefore also encoded in Base64 and added to a data url. On both systems the pdfs can be viewed in the webpage. So i suspect that the base64 encoding in the javax.mail api is influenced by the line-ending characters on both systems. But when using org.apache.catalina.util.Base64 encoding is done correctly. Is there a way to enforce javax.mail to use this class for base64 encoding ?
Each line is 76 characters which is a multiple of 4 so each line can be decoded without reference to earlier lines. If you base64 decode and then hex encode the first 8 bytes of the third line of each block you get
This indicates that the 0x81 has been converted to 0x3F. Now 0x3F as an ASCII character is the '?' so it looks to me like somewhere in your processing prior to being added as an attachment your binary file has been treated as text. Typically character encoders encode bytes they can't legitimately encode (such as say 0x81) as a '?'. As you are finding out, characters and String are not suitable as containers for binary data so find out where this binary file is treated as text and modify the code so that it doesn't.
Retired horse trader.
Note: double-underline links may be advertisements automatically added by this site and are probably not endorsed by me.