Geronimo javamail does not work on non-ASCII platforms ------------------------------------------------------
Key: GERONIMO-5326 URL: https://issues.apache.org/jira/browse/GERONIMO-5326 Project: Geronimo Issue Type: Bug Security Level: public (Regular issues) Components: mail Environment: z/OS Reporter: Robin Fernandes [RFC-1939|http://www.ietf.org/rfc/rfc1939.txt] states that in the POP3 protocol, "Keywords and arguments consist of printable ASCII characters." Geronimo javamail creates a PrintWriter to send messages down the line, but does not specify a Charset. Therefore, Strings written to the PrintWriter will be converted to bytes using the platform default encoding. On a non-ASCII platform, such as z/OS (which is an EBCDIC platform), this means non-ASCII data will be sent down the line. Consequently, the POP3 protocol is violated and the mail server will not understand the messages. In my context, this manifests as a javax.mail.AuthenticationFailedException, presumably because the server fails to understand the login commands. The patch below at least gets past the auth step. However, I suspect there will be further charset problems relating to decoding MIME etc... Essentially, a potential problem exists wherever the library uses new String(bytes[]), String.getBytes(), InputStreamReaders, OuputStreamWriters or any other entity that performs byte[]<->String conversions without explicitly specifying which Charset to use. In some environments, a workaround may be to force the default encoding to ASCII by setting system property file.encoding to an ASCII codepage (e.g. -Dfile.encoding=ISO8859-1), but this is not satisfactory if other libraries in the same runtime expect the default encoding to be EBCDIC. {code} Index: POP3Connection.java =================================================================== --- POP3Connection.java (revision 946178) +++ POP3Connection.java (working copy) @@ -22,6 +22,7 @@ import java.net.Socket; import java.net.SocketException; import java.net.UnknownHostException; +import java.nio.charset.Charset; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; @@ -156,8 +157,9 @@ // The POp3 protocol is inherently a string-based protocol, so we get // string readers/writers for the connection streams - reader = new BufferedReader(new InputStreamReader(inputStream)); - writer = new PrintWriter(new BufferedOutputStream(outputStream)); + Charset iso88591 = Charset.forName("ISO8859-1"); + reader = new BufferedReader(new InputStreamReader(inputStream, iso88591)); + writer = new PrintWriter(new OutputStreamWriter(new BufferedOutputStream(outputStream), iso88591)); } protected void getWelcome() throws IOException { {code} -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.