【发布时间】:2012-10-06 01:22:33
【问题描述】:
我正在尝试使用 Java 应用程序连接到 Mercury 邮件服务器,并且我正在使用 JavaMail api。连接不成功,我在日志中收到此错误:
EHLO x.x.x.x
554 HELO 格式无效
这意味着它连接到服务器但helo格式不是服务器喜欢的东西。我已经厌倦了调试它,我在 JavaMail “SMTPTransport” 类中找到了这段代码:
serverOutput.write(cmdBytes);
serverOutput.write(CRLF);
serverOutput.flush();
并根据代码:
私有静态最终字节[] CRLF = { (byte)'\r', (byte)'\n' };
这似乎与 RFC 821 一致
我知道在 windows 上 \n 有不同的含义,但我不确定这是否真的是问题的根源?如果不是,那是什么原因造成的? 我用邮件客户端检查了邮件服务器,它工作正常,我用 James 邮件服务器检查了代码,它也工作正常!
JavaMail API 版本为:1.4.5(最新版本)
水星/32 : 4.7
【问题讨论】:
-
如何配置 Mercury 服务器以验证客户端主机名? EHLO 的参数应该是客户端的 fqdn(但如果没有可用的 fqdn,则可以是客户端的 IP)。 Mercury 服务器可能设置为验证客户端上的反向 DNS 和/或拒绝不可路由的客户端地址。最好的办法是使用 Wireshark 从工作客户端捕获会话并与失败的会话进行比较。
-
另外,
serverOutput的编码定义是什么?如果它不是二进制的,那么您实际上可能正在发送 CR-CR-LF,这可能是个问题。 -
关于 serverOutput 我不确定它是如何工作的 我无法进入源代码,因为我提到它是 JavaMail API 包的一部分,但我同意你的观点,并在我的帖子中提到我如您所说,怀疑此 CRLF 可能是 CR CR LF
-
我已经尝试 telnet 到服务器并使用相同的 IP 地址发送 Ehlo 工作正常。请注意,这一切都发生在同一台机器上,发送方和接收方的服务器都是本地主机。我不确定哪些设置可能对此有影响,我在哪里可以检查?
标签: java smtp jakarta-mail mercury-mta