在使用javamail阅读gmail电子邮件时偶尔获取javax.mail.FolderClosedException
我正在尝试阅读javamail收件箱并执行搜索。为此,我获取最新的100条消息,然后对每条消息进行迭代,以查看它们是否包含我正在搜索的发件人。如果匹配,则通过getContent()获取其内容 以下是我的javamail代码片段:在使用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");
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,并继续他们停止的地方(而不是从一开始就重新启动)。