java 解析socket下载的 邮件内容
上一篇文章叙述了邮件如何接收,接收我们有效的邮件。那么邮件接收后,我们如何处理呢。如何获取其中的内容呢。下载附件,获取邮件内容等。
现实场景中,我们可能下载邮件是一个定时任务,解析又是另一个线程去处理,因为两者之间其实关系不大。各做各的事情呢。
接收到的内容,是一串很长很长的字符串。这些字符串需要转换为邮件内容信息后,我们才可以读取,比如邮件的主题、发件人、发件时间、有没有附件、邮件的ID信息等。
那么怎么解析呢。mail为我们提供了一个类 MimeMessage,这个类进行加载后,就可以直接获取以上信息。
步骤1、讲解析的内容转为输入流,
步骤2、将输入流转回为javax.mail.internet.MimeMessage对象。
// 这里的邮件内容,可以从文件中获取,也可能从什么其他地方传入参数。 String emailContext = "邮件内容"; // 转为输入流 InputStream receivedMessageIs = new ByteArrayInputStream(emailContext .getBytes(StandardCharsets.UTF_8)); // 转为对象MimeMessage MimeMessage mime = new MimeMessage(null, receivedMessageIs);
得到对象后,我们就可以拿到如下信息,甚至更多。
MimeMessage mime = new MimeMessage(null, receivedMessageIs); System.out.println("===######========="); log.info("AMessageID:" + mime.getMessageID()); log.info("A主题:" + mime.getSubject()); log.info("A发送时间:" + MyDateUtil.dateToDateStr(MyDateUtil.DATE_TIME_FMT, mime.getSentDate())); log.info("A类型:" + mime.getContentType()); boolean attachmentFlag = mime.isMimeType("multipart/*"); log.info("A包含附件:" +attachmentFlag); System.out.println(mime.getMessageNumber()); System.out.println("===######=========");
此时,我们就可以知道邮件内容有哪些了。
现实情况是,我们接收邮件过程中,可能会出现 :socket断开,那么需要考虑怎么接收,重新接收。已经接收过的肯定不需要处理了。。
我是,先接收邮件,然后存储在本地。解析邮件top获取的头信息,获取messageId,然后缓存起来,表示已接收,将接收邮件的方法写成递归,如果因socket链接异常,(超时、重置、。。)那么,就调用自己,继续接收,每次接收时,只解析top的内容,因为内容比较少,下载快,如果解析整封邮件,有的邮件附件又比较大,那么会很久很久,浪费时间。