用java发送邮件时,总提示上图错误。检查了很多遍,账号密码都正确,可是总是提示连接失败。
最后发现,问题并不出在代码上,而是出在了邮箱的设置上。下面介绍一下解决方法:(以网易邮箱为例)
首先,点击邮箱上方的“设置”,然后点击“POP3/SMTP/IMAP”.
出现以下界面,将“POP3/SMTP服务”和“IMAP/SMTP服务”前面打上勾。
然后邮箱会出现以下提醒
点击确定,然后选择开启
然后提示发送短信“9988”至106981630163222.
短信费用由运营商收取,大家无需担心,大部分的运行商收费标准应该是:网内短信0.1元/条
发送短信成功后,点击“我已发送”
出现以下界面
输入两次相同的授权码即可,授权码在第三方中的作用相当于登录密码,不要忘记。
(不用担心别人通过代码知道自己的邮箱密码了)然后选中下面的三个服务,点击确定。
最后,在自己的代码里,将密码改为刚刚设置的客户端授权码即可。
完整错误提示:
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服务,这样肯定发送失败!!!