Sending mail from servers with non-ASCII names
As part of an effort to internationalize our product we're testing on machines with host names that include non-ASCII characters (accented e's and whatnot). When trying to send mail from these machines we're getting:
javax.mail.MessagingException: 501 5.5.4 Invalid Address
at com.sun.mail.smtp.SMTPTransport.issueCommand(SMTPTransport.java:1634)
at com.sun.mail.smtp.SMTPTransport.helo(SMTPTransport.java:1068)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:458)
at javax.mail.Service.connect(Service.java:291)
at javax.mail.Service.connect(Service.java:172)
at javax.mail.Service.connect(Service.java:121)
at javax.mail.Transport.send0(Transport.java:190)
at javax.mail.Transport.send(Transport.java:120)
at msgsendsample.main(msgsendsample.java:86)
Looking at a network trace I see the EHLO command being sent as
EHLO test[0xe9][0xdf]\r\n
where the machine name is testéß. From a Unicode table 0xe9 0xdf = é ß.
I found a reference from RFC 5336 (SMTP Extension for Internationalized Email Addresses) that says the hostname in the EHLO must be in the form of ACE (ASCII-compatible encoding) labels:
3.7.1. The Initial SMTP Exchange
When an SMTP connection is opened, the server normally sends a
"greeting" response consisting of the 220 response code and some
information. The client then sends the EHLO command. Since the
client cannot know whether the server supports UTF8SMTP until after
it receives the response from EHLO, any domain names that appear in
this dialogue, or in responses to EHLO, MUST be in the hostname form,
i.e., internationalized ones MUST be in the form of ACE labels.
ACE encoding for my machine would be: java.net.IDN.toASCII("test4éß") --> "xn--testss-eva".
I'm not sure if this RFC applies in this case - I didn't know anything about the guts of SMTP until yesterday - but it makes sense that you'd need to escape the hostname in the EHLO until you can negotiate capabilities.
Looking at the JavaMail API it seems that if I were to call SMTPTransport.helo(String domain) myself without going through the higher-level Transport class that maybe I could work around the issue, but I haven't looked into it enough to know if that's feasible.
Is anyone familiar with this problem? I'm using JavaMail 1.4.2 on Windows 2003 and Exchange as my SMTP server.
thanks,
Eric