现在我已经创建了一个代码来检索未读电子邮件并阅读其正文,然后我们可以存储或执行我们想做的任何事情。
它完全正常工作,但问题是它只给我第一个邮件的正文,而第二个它给了身体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)
答案 0 :(得分:15)
您使用相同的索引从列表中获取消息以获取该消息的一部分。所以你要从消息1中获取第1部分,从消息2中获取第2部分等等。在某些时候,你将点击消息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
作为其第一个子部分的顶级multipart/alternative
的邮件时,对MimeBodyPart.getContent()
的调用将返回另一个Multipart
,从而{{1}只返回一个Java对象标识符,而不是你想要的消息内容。
p.toString()
要做得对,你需要走消息结构并确定你关心的“身体”部分。