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

Error while accessing GoDaddy emails in java program

我正在尝试将我的 GoDaddy 邮箱中的邮件读入我的 java 程序,但我遇到错误 PKIX 路径构建失败 。我尝试了 link 上显示的解决方案:"PKIX path building failed" and "unable to find valid certification path to requested target"。但仍然是错误 persists.Is 我应该在我的 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.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.access1(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.properties.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

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