Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在使用javamail阅读gmail电子邮件时偶尔获取javax.mail.FolderClosedException_Java_Email_Gmail_Jakarta Mail_Imap - Fatal编程技术网

在使用javamail阅读gmail电子邮件时偶尔获取javax.mail.FolderClosedException

在使用javamail阅读gmail电子邮件时偶尔获取javax.mail.FolderClosedException,java,email,gmail,jakarta-mail,imap,Java,Email,Gmail,Jakarta Mail,Imap,我正在尝试阅读javamail收件箱并执行搜索。为此,我获取最新的100条消息,然后对每条消息进行迭代,以查看它们是否包含我正在搜索的发件人。如果匹配,则通过getContent()获取其内容 以下是我的javamail代码片段: try { Properties properties = new Properties(); properties.setProperty("mail.store.protocol", "imap");

我正在尝试阅读javamail收件箱并执行搜索。为此,我获取最新的100条消息,然后对每条消息进行迭代,以查看它们是否包含我正在搜索的发件人。如果匹配,则通过getContent()获取其内容

以下是我的javamail代码片段:

try {

            Properties properties = new Properties();
            properties.setProperty("mail.store.protocol", "imap");
            properties.put("mail.imaps.starttls.enable", "true");
            properties.put("mail.imap.socketFactory.port", "587");
            System.setProperty("javax.net.debug", "ssl");
            System.out.println("prop " + properties.getProperty("mail.smtp.port"));

            Session session = Session.getDefaultInstance(properties, null);
            // session.setDebug(true);
            Store store = null;
            store = session.getStore("imaps");
            store.connect("imap.gmail.com", username, password);
            Folder inbox;
            inbox = store.getFolder("Inbox");
      /* Others GMail folders :
       * [Gmail]/All Mail   This folder contains all of your Gmail messages.
       * [Gmail]/Drafts     Your drafts.
       * [Gmail]/Sent Mail  Messages you sent to other people.
       * [Gmail]/Spam       Messages marked as spam.
       * [Gmail]/Starred    Starred messages.
       * [Gmail]/Trash      Messages deleted from Gmail.
       */
            inbox.open(Folder.READ_WRITE);

            Message msgs[] = inbox.getMessages(inbox.getMessageCount() - lastHistory, inbox.getMessageCount());
            System.out.println("MSgs.length " + msgs.length);
            ArrayList<Message> aList = new ArrayList<Message>();
            appendTextToConsole("Searching for appropriate messages!!");
            for (int ii = msgs.length - 1; ii >= 0; ii--) {
                Message msg = msgs[ii];
                Address[] in = msg.getFrom();
                String sender = InternetAddress.toString(in);
                System.out.println((++index) + "Sender: " + sender);
                boolean read = msg.isSet(Flags.Flag.SEEN);
                if (sender.contains(googleId) && !read) {
//This line below gives FolderClosedException sporadically

                    Object content = msg.getContent();
                    if (content instanceof Multipart) {
                        Multipart mp = (Multipart) content;
                        for (int i = 0; i < mp.getCount(); i++) {
                            BodyPart bp = mp.getBodyPart(i);
                            if (Pattern
                                    .compile(Pattern.quote("text/html"),
                                            Pattern.CASE_INSENSITIVE)
                                    .matcher(bp.getContentType()).find()) {
                                // found html part
                                String html = (String) bp.getContent();
                                Element element = Jsoup.parse(html);
                                List<Element> anchors = element.getElementsByTag("a");
                                for (Element e : anchors) {
                                    if (e.attr("href").startsWith("https://www.google.com/url?rct=j&sa=t&url=")
                                            && !e.attr("style").equalsIgnoreCase("text-decoration:none")) {
                                        String url = e.attr("href");
                                        String title = e.text();
                                        String agency = e.parent().parent().child(1).child(0).child(0).text();
                                        String message = e.parent().parent().child(1).child(0).child(1).text();
                                        String flagUrl = e.parent().parent().child(1).child(1).child(0).child(0).child(3).child(0).attr("href");
                                        System.out.println("URL: " + url);
                                        System.out.println("Title: " + title);
                                        System.out.println("agency: " + agency);
                                        System.out.println("Message: " + message);
                                        System.out.println("flagURL: " + flagUrl);
                                        AbstractMessage ams = new AbstractMessage(url, title, agency, message, flagUrl);
                                        aMsgs.add(ams);
                                    }
                                }
                                //System.out.println((String) bp.getContent());
                            } else {
                                // some other bodypart...
                            }
                        }
                        try {
                            inbox.close(true);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
            appendTextToConsole("Done searching for appropriate messages!!");
        } catch (Exception mex) {
            appendTextToConsole(mex.getMessage());
            mex.printStackTrace();
        }
试试看{
属性=新属性();
setProperty(“mail.store.protocol”、“imap”);
properties.put(“mail.imaps.starttls.enable”、“true”);
properties.put(“mail.imap.socketFactory.port”,“587”);
setProperty(“javax.net.debug”、“ssl”);
System.out.println(“prop”+properties.getProperty(“mail.smtp.port”);
Session Session=Session.getDefaultInstance(属性,null);
//session.setDebug(true);
Store=null;
store=session.getStore(“imaps”);
store.connect(“imap.gmail.com”、用户名、密码);
文件夹收件箱;
收件箱=store.getFolder(“收件箱”);
/*其他GMail文件夹:
*[Gmail]/All Mail此文件夹包含您的所有Gmail邮件。
*[Gmail]/起草你的草稿。
*[Gmail]/发送您发送给其他人的邮件。
*[Gmail]/标记为垃圾邮件的垃圾邮件。
*[Gmail]/带星星的消息。
*[Gmail]/从Gmail中删除垃圾信息。
*/
收件箱。打开(文件夹。读写);
Message msgs[]=inbox.getMessages(inbox.getMessageCount()-lastHistory,inbox.getMessageCount());
System.out.println(“MSgs.length”+MSgs.length);
ArrayList aList=新的ArrayList();
appendTextToConsole(“搜索适当的消息!!”);
对于(int ii=msgs.length-1;ii>=0;ii--){
消息msg=msgs[ii];
地址[]in=msg.getFrom();
字符串发送方=InternetAddress.toString(in);
System.out.println((++索引)+“发送方:”+发送方);
布尔读取=msg.isSet(Flags.Flag.SEEN);
if(sender.contains(googleId)&&!read){
//下面这一行偶尔给出FolderClosedException
对象内容=msg.getContent();
if(多部分的内容实例){
多部分mp=(多部分)内容;
对于(int i=0;i
但最令人恼火的是,在获取了一些消息之后,由于未知的原因偶尔抛出javax.mail.FolderClosedException。现在我的问题是,我如何处理这种情况?使用javamail制作的理想邮件客户端是如何处理的呢?

打开它,您可能会得到更多关于发生了什么的线索

请注意,如果您不使用连接,服务器将关闭连接。
当然,各种网络故障都有可能发生。

谢谢!我一定会试试这个。Gmail就是这样。Real mail客户端重新连接到gmail,并继续他们停止的地方(而不是从一开始就重新启动)。