Chua Chee Seng wrote:
And thank YOU for the help too. You're extremely thorough analysis of the problem made this very easy to fix.Hi Rick,Sorry for writing back late as I was out of town. imho, generalizing it would be a good idea. If the spec allows it, people will do it. Once again, thanks for the help! :-)
Rick
Regards, Chee Seng Rick McGuire wrote:Chua Chee Seng wrote:Yes, this is part of the SMTP specification, although only place I'd encountered a continuation response was the EHLO command. I might want to generalize the receiving of the response lines to automatically account for continuatations....I'm now nervous that there might be other places where this might show up.Hi Rick, It works! Thank you very much. :-) If you don't mind, I am curious about the rule '220-' indicating there is continuous line and '220' indicating it does not have continuous line, is this rule in the SMTP specification?RickOnce again, thank you for your help. Regards, Chee Seng Rick McGuire wrote:Your analysis is exactly correct, it was a silly mistake on my part (sigh). I'm glad I asked you to check it out before I committed the change! Anyway, I've refreshed the jar file out on people.apache.org, so if you would give the new version a try, I'd really appreciate it.Rick Chua Chee Seng wrote:Hi Rick, It does not work. When executed, the debugging console is showing these lines:- 220-xxx.xxx.xxx ESMTP Exim x.xx #1 Mon, 20 Aug 2007 16:29:11 +0800 220-We do not authorize the use of this system to transport unsolicted, 220 and/or bulk email.It then stopped there until a Read timed out exception is thrown. Seemsto me that the client is not sending EHLO/HELO to the server. I decompiled SMTPTransport and SMTPReply (I don't have the modified source code) to see what can be wrong, I think getWelcome() method in SMTPTransport is causing the problem:- protected boolean getWelcome() throws MessagingException { SMTPReply line = getReply(); if(line.isError()) return false; for(; line.isContinued(); getReply()); return true; } In the for loop, the line.isContinued() is always returning false as it does not get setting to new reference to SMTPReply returned by getReply() call in the for loop. I think something like the following should work:- protected boolean getWelcome() throws MessagingException { SMTPReply line = getReply(); if(line.isError()) return false; while(line.isContinued()) line = getReply(); return true; } As it is decompiled code, I am not sure if your source code is like the above, so it is just my guess. I would be happy to help to test again with new builds. :-) Best Regards, Chee Seng Rick McGuire wrote:Chua Chee Seng wrote:Hi Rick,Thanks for the reply. I would be happy to help out testing it. However,I am very new to this community and some guidance is reallyappreciated. :-)This should be fairly simple. I built a 1.1.1 version of SMTP codeand placed it here:http://people.apache.org/~rickmcguire/stage-javamail/geronimo-javamail-transport-1.1.1.jarJust replace the geronimo-javamail-transport jar file in your 1.1.1 server assembly, and retry your program. That will verify that my fix is working correctly and I'll be able to commit my fix for the problem. Unfortunately, the fix won't ship until the next Geronimo update, but you'll have a corrected jar to run with while you're on 1.1.1.RickRegards, Chee Seng Rick McGuire wrote:This is the first time I've encountered an SMTP server that sends a response back like this. I've opened a JIRA for this issue:https://issues.apache.org/jira/browse/GERONIMO-3427 and I'll take a look at fixing this. Since I don't have access toan SMTP server that behaves this way, are you willing/able to help try out potential fixes?Rick Chua Chee Seng wrote:Hi, I am trying to use the Geronimo Javamail. I have setup the resource and resource-ref stuff and try to send a mail from the application. I turn off the debug flag and see the following in the console:- ... 220-xxx.xxx.xxx ESMTP Exim x.xx #1 Mon, 20 Aug 2007 16:29:11 +0800 EHLO xxxxx 220-We do not authorize the use of this system to transport unsolicted, HELO xxxxx 220 and/or bulk email. ... An exception is then thrown complaining that it fails to send HELO to the server. When using telnet xxxx 25 to my SMTP server, I found out that once connected, the SMTP is sending back three lines of text:- 220-xxx.xxx.xxx ESMTP Exim x.xx #1 Mon, 20 Aug 2007 16:29:11 +0800 220-We do not authorize the use of this system to transport unsolicted, 220 and/or bulk email. I then try with a local SMTP using Apache JAMES, which successfully send the mail. When I try to telnet localhost 25, it is sending back only one line of text:- 220 xxxx SMTP Server (JAMES SMTP Server 2.3.1) ready Mon, 20 Aug 2007 16:32:26 +0800 (SGT) I am suspecting Geronimo Javamail implementation (version 1.1.1) cannot beused on SMTP who sends back more than 1 lines of 220 service ready. Iinvestigate the source code of org.apache.geronimo.javamail.transport.smtp.SMTPTransport and study that getReply() method is using the receiveLine() method to read response from the server. As receivedLine() is using end of stream (read() ==-1) or CR or LF to indicate end of response from server, so in the above scenario each 220 are identified as a response from the server. After receiving the first 220, the client send a EHLO but fails as the server is sending back the 2nd 220. The client then try to send a HELO but receive the 3rd 220, which it finally gave up and throw a fails to send HELO exception.I have switch to Sun Javamail implementation to solve the problem. However,I personally prefer to use Geronimo implementation due to installation issue. Is there a better way, or is it in the later version (Geronimo 1.2, 2.0, I didn't try :P), the Geronimo Javamail can handle SMTP that sends more than 1 lines of 220 back to client (like the SMTP server that I am facing)? Thanks in advance for any advice. Best Regards, Chee Seng
