Description
Just tried to send an email through gmail servers by doing the following:
AuthenticatingSMTPClient client = new AuthenticatingSMTPClient(); client.connect("smtp.gmail.com", 587); // reply: 220 220 mx.google.com ESMTP client.login(); // reply: 250 250 mx.google.com at your service client.execTLS(); // reply: 220 2.0.0 Ready to start TLS client.auth(AUTH_METHOD.PLAIN, username, password); // exception ...
Unfortunality after execTLS() I get a MalformedServerReplyException. I looked at the SMTPSClient source code and found out that the reader/writer are wrong after execTLS() got called. The performSSLNegotiation() method sets input and output to the new input/output streams from SSLSocket, but the reader/writer are still pointing to the values set inside connectAction().
Possible fix for this issue:
public boolean execTLS() throws SSLException, IOException { if (!SMTPReply.isPositiveCompletion(sendCommand("STARTTLS"))) { return false; //throw new SSLException(getReplyString()); } performSSLNegotiation(); _reader = new CRLFLineReader(new InputStreamReader(_input_, encoding)); _writer = new BufferedWriter(new OutputStreamWriter(_output_, encoding)); return true; }