• 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,封装了多种酷炫组件,面向广大淘客提供免费建站推广功能,目前已经入住淘宝箱,正式对外运营,欢迎各位围观。

  • 相关阅读:
    C# 对XML操作-实例
    XML
    得到一个随机数组的方法
    Node Redis 小试
    Hexo快速搭建静态博客并实现远程VPS自动部署
    substr.js 字符串切割
    GraphicsMagick 学习笔记
    store.js 跨浏览器的localStorage
    bodyParser中间件的研究
    Sublime Text 使用指南
  • 原文地址:https://www.cnblogs.com/hehe520/p/6330188.html
Copyright © 2020-2023  润新知