1

当我尝试使用 JavaMail API 发送电子邮件时,我目前遇到了一个问题。我从我的应用程序控制台得到的例外是:

"javax.mail.MessagingException: 550 Access denied - Invalid HELO name (See RFC2821 4.1.1.1)"

顺便说一句,我已经将我的 mail.smtp.auth 属性设置为 true:props.put("mail.smtp.auth", "true"),但它仍然失败,有人知道吗?还是以前遇到过类似的问题?

4

2 回答 2

1

当发送主机名无法反向解析为原始 IP 地址时,SMTP 服务器通常会返回 550 错误。这允许邮件服务器对发送客户端是它所说的那个人进行一些身份验证。不幸的是,许多测试客户端——尤其是 NAT 设备后面的系统——将具有不映射到任何名称的原始 IP 地址。

例如,我正在输入的机器有一个不可路由的 IP 地址 192.168.1.103,而我的主机名可能是 so.example.myhouse,它工作正常,因为我的路由器假装来自我办公桌的数据包来自(例如)69.59.196.211是我的 WAN 地址。但是,如果您使用props.put("mail.from", "me@so.example.myhouse")SMTP 服务器,则可能会尝试 DNS 查找,但对于我虚构的主机名(即全球 DNS 不知道的主机名)显然会失败。

即使我使用映射到 69.59.196.211 的 DNS 名称(例如stackoverflow.com),SMTP 服务器也可能会执行反向 DNS 查找来检查 211.196.59.69.in-addr.arpa 是否映射到 stackoverflow.com。如果失败,SMTP 服务器可能会认为您是欺骗者并返回 550。

最后,由于您无法控制的原因,您的发送客户端或其 IP 地址块的每个主机都可能被 SMTP 服务器列入黑名单。

如果没有您可能想要发布的更多上下文(有罪的客户端和服务器的名称和地址),我无法确定这是与 Java 无关的 SMTP/DNS 问题,因此您必须自己检查这些位。您可以完全跳过 Java 并telnet smtp-servername 25自己与服务器对话。如果您尝试,您会发现RFC 2821很有帮助。

于 2010-03-01T04:26:19.573 回答
1

代替

props.put("mail.smtp.auth", true); 

props.put("mail.smtp.auth", "true");

它有效:)

于 2010-03-02T04:14:09.513 回答