【问题标题】:Java Mail Messaging ExceptionJava 邮件消息处理异常
【发布时间】:2014-06-28 08:55:40
【问题描述】:

所以我刚刚开始使用 JavaMail API。我在我的 Web 应用程序的几个地方使用了它(我使用的是 Struts2 和 Hibernate),并且用于发送电子邮件的代码在某些地方有效,而在某些地方无效。它没有的地方,我得到一个MessagingException : Could not convert socket to TLS

这是我的代码。在类中,我定义了这个静态块:

静态属性 properties = new Properties(); 静态{

    properties.put("mail.smtp.starttls.enable", "true"); 
    properties.put("mail.smtp.host", "smtp.gmail.com");
    properties.put("mail.smtp.user", "usrname@domain.com"); // User name
    properties.put("mail.smtp.password", "<the_correct_password>"); // password
    properties.put("mail.smtp.port", "587");
    properties.put("mail.smtp.auth", "true");
}

这是在函数中发送电子邮件的代码:

    javax.mail.Session emailSession = javax.mail.Session.getDefaultInstance(properties, 
                                    new javax.mail.Authenticator() {
                                protected PasswordAuthentication
                                getPasswordAuthentication() {
                                return new
                                PasswordAuthentication("username@domain.com", "<the_correct_password>");
                                }});

   Message message = new MimeMessage(emailSession);
   message.setFrom(new InternetAddress("usrname@domain.com"));
   message.setRecipients(Message.RecipientType.TO,InternetAddress.parse(getModel().getEmail()));
 message.setSubject("Password change!");
 message.setText("Hi "+getModel().getName()+"\n"+ "Security code - "+sb.toString());
 Transport.send(message);

这里是 StackTrace 的异常:

javax.mail.MessagingException: Could not convert socket to TLS;
  nested exception is:
    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1907)
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:666)
    at javax.mail.Service.connect(Service.java:317)
    at javax.mail.Service.connect(Service.java:176)
    at javax.mail.Service.connect(Service.java:125)
    at javax.mail.Transport.send0(Transport.java:194)
    at javax.mail.Transport.send(Transport.java:124)
    at com.proconsulto.action.LoginAction.checkEmail(LoginAction.java:295)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:450)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:289)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:252)
    at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:256)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:265)
    at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:249)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:249)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:191)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:73)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:91)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:252)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:176)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:193)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:546)
    at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:304)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.ssl.Alerts.getSSLException(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
    at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
    at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
    at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)
    at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source)
    at sun.security.ssl.Handshaker.processLoop(Unknown Source)
    at sun.security.ssl.Handshaker.process_record(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:549)
    at com.sun.mail.util.SocketFetcher.startTLS(SocketFetcher.java:486)
    at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1902)
    ... 76 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.validator.PKIXValidator.doBuild(Unknown Source)
    at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
    at sun.security.validator.Validator.validate(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
    ... 87 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
    at java.security.cert.CertPathBuilder.build(Unknown Source)
    ... 93 more

提到的第 295 行是这一行:Transport.send(message)

令人惊讶的是,这段代码在一些函数中失败并且在其中一些函数中工作。我已经替换了数十次确切的代码,但我仍然无法弄清楚出了什么问题。我想也许它没有收到收件人地址,或者properties 不正确,但我已经仔细检查过,我无法理解是什么导致了这种行为。请帮帮我!

【问题讨论】:

    标签: java email struts2 gmail jakarta-mail


    【解决方案1】:

    请参考http://www.oracle.com/technetwork/java/javamail/faq/index.html#installcert 声明:

    问:当通过 SSL 连接到我的邮件服务器时,我收到一个异常,例如“无法找到到所请求目标的有效证书路径”。

    答:您的服务器可能使用的是测试证书或自签名证书,而不是商业签名的证书 证书颁发机构。您需要安装服务器的证书 进入您的信任商店。 InstallCert 程序会有所帮助。

    或者,您可以将“mail.protocol.ssl.trust”属性设置为 您的邮件服务器的主机名。请参阅协议的 javadocs 提供程序包以了解详细信息。

    此问题的其他常见原因是:

    • 防火墙或防病毒程序拦截了您的请求。
    • 您的 JDK 安装出现问题,无法找到受信任的证书颁发机构的证书。
    • 您正在运行的应用程序服务器已覆盖 JDK 的受信任证书颁发机构列表。

    当您连接到默认信任库中应该包含所有需要的证书的 Gmail 时,原因可能是防病毒软件阻止了您的 SMTP 调用。

    【讨论】:

    • ...但我没有使用防病毒软件。为什么这在某些代码中有效,而在其他代码中无效?
    • 您可以尝试使用“-Djava.security.debug=all”运行应用程序并发布结果,可能会有更多相关细节。您也可以尝试使用另一个 JDK 安装运行该应用程序,看看它是否会消失。
    • 我该怎么做?我在 Windows 上使用 Eclipse。如何使用 -Djava.security.debug=all 运行应用程序?
    • 这里解释了添加 Eclipse 环境变量 stackoverflow.com/questions/862391/… 请注意,使用“mail.smtp.ssl.trust”属性会跳过 SSL/TLS 信任检查。虽然它确实有效,但它的安全性较低,因为您的应用程序不再验证它与之通信的服务器的身份。
    【解决方案2】:

    我必须在我的静态块中添加另一个属性,这对我有用:

    props.put("mail.smtp.ssl.trust", "smtp.gmail.com");

    【讨论】:

    • 如果这样可以正常工作,则意味着您的 JDK 设置存在问题,导致它无法找到允许其正常信任 Gmail 的证书颁发机构证书。如果您只在 Eclipse 中运行程序,请尝试在 Eclipse 之外运行它。正如其他人所提到的,您可能有防火墙或防病毒产品拦截您与 Gmail 的通信并提供不同的证书。您可能想要使用 InstallCert 程序,该程序将打印出证书的详细信息,以查看您真正获得的证书。
    • 嗨。我现在才添加这行代码。早些时候,令人惊讶的是,它曾经有效。我能够毫无问题地发送电子邮件。美好的一天,我运行了这个项目,但它停止了工作。所以我不得不添加那行。我检查了我的防火墙设置,我目前没有安装防病毒软件。我很惊讶它是如何突然开始抛出MessagingException 的,而就在两天前它运行良好。另外,我在运行 InstallCert 时遇到了一些问题。我希望我能尽快解决这个问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 2011-09-16
    • 2010-09-08
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多