501 Command "HELO" requires an argument问题排查记录

501 Command "HELO" requires an argument问题排查记录


场景描述:
保存邮箱配置时自动探测邮箱配置参数是否正确,结果发现在探测SMTP时,系统报出如下异常:
javax.mail.MessagingException: 501 Command "HELO" requires an argument
        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)
但是换一个windows服务器,发现就没这样的问题,仅在一台Linux服务器上可以重现,直观感觉就是这台Linux服务器某些配置有问题。
 
排查步骤
1. 找一台同样操作系统的Linux服务器,验证邮箱配置,ok,排除Linux操作系统特殊性的问题
2. 直接在Linux服务器上使用telnet连接对端邮件服务器的SMTP端口,OK,排除该服务器的网络问题
3. 查找HELO指令解释
 
发现HELO指令后面需要跟一个发起者的主机名,告诉SMTP服务器这个消息来源是哪里。
再看异常信息是" 501 Command "HELO" requires an argument",很明显,程序在跟SMTP SERVER交互过程中没有传递源主机域名。
4. 查看JAVA MAIL源码
查找HELO指令,如下:
 
 
查找 helo方法在哪里被调用,看看domain如何被传递过来的
 
顺理成章,接着找 getLocalHost()方法,定义如下:
 
可以看到hostname的获取可以通过当前连接的session属性中获取,也可以从当前服务器的hosts配置中获取,而我们程序是没有在session中设置hostname的,因此原因肯定在于该台Linux服务器的hosts文件被修改,造成JAVA程序无法自动获得localhostName。
5. 查看/etc/hosts文件,情况如下:
 
简单的将hosts文件修改如下:
 
6. 重新测试,问题解决了。
 
 
其实,这种情况也可以通过程序避免,即在session连接中加入当前服务器的hostname属性,程序示例:
 
 

帮朋友宣传:

新淘网依赖淘宝TOP平台的API,封装了多种酷炫组件,面向广大淘客提供免费建站推广功能,目前已经入住淘宝箱,正式对外运营,欢迎各位围观。

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值