修复 JavaMail 501 Domain address required: HELO 无法发送邮件

问题表现:
最近服务器上不停的报该错误,而且邮件一直发送不了,在后台日志里只看到以下异常:

   javax.mail.MessagingException: 501 Domain address required: HELO

	at com.sun.mail.smtp.SMTPTransport.issueCommand(SMTPTransport.java:1363)
	at com.sun.mail.smtp.SMTPTransport.helo(SMTPTransport.java:838)
	at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:375)
	at javax.mail.Service.connect(Service.java:275)
	at com.banckle.em.livechat.mail.MailQueue.executeTaskImpl(MailQueue.java:292)
	at com.banckle.em.livechat.mail.MailQueue.executeTask(MailQueue.java:214)
	at com.banckle.em.livechat.mail.MailQueue.access$300(MailQueue.java:43)
	at com.banckle.em.livechat.mail.MailQueue$MailThread.run(MailQueue.java:75)```

**问题分析:**

考虑到首次出这个异常的时间,感觉可能和Email Team部署新的SMTP服务器的时间比较接近,难道是他们那边又出新Bug了?

但是经过多次测试后发现,同样的代码,在测试服务器上却工作的非常正常,那就说明代码没问题,SMTP服务器可能也没问题。问题在哪?

经过分析JavaMail的实现代码,发现JavaMail会尝试从 mail.smtp.localhost 以及 mail.smtp.localaddress 等属性里获取localhost的名字,然后我就在我们的inspector工具里执行

```java.net.InetAddress.getLocalHost().getHostName();```

发现抛异常了,说 unknown host livechat.banckle.com,然后突然就想到这个域名一两周前给去掉解析了,而是使用 chat.banckle.com 代替,然后ssh登陆上去,ping了一下这个地址,发现这地址无法解析。  
那就很有可能是因为这个地址无效引起的。

**问题解决:**

打开 /etc/sysconfig/network 将HOSTNAME 改为 chat.banckle.com,然后再发邮件看看,发送成功,问题解决。

Last modified on 2012-08-31