使用Amazon SDK发送邮件异常

今天在调用Amazon AWS服务发送邮件的时候报出了下面这个异常,Google了很多很多资料之后,还是没有找到有效的解决办法。很多小伙伴表示笔者的server缺乏有效SSL证书,解决办法有两种:

  • 添加有效的SSL证书;
  • 使用非Https方式发送邮件。
1
2
3
javax.mail.SendFailedException: Unable to send email;
  nested exception is:
	com.amazonaws.AmazonClientException: Unable to execute HTTP request: peer not authenticated

显然这两种方法都不是我想要的,我只是在本机测试,不需要SSL证书,而且发邮件必定要使用Https来确保安全。我突然想到,前不久刚刚把系统从Lion升级到了Mavericks,JDK也升级了,会不会是因为JDK版本变化导致服务无法正常调用?此外,服务器上jdk版本是1.6.0_25,也能正常调用AWS SDK。于是我将jdk1.6.0_51升级到了jdk1.7.0_45(正好看看Java 7的新特性,虽然大家都开始热议Java 8,但主流在使用的依然是Java 6),再重新运行程序,却发现再次报出如下错误:

1
2
3
4
5
6
7
Failed to get local InetAddress for VMID. This is unlikely to matter. At all. We'll add some extra randomness
Caused by: java.net.UnknownHostException: liang: nodename nor servname provided, or not known
	at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
	at java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:901)
	at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1293)
	at java.net.InetAddress.getLocalHost(InetAddress.java:1469)
	... 80 more

错误中UnknownHostException: liang竟然显示了本机的名字,并提示找不到名为liang的主机,于是我在hosts文件中添加如下映射:

127.0.0.1       liang

添加完映射之后程序完美运行。

总结:Amazon AWS SDK与jdk1.6.0_51不兼容,如果需要正常使用Amazon AWS的邮件服务,需要使用其它版本的Jdk(或JRE)。