501 Command "HELO" requires an argument问题排查记录
2010-06-08 14:40
495 查看
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,封装了多种酷炫组件,面向广大淘客提供免费建站推广功能,目前已经入住淘宝箱,正式对外运营,欢迎各位围观。
场景描述:
保存邮箱配置时自动探测邮箱配置参数是否正确,结果发现在探测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 -- Initiates a conversation with the mail server. When using this command you can specify your domain name so that the mail server knows who you are. For example, HELO mailhost2. cf.ac.uk.
发现HELO指令后面需要跟一个发起者的主机名,告诉SMTP服务器这个消息来源是哪里。
再看异常信息是"501 Command "HELO" requires an argument",很明显,程序在跟SMTP SERVER交互过程中没有传递源主机域名。
4. 查看JAVA MAIL源码
查找HELO指令,如下:
/** * Issue the <code>HELO</code> command. * * @param domain * our domain * * @since JavaMail 1.4.1 */ protected void helo(String domain) throws MessagingException { if (domain != null) issueCommand("HELO " + domain, 250); else issueCommand("HELO", 250); }
查找helo方法在哪里被调用,看看domain如何被传递过来的
if (useEhlo) succeed = ehlo(getLocalHost()); if (!succeed) helo(getLocalHost());
顺理成章,接着找getLocalHost()方法,定义如下:
/** * Get the name of the local host, for use in the EHLO and HELO commands. * The property mail.smtp.localhost overrides mail.smtp.localaddress, which * overrides what InetAddress would tell us. */ public synchronized String getLocalHost() { try { // get our hostname and cache it for future use if (localHostName == null || localHostName.length() <= 0) localHostName = session.getProperty("mail." + name + ".localhost"); if (localHostName == null || localHostName.length() <= 0) localHostName = session.getProperty("mail." + name+ ".localaddress"); if (localHostName == null || localHostName.length() <= 0) { InetAddress localHost = InetAddress.getLocalHost(); localHostName = localHost.getHostName(); // if we can't get our name, use local address literal if (localHostName == null) // XXX - not correct for IPv6 localHostName = "[" + localHost.getHostAddress() + "]"; } } catch (UnknownHostException uhex) { } return localHostName; }
可以看到hostname的获取可以通过当前连接的session属性中获取,也可以从当前服务器的hosts配置中获取,而我们程序是没有在session中设置hostname的,因此原因肯定在于该台Linux服务器的hosts文件被修改,造成JAVA程序无法自动获得localhostName。
5. 查看/etc/hosts文件,情况如下:
127.0.0.1 localhost.localdomain localhost ::1 localhost6.localdomain6 localhost6
简单的将hosts文件修改如下:
127.0.0.1 localhost ::1 localhost6.localdomain6 localhost6
6. 重新测试,问题解决了。
其实,这种情况也可以通过程序避免,即在session连接中加入当前服务器的hostname属性,程序示例:
public static void main(String[] args) { try { int smtpport = 25; String smtpserver = "219.147.xxx.xxx"; Properties prop = System.getProperties(); prop.put("mail.smtp.auth", "true"); prop.put("mail.smtp.localhost", "myMailServer"); Session mailSession = Session.getInstance(prop, null); Transport transport = mailSession.getTransport("smtp"); transport.connect(smtpserver,smtpport, "username", "password"); System.out.println("connect ok"); transport.close(); } catch (AuthenticationFailedException en) { en.printStackTrace(); System.out.println("smtp服务器连接失败,请检查输入信息是否正确"); } catch (NoSuchProviderException e) { e.printStackTrace(); System.out.println("smtp服务器连接失败,请检查输入信息是否正确"); } catch (MessagingException e) { e.printStackTrace(); System.out.println("smtp服务器连接失败,请检查输入信息是否正确"); } }
帮朋友宣传:
新淘网依赖淘宝TOP平台的API,封装了多种酷炫组件,面向广大淘客提供免费建站推广功能,目前已经入住淘宝箱,正式对外运营,欢迎各位围观。
相关文章推荐
- 501 Command "HELO" requires an argument问题排查记录
- 501 Command "HELO" requires an argument问题排查记录
- 501 Command "HELO" requires an argument问题的解决方法
- 发送邮件报错 501 Command "HELO" requires an argument
- 反驳"MySQL InnoDB (不行)的性能问题",千万级别记录来测试说明
- 记录 android 开发的一个 "面试" 问题
- 安装VS2003时,"Setup Has Detected That Another Program Requires the Computer to Reboot"问题的解决方案
- 【REACT NATIVE 跨平台应用开发】环境搭建问题记录&&XCODE7模拟器上COMMAND+R失效的几种替换方法
- 编译错误问题(GDI)"": Error: A1079E: Unrecognized command line option '--diag_suppress=1,2
- IE6下背景图片不缓存问题或者document.execCommand("BackgroundImageCache",false,true)
- 解决错误Unknown CMake command "QT4_WRAP_CPP"(CMAKE对应Qt在Linux/Windows兼容问题)
- Linux bash: scp: command not found的问题记录
- 记录一次cpu 100%线上问题排查
- Ubuntu中配置Java环境变量时,出现command not found问题解决记录
- 记一次"未将对象引用设置到对象的实例"问题的排查过程
- Lua501版本编译tolua5.2.4版本的问题解决记录
- 记录一次对代码完全陌生的问题排查过程
- 问题处理记录: clang: error: linker command failed with exit code 1 (use -v to see invocation)
- Jenkins连接git时出现“Failed to connect to repository : Command ... HEAD" returned status code 128:”的问题解决
- [ Nginx ] 记录关于 $_GET 获取参数有误的一次问题排查