读取邮箱历史收件箱时,由于邮件过多,导致系统出现如下异常:
13:28:36.212 [main] ERROR com.nfrm.rm.demo.EmailReader - Failed to load IMAP envelope
javax.mail.MessagingException: Failed to load IMAP envelope
at com.sun.mail.imap.IMAPMessage.loadEnvelope(IMAPMessage.java:1508)
at com.sun.mail.imap.IMAPMessage.getFrom(IMAPMessage.java:301)
解决方案:
可以通过网络邮箱的客户端,下载完成历史邮件,通过客户端导出邮件为【eml】。
如图:
通过如下代码,逐一读取邮件,并进行解析。
import javax.mail.*;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
public class EmlReader {
public static void main(String[] args) {
// 指定.eml文件的路径
String filePath = "path/to/your/file.eml";
try {
// 创建一个Properties对象
Properties props = new Properties();
props.put("mail.store.protocol", "imaps");
// 创建一个Session对象
Session session = Session.getDefaultInstance(props);
// 使用FileInputStream读取.eml文件
FileInputStream fis = new FileInputStream(new File(filePath));
// 创建MimeMessage对象
MimeMessage message = new MimeMessage(session, fis);
// 关闭输入流
fis.close();
// 提取邮件内容
System.out.println("Subject: " + message.getSubject());
System.out.println("From: " + message.getFrom()[0]);
System.out.println("To: " + message.getAllRecipients()[0]);
System.out.println("Sent Date: " + message.getSentDate());
System.out.println("Content Type: " + message.getContentType());
// 获取邮件正文
Object content = message.getContent();
if (content instanceof String) {
System.out.println("Content: " + content);
} else if (content instanceof Multipart) {
Multipart multipart = (Multipart) content;
for (int i = 0; i < multipart.getCount(); i++) {
BodyPart bodyPart = multipart.getBodyPart(i);
System.out.println("Part " + (i + 1) + ": " + bodyPart.getContent());
}
}
} catch (MessagingException | IOException e) {
e.printStackTrace();
}
}
}