javamail邮件TLS版本 Exception reading response javax.mail.authenticationfail_SMTP


用java发送邮件时,总提示上图错误。检查了很多遍,账号密码都正确,可是总是提示连接失败。

最后发现,问题并不出在代码上,而是出在了邮箱的设置上。下面介绍一下解决方法:(以网易邮箱为例)

首先,点击邮箱上方的“设置”,然后点击“POP3/SMTP/IMAP”.

javamail邮件TLS版本 Exception reading response javax.mail.authenticationfail_邮件_02


出现以下界面,将“POP3/SMTP服务”和“IMAP/SMTP服务”前面打上勾。

javamail邮件TLS版本 Exception reading response javax.mail.authenticationfail_tomcat_03


然后邮箱会出现以下提醒

javamail邮件TLS版本 Exception reading response javax.mail.authenticationfail_java_04


点击确定,然后选择开启

javamail邮件TLS版本 Exception reading response javax.mail.authenticationfail_apache_05


然后提示发送短信“9988”至106981630163222.

短信费用由运营商收取,大家无需担心,大部分的运行商收费标准应该是:网内短信0.1元/条

javamail邮件TLS版本 Exception reading response javax.mail.authenticationfail_apache_06


发送短信成功后,点击“我已发送”

出现以下界面

javamail邮件TLS版本 Exception reading response javax.mail.authenticationfail_apache_07


输入两次相同的授权码即可,授权码在第三方中的作用相当于登录密码,不要忘记。

(不用担心别人通过代码知道自己的邮箱密码了)然后选中下面的三个服务,点击确定。

javamail邮件TLS版本 Exception reading response javax.mail.authenticationfail_java_08


最后,在自己的代码里,将密码改为刚刚设置的客户端授权码即可。

完整错误提示:

javax.mail.AuthenticationFailedException: failed to connect
 at javax.mail.Service.connect(Service.java:322)
 at javax.mail.Service.connect(Service.java:172)
 at javax.mail.Service.connect(Service.java:121)
 at javax.mail.Transport.send0(Transport.java:190)
 at javax.mail.Transport.send(Transport.java:120)
 at com.test.MailDemo.sendEmail(MailDemo.java:36)
 at com.servlet.RegisterServlet.doPost(RegisterServlet.java:68)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
 at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
 at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:444)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
 at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:1025)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
 at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1137)
 at org.apache.coyote.AbstractProtocolSocketProcessor.run(JIoEndpoint.java:319)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
 at java.util.concurrent.ThreadPoolExecutorWrappingRunnable.run(TaskThread.java:61)
 at java.lang.Thread.run(Thread.java:745)

找到错误提示的那一行,发现是

Transport.send(msg);

下面解释一下原因:

SMTP是一种提供可靠且有效的电子邮件传输的协议。SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知。SMTP独立于特定的传输子系统,且只需要可靠有序的数据流信道支持,SMTP的重要特性之一是其能跨越网络传输邮件,即“SMTP邮件中继”。使用SMTP,可实现相同网络处理进程之间的邮件传输,也可通过中继器或网关实现某处理进程与其他网络之间的邮件传输。

我们在用java实现邮件发送时,使用了SMTP协议,却没有在邮箱里开启SMTP服务,这样肯定发送失败!!!