Exception in thread "main" javax.mail.MessagingException: Failed to load IMAP envelope
at com.sun.mail.imap.IMAPMessage.loadEnvelope(IMAPMessage.java:1069)
at com.sun.mail.imap.IMAPMessage.getSubject(IMAPMessage.java:256)
at WSLTest.main(WSLTest.java:47)
主要原因是使用了smtp接受方式。应该为imap
private static FlagTerm recentTerm = new FlagTerm(new Flags(Flags.Flag.RECENT),
true);
public static String myEmailSMTPHost = "imap.qiye.163.com";
public static String myEmailAccount = "邮箱";
public static String myEmailPassword = "密码";
public static void reserveemail() throws Exception {
Properties props = new Properties();
props.setProperty("mail.store.protocol", "imap");
props.setProperty("mail.imap.host", "imap.qiye.163.com");
props.setProperty("mail.imap.port", "143");
Store store = null;
// 用来存放邮件中文件夹的,可以简单的使用javax.mail.Folder类型,
// 如果只是取未读邮件数的话Folder类型就够了
try {
Session session = Session.getInstance(props);
//如果使用pop3协议这里imap改成pop3,如果使用ssl连接这里应使用imaps
store = session.getStore("imap");
store.connect(myEmailAccount,myEmailPassword);
//System.out.println(store);
Folder folder = getInboxFolder(store, false); //取得收件箱对象
//如果需要在取得邮件数后将邮件置为已读则这里需要使用READ_WRITE,否则READ_ONLY就可以
// 获得收件箱的邮件列表
Message[] messages = folder.search(recentTerm);
for (Message message : messages) {
try{
IMAPMessage msg = (IMAPMessage) message;
System.out.println(msg.getSubject());
//InventecEmailProcessor iema=new InventecEmailProcessor();
//iema.resolvemsg(msg);
msg.setFlag(Flags.Flag.SEEN, true);
}catch(Exception e){
e.printStackTrace();
}
}
// Message messages[] = inbox.getMessages(); //获取所有邮件
//建立搜索条件FlagTerm,这里FlagTerm继承自SearchTerm,也就是说除了获取未读邮
//件的条件还有很多其他条件同样继承了SearchTerm的条件类,像根据发件人,主题搜索等,
// 还有复杂的逻辑搜索类似:
//
// SearchTerm orTerm = new OrTerm(
// new FromStringTerm(from),
// new SubjectTerm(subject)
// );
//
// 可以上网搜索SearchTerm获取更多
/*FlagTerm ft = new FlagTerm(new Flags(Flags.Flag.SEEN), false); //false代表未读,true代表已读
*//**
* Flag 类型列举如下
* Flags.Flag.ANSWERED 邮件回复标记,标识邮件是否已回复。
* Flags.Flag.DELETED 邮件删除标记,标识邮件是否需要删除。
* Flags.Flag.DRAFT 草稿邮件标记,标识邮件是否为草稿。
* Flags.Flag.FLAGGED 表示邮件是否为回收站中的邮件。
* Flags.Flag.RECENT 新邮件标记,表示邮件是否为新邮件。
* Flags.Flag.SEEN 邮件阅读标记,标识邮件是否已被阅读。
* Flags.Flag.USER 底层系统是否支持用户自定义标记,只读。
*//*
Message messages[] = inbox.search(ft); //根据设置好的条件获取message
System.out.println("邮件总共:"+messages.length+"封");
// System.out.println("11111111111111");
//遍历获取的Message数组获取信息
for (Message message : messages) {
try{
System.out.println(message.getSubject().toString());
message.setFlag(Flags.Flag.SEEN, true);
}catch(Exception e){
//e.printStackTrace();
System.out.println("读取出错!======================");
//message.setFlag(Flags.Flag.SEEN, true);
}
}
//inbox.setFlags(messages, new Flags(Flags.Flag.SEEN),true);
*/
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (store != null) {
store.close();
store = null;
}
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 获取文件夹 这里是收件箱
*
* @param store
* @param readOnly
* @return
* @throws MessagingException
*/
private static IMAPFolder getInboxFolder(Store store, boolean readOnly)
throws MessagingException {
IMAPFolder folder = (IMAPFolder) store.getFolder("INBOX");
if (!folder.isOpen()) {
if (readOnly) {
folder.open(Folder.READ_ONLY);
} else {
folder.open(Folder.READ_WRITE);
}
}
return folder;
}