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的内容,因为内容比较少,下载快,如果解析整封邮件,有的邮件附件又比较大,那么会很久很久,浪费时间。

 


posted on 2023-04-05 23:20  陈惟鲜的博客  阅读(100)  评论(0编辑  收藏  举报

导航