504 5.5.2 <NTOMSV13>: Helo command rejected: need fully-qualified hostname 问题解决方法。

本文主要是介绍504 5.5.2 <NTOMSV13>: Helo command rejected: need fully-qualified hostname 问题解决方法。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

这两天公司的项目所绑定公司的邮件服务器挂了,导致所有有关邮件的信息都发送不了,实施叫我改成另一台,并发给我了一些相关信息,修改完配置信息后,在生产环境跑了下,果然没有那么走运直接通,又因为这是项目是公司私服,只能通过公司电脑连接公司wifi才能访问,而且公司wifi又设置了白名单,除了公司的电脑其他的都无法连接,公司电脑配置又垃圾了,导致又不能在公司电脑进行开发,邮件服务器也是公司内网才能telnet,导致这排查又增添了难度。。

BUG

查看生产环境的日志,其报的错为:

	at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1294)at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:635)at javax.mail.Transport.send0(Transport.java:189)at javax.mail.Transport.send(Transport.java:118)at com.pccw.kernel.service.MessageUtil.sendEmail(MessageUtil.java:192)at com.pccw.kernel.service.MessageUtil.sendMessage(MessageUtil.java:368)at com.pccw.business.timedtask.TaskTest.sendEmail(TaskTest.java:145)at com.pccw.business.timedtask.TaskTest.execute(TaskTest.java:42)at org.quartz.core.JobRunShell.run(JobRunShell.java:213)at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557)
****************Invalid Addresses

抛出的是SendFailedException这个异常,message又是 Invalid Addresses,我查了下网上所说这个错误无非就是说收件人地址无效啥啥啥的,我说这就离谱原来地址没改不也好好的,况且我自己的邮箱还能看不出来输没输错吗,后来发现原来SMTP那边会提示更详细的信息,我这边log的信息过于模糊,那好吧,只能找负责SMTP这边的同事拿log,上面提示就是如下:

Jun 28 11:17:43 mail postfix/smtpd[31147]: NOQUEUE: reject: RCPT from dcnm3.pbase.net[xxx.xxx.xxx.xxx]: 504 5.5.2 <lxcrp>: Helo command rejected: need fully-qualified hostname; from=<xx@xx.com> to=<sxxx@xx.com> proto=SMTP helo=<lxcrp>

说是我helo不符合他们的规则啥啥啥的,然后又开始巴拉巴拉的找,很多信息就是说叫我改smtp服务器main.cf文件中的接收人,发送人的规则,好家伙,我这想说我也想改啊,但是我做不到啊,可怜如我们只能遵循设定好的规则,而不能去创造规则,好吧,那只能换一种方式来排查。

排查

先用ssh连上项目所在的linux系统上再用telnet 连接smtp 服务器的25端口,如果这一步都无法成功,那能发邮件才是见鬼了。

在这里插入图片描述
一些私密信息就不方便公布出来了,可以从图片看出来这个可以正常发送邮件并能成功接收的,那就说明所给的信息是没问题的,那就应该是javamail中出了问题。看了下公司封装的jar包,结合命令行与报错日志结合,才发现helo不同导致的问题。

解决方法

javamail这东西很神奇哈,如果你没有设置其,那他就传的是你的主机名默认方法为InetAddress.getLocalHost().getHostName(),如果smtp没有配置该主机名为helo,那他就会报504,然而我这样的底层,也不能叫他们把我这主机名加到helo中去呀,那只能改成符合他这个规范的模式,即传一个自定义的helo过去。
代码如下::

System.setProperty("mail.smtp.localhost","heloName");

这个是直接将相关属性添加到JVM环境中,这样添加的方式一旦重启服务器就会丢失,也可以在发邮件的时候先获取所有系统属性的对象,然后往对象中添加也行,代码如下:

	//获取系统PropertiesProperties props = System.getProperties();		//设置自定义helo     props.setProperty("mail.smtp.localhost","heloName");  

因为我这公司的sendMessage已经封装成jar包,又没提供mail.smtp.localhost这个参数,所以肯定不能使用第二种方法了,然后第一种方法如果写在单独某个方法中,那修改量就比较大了,最后还是打算写一个Init-Method,我这个项目是使用Spring IOC作为Bean管理容器,那么可以指定init-method,其中init-method表示bean加载成功后,立即执行某个方法。

 <bean class="com.business.bcase.service.PortalBcaseHeadService" init-method="startMethod"><property name="portalBcaseHeadDAO"><ref bean="portalBcaseHeadDAO"/></property></bean>
public void startMethod(){Properties props= System.getProperties();if(!COMMON.isEmpty(props)){String localhost=props.getProperty("mail.smtp.localhost");if(COMMON.isEmpty(localhost)){if(!COMMON.isEmpty(SystemProperties.get("mail.smtp.localhost"))){System.setProperty("mail.smtp.localhost",SystemProperties.get("mail.smtp.localhost"));}}}}

改完这些之后,在测试,就成功了。
在这里插入图片描述

这篇关于504 5.5.2 <NTOMSV13>: Helo command rejected: need fully-qualified hostname 问题解决方法。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/233277

相关文章

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

Windows 上如果忘记了 MySQL 密码 重置密码的两种方法

《Windows上如果忘记了MySQL密码重置密码的两种方法》:本文主要介绍Windows上如果忘记了MySQL密码重置密码的两种方法,本文通过两种方法结合实例代码给大家介绍的非常详细,感... 目录方法 1:以跳过权限验证模式启动 mysql 并重置密码方法 2:使用 my.ini 文件的临时配置在 Wi

MySQL重复数据处理的七种高效方法

《MySQL重复数据处理的七种高效方法》你是不是也曾遇到过这样的烦恼:明明系统测试时一切正常,上线后却频频出现重复数据,大批量导数据时,总有那么几条不听话的记录导致整个事务莫名回滚,今天,我就跟大家分... 目录1. 重复数据插入问题分析1.1 问题本质1.2 常见场景图2. 基础解决方案:使用异常捕获3.

最详细安装 PostgreSQL方法及常见问题解决

《最详细安装PostgreSQL方法及常见问题解决》:本文主要介绍最详细安装PostgreSQL方法及常见问题解决,介绍了在Windows系统上安装PostgreSQL及Linux系统上安装Po... 目录一、在 Windows 系统上安装 PostgreSQL1. 下载 PostgreSQL 安装包2.

SQL中redo log 刷⼊磁盘的常见方法

《SQL中redolog刷⼊磁盘的常见方法》本文主要介绍了SQL中redolog刷⼊磁盘的常见方法,将redolog刷入磁盘的方法确保了数据的持久性和一致性,下面就来具体介绍一下,感兴趣的可以了解... 目录Redo Log 刷入磁盘的方法Redo Log 刷入磁盘的过程代码示例(伪代码)在数据库系统中,r

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Java中Switch Case多个条件处理方法举例

《Java中SwitchCase多个条件处理方法举例》Java中switch语句用于根据变量值执行不同代码块,适用于多个条件的处理,:本文主要介绍Java中SwitchCase多个条件处理的相... 目录前言基本语法处理多个条件示例1:合并相同代码的多个case示例2:通过字符串合并多个case进阶用法使用

Mysql如何解决死锁问题

《Mysql如何解决死锁问题》:本文主要介绍Mysql如何解决死锁问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录【一】mysql中锁分类和加锁情况【1】按锁的粒度分类全局锁表级锁行级锁【2】按锁的模式分类【二】加锁方式的影响因素【三】Mysql的死锁情况【1

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认