代码之家  ›  专栏  ›  技术社区  ›  krishna bharadia

在java程序中访问GoDaddy电子邮件时出错

  •  2
  • krishna bharadia  · 技术社区  · 7 年前

    我试图将GoDaddy邮箱中的邮件读入java程序,但我遇到了这样的错误 PKIX路径生成失败 . 我尝试了此链接上显示的解决方案: "PKIX path building failed" and "unable to find valid certification path to requested target" . 但错误仍然存在。我的java代码中是否应该包含任何内容。

    我的代码:

        import java.util.concurrent.TimeUnit;
        import java.io.File;
        import java.io.FileInputStream;
        import java.io.IOException;
        import java.sql.Connection;
        import java.sql.DriverManager;
        import java.sql.ResultSet;
        import java.sql.Statement;
        import java.text.DateFormat;
        import java.text.SimpleDateFormat;
        import java.util.Date;
        import java.util.Locale;
        import java.util.Properties;
        import javax.mail.BodyPart;
        import javax.mail.Folder;
        import javax.mail.Message;
        import javax.mail.MessagingException;
        import javax.mail.Session;
        import javax.mail.Store;
        import javax.mail.internet.MimeMultipart;
        import java.util.concurrent.Executors;
        import java.util.concurrent.ScheduledExecutorService;
        import java.util.concurrent.ScheduledFuture;
    
        public class WorkingProgram {
    
            public void poll() {
                final ScheduledExecutorService scheduler = Executors
                        .newScheduledThreadPool(1);
                 final Properties props = new Properties();
                ScheduledFuture<?> files = scheduler.scheduleAtFixedRate(
                        new Runnable() {
                            public void run() { 
                                try{
    
                                    String maxDate = null;
                                    Class.forName("com.mysql.jdbc.Driver");
                                    Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/emailproject","root","root");
                                    Statement stmt=con.createStatement();  
    
                                    ResultSet rs=stmt.executeQuery("SELECT DATE_FORMAT(MAX(received_date),'%Y-%m-%d %H:%i:%s') FROM emailproject.email_datetime_records e");
                                    if(rs.next()){
                                        maxDate=rs.getString(1);
                                    }
                                    System.out.println(maxDate);
                                    //con.close();
    
                                    DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH);
                                    Date Dbdate = format.parse(maxDate);
    
    
                                     props.load(new FileInputStream(new File("E:\\PGFiltersWorkspace\\EmailParsing\\smtp.properties.txt")));
                                        Session session = Session.getDefaultInstance(props, null);
                                        Store store = session.getStore("imaps");
                                        store.connect("imap.secureserver.net", "**", "**");
                                        Folder inbox = store.getFolder("inbox");
                                        inbox.open(Folder.READ_ONLY);
                                        int messageCount = inbox.getMessageCount();
                                        Message[] messages = inbox.getMessages();
                                        for (int i = messageCount-1; i >=0; i--) 
                                        {
                                            if(Dbdate.compareTo(messages[i].getReceivedDate())<0){
    
                                            String result = "";
    
                                            if (messages[i].isMimeType("text/plain")) {
                                                result = messages[i].getContent().toString();
                                            } else if (messages[i].isMimeType("multipart/*")) {
                                                MimeMultipart mimeMultipart = (MimeMultipart) messages[i].getContent();
                                                result = getTextFromMimeMultipart(mimeMultipart);
                                            }
                                            System.out.println("Result is:"+result);
    
    }
                                        else{
    
                                            break;
                                        }
                                }
    
                            }
                            catch(Exception e){e.printStackTrace();}
    
                        }
                    }, 0, 1, TimeUnit.MINUTES);
        }
        public static void main(String[] args) {
    
            WorkingProgram b = new WorkingProgram();
            b.poll();
        }
        private String getTextFromMimeMultipart(
                MimeMultipart mimeMultipart)  throws MessagingException, IOException{
            String result = "";
            int count = mimeMultipart.getCount();
            for (int i = 0; i < count; i++) {
                BodyPart bodyPart = mimeMultipart.getBodyPart(i);
                if (bodyPart.isMimeType("text/plain")) {
                    result = result + "\n" + bodyPart.getContent();
                    break; // without break same text appears twice in my tests
                } else if (bodyPart.isMimeType("text/html")) {
                    String html = (String) bodyPart.getContent();
                    result = result + "\n" + org.jsoup.Jsoup.parse(html).text();
                } else if (bodyPart.getContent() instanceof MimeMultipart){
                    result = result + getTextFromMimeMultipart((MimeMultipart)bodyPart.getContent());
                }
            }
            return result;
        }
    
    }
    

    错误如下:

    javax.mail.MessagingException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target;
      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.imap.IMAPStore.protocolConnect(IMAPStore.java:670)
        at javax.mail.Service.connect(Service.java:295)
        at javax.mail.Service.connect(Service.java:176)
        at WorkingProgram$1.run(WorkingProgram.java:55)
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
        at java.util.concurrent.FutureTask$Sync.innerRunAndReset(Unknown Source)
        at java.util.concurrent.FutureTask.runAndReset(Unknown Source)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(Unknown Source)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
        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:548)
        at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:352)
        at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:233)
        at com.sun.mail.iap.Protocol.<init>(Protocol.java:113)
        at com.sun.mail.imap.protocol.IMAPProtocol.<init>(IMAPProtocol.java:111)
        at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:637)
        ... 11 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)
        ... 25 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)
        ... 31 more
    

    smtp。属性。txt在此处:

    mail.smtp.host=smtpout.secureserver.net
    mail.smtp.socketFactory.port=465
    mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
    mail.smtp.auth=true
    mail.smtp.port=465
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Bill Shannon    7 年前

    Get rid of the socket factory settings, you don't need them.

    就此而言,我看不到您在应用程序中的任何位置使用属性文件,甚至没有使用smtp做任何事情,因此您可以删除该文件。

    然后跟随 these instructions in the JavaMail FAQ .

    如果您不知道如何安装证书,请将此属性设置为忽略证书(请注意,这是一种安全风险):

    mail.imaps.ssl.trust=imap.secureserver.net