现在我创建了一个代码来检索未读的电子邮件并阅读它的正文,然后我们可以存储或做任何我们想做的事情. 它是完全工作,但问题是它给我只有身体的第一个邮件,第二个它给身体的html标
它是完全工作,但问题是它给我只有身体的第一个邮件,第二个它给身体的html标签.
我正在使用JavaMail API …
我能怎么做??
提前致谢.
最好的祝福,
阿里
package pack1; //import the necessary classes import java.io.IOException; import java.util.Properties; import javax.mail.Flags; import javax.mail.Folder; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.NoSuchProviderException; import javax.mail.Session; import javax.mail.Store; import javax.mail.search.FlagTerm; public class InboxReader { public static void main(String args[]) { Properties props = System.getProperties(); props.setProperty("mail.store.protocol", "imaps"); try { Session session = Session.getDefaultInstance(props, null); Store store = session.getStore("imaps"); store.connect("imap.gmail.com", "mail", "pass"); System.out.println(store); Folder inbox = store.getFolder("Inbox"); inbox.open(Folder.READ_ONLY); //Message messages[] = inbox.getMessages(); FlagTerm ft = new FlagTerm(new Flags(Flags.Flag.SEEN), false); Message messages[] = inbox.search(ft); int i =0; for(Message message:messages) { Multipart mp = (Multipart)messages[i].getContent(); Object p = mp.getBodyPart(i).getContent(); String q = p.toString();//object has the body content System.out.println(q);//prints the body System.out.println( messages[i].getSubject()+ " \n"+i);i++; } } catch (NoSuchProviderException e) { e.printStackTrace(); System.exit(1); } catch (MessagingException e) { e.printStackTrace(); System.exit(2); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
输出 :
a a 0 <div dir="ltr">b<br> </div> b 1 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 >= 2 at java.util.Vector.elementAt(Unknown Source) at javax.mail.Multipart.getBodyPart(Multipart.java:156) at javax.mail.internet.MimeMultipart.getBodyPart(MimeMultipart.java:258) at pack1.InboxReader.main(InboxReader.java:39)您使用相同的索引从列表中获取消息,以便从该消息获取一部分内容.所以你从消息1中获取第1部分,从消息2中获取第2部分等等.在某些时候,你会得到一个消息N,它的N个部分少于N,并且得到了ArrayIndexOutOfBoundsException.
Multipart mp = (Multipart)messages[i].getContent(); Object p = mp.getBodyPart(i).getContent();
另外,你假设所有的消息都是多部分的.第一次在非多部分消息中调用Message.getContent()时,会收到一个ClassCastException,因为它很可能会返回一个String.
Multipart mp = (Multipart)messages[i].getContent();
同样,您假定非嵌套多部分.第一次收到包含多部分/备选项的顶级multipart / mixed的消息作为其第一个子部分时,对MimeBodyPart.getContent()的调用将返回另一个Multipart,因此p.toString()将返回一个Java对象标识符,而不是您想要的消息内容.
Object p = mp.getBodyPart(i).getContent(); String q = p.toString();//object has the body content
要做到这一点,你需要走消息结构并确定你关心的“身体”部分.