使用javax邮件发送邮件时获取异常

时间:2015-04-04 17:27:38

标签: java javamail

以下是我用来发送电子邮件的方法

 public static void main(String[] args) {
    final String fromEmail = "abc@gmail.com"; //requires valid gmail id
            final String password = "123456"; // correct password for gmail id
            final String toEmail = "xyz@gmail.com,ghi@gmail.com"; 

            System.out.println("TLSEmail Start");
            Properties props = new Properties();
            props.put("mail.smtp.host", "smtp.gmail.com"); 
            props.put("mail.smtp.port", "587"); 
            props.put("mail.smtp.auth", "true"); 
            props.put("mail.smtp.starttls.enable", "true"); 

            Authenticator auth = new Authenticator() {

                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(fromEmail, password);
                }
            };
            Session session = Session.getInstance(props, auth);


    sendEmail(session, toEmail,"TLSEmail Testing Subject", "TLSEmail Testing Body");
    }

     public static void sendEmail(Session session, String toEmail, String subject, String body){
            try
            {
              MimeMessage msg = new MimeMessage(session);
              //set message headers
              msg.addHeader("Content-type", "text/HTML; charset=UTF-8");
              msg.addHeader("format", "flowed");
              msg.addHeader("Content-Transfer-Encoding", "8bit");



              String content = getContent();


              msg.setSubject(subject, "UTF-8");
              msg.setContent(content.toString(), "text/html");

              msg.setSentDate(new Date());

              msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail, false));
              System.out.println("Message is ready");
              Transport transport = session.getTransport("smtp");
              transport.connect();
              Transport.send(msg);  

              System.out.println("EMail Sent Successfully!!");
              transport.close();
            }
            catch (Exception e) {
              e.printStackTrace();
            }
        }   

这是我突然开始得到的例外

 javax.mail.MessagingException: Could not convert socket to TLS;
      nested exception is:
        javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: timestamp check failed
        at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1999)
        at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:709)
        at javax.mail.Service.connect(Service.java:386)
        at javax.mail.Service.connect(Service.java:245)
        at javax.mail.Service.connect(Service.java:194)
        at com.sharique.mail.util.EmailUtil.sendEmail(EmailUtil.java:45)
        at com.sharique.main.TestMain.main(TestMain.java:38)
    Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: timestamp check failed
        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:543)
        at com.sun.mail.util.SocketFetcher.startTLS(SocketFetcher.java:480)
        at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1994)
        ... 6 more
    Caused by: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: timestamp check failed
        at sun.security.validator.PKIXValidator.doValidate(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)
        ... 17 more
    Caused by: java.security.cert.CertPathValidatorException: timestamp check failed
        at sun.security.provider.certpath.PKIXMasterCertPathValidator.validate(Unknown Source)
        at sun.security.provider.certpath.PKIXCertPathValidator.doValidate(Unknown Source)
        at sun.security.provider.certpath.PKIXCertPathValidator.engineValidate(Unknown Source)
        at java.security.cert.CertPathValidator.validate(Unknown Source)
        ... 23 more
    Caused by: java.security.cert.CertificateExpiredException: NotAfter: Sat Apr 04 20:45:55 IST 2015
        at sun.security.x509.CertificateValidity.valid(Unknown Source)
        at sun.security.x509.X509CertImpl.checkValidity(Unknown Source)
        at sun.security.provider.certpath.BasicChecker.verifyTimestamp(Unknown Source)
        at sun.security.provider.certpath.BasicChecker.check(Unknown Source)
        ... 27 more

代码工作正常没有任何错误,但就在几分钟前它开始给我上述异常。我没有改变代码,所以我不知道怎么回事。请告诉我如何解决此问题。

4 个答案:

答案 0 :(得分:1)

解决方案是添加该行props.put(“mail.smtp.ssl.trust”,“smtp.gmail.com”);

答案 1 :(得分:0)

该例外清楚地说明了导致它的原因。 您的邮件服务器的证书似乎已过期,尝试使用浏览器访问服务器并检查其证书或尝试使用wget获取服务器上的任何页面,您应该收到证书错误。

    Caused by: java.security.cert.CertPathValidatorException: timestamp check failed
    at sun.security.provider.certpath.PKIXMasterCertPathValidator.validate(Unknown Source)
    at sun.security.provider.certpath.PKIXCertPathValidator.doValidate(Unknown Source)
    at sun.security.provider.certpath.PKIXCertPathValidator.engineValidate(Unknown Source)
    at java.security.cert.CertPathValidator.validate(Unknown Source)
    ... 23 more
Caused by: java.security.cert.CertificateExpiredException: NotAfter: Sat Apr 04 20:45:55 IST 2015
    at sun.security.x509.CertificateValidity.valid(Unknown Source)
    at sun.security.x509.X509CertImpl.checkValidity(Unknown Source)
    at sun.security.provider.certpath.BasicChecker.verifyTimestamp(Unknown Source)
    at sun.security.provider.certpath.BasicChecker.check(Unknown Source)
    ... 27 more

答案 2 :(得分:0)

我也有同样的问题。 (甚至显示相同的" Not After"消息和你的同一时间)。在更改了一些配置之后,它又开始工作了,但是,我回到原来的配置并且工作正常。我认为这是Gmail中的一个小问题,他们已经修复了。你尝试过使用465端口吗?我正在使用的端口正在为我工​​作。

此外,这是我的配置似乎是发送没有例外的电子邮件(这是我的grails应用程序中的配置,但你应该能够将它们移植到你的Java代码):

    grails.mail.host = "smtp.gmail.com"
    grails.mail.port = 465
    grails.mail.username = "xxxx@gmail.com"
    grails.mail.password = "xxxxxxx"
    grails.mail.props = ["mail.smtp.auth":"true",
                         "mail.smtp.socketFactory.port":"465",
                         "mail.smtp.socketFactory.class":"javax.net.ssl.SSLSocketFactory",
                         "mail.smtp.socketFactory.fallback":"false"]

答案 3 :(得分:0)

我的一个应用程序开始自动重新发送邮件,而不会对代码进行任何更改...