记录每封邮件的归档时间,发件人、标题、发件时间、归档的目录

java 解析eml文件

创建eml样例文件

qq邮箱可以导出下载(没有找到),163邮箱可以直接导出邮件为eml格式,亲测可以

记录每封邮件的归档时间,发件人、标题、发件时间、归档的目录

pom文件

<dependency>
			<groupId>javax.mail</groupId>
			<artifactId>javax.mail-api</artifactId>
			<version>1.5.0</version>
		</dependency>

		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-email</artifactId>
			<version>1.5</version>
		</dependency>

java demo

package com.modules.project.entity;

import lombok.extern.slf4j.Slf4j;

import java.io.*;
import java.util.*;

import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;

/**
 * 使用Java的mail包解析 标准的 .eml格式的邮件文件
 */
@Slf4j
public class JavaParseEmlTest {
    public static void main(String[] args) throws Exception {
        getEmlContent();
    }

    private static Map<Object, Object> getEmlContent() throws Exception {
        Map<Object, Object> map = parserFile("C:\\Users\\dell\\Desktop\\eml\\转发:微波炉菜谱.eml");
        System.out.println("============>" + map);
        return map;
    }

    /**
     * 解析文件
     *
     * @param emlPath 文件路径
     */
    public static Map<Object, Object> parserFile(String emlPath) throws Exception {
        Map<Object, Object> map;
        System.out.println(emlPath);
        Properties props = System.getProperties();
        Session session = Session.getDefaultInstance(props, null);
        InputStream inMsg;
        inMsg = new FileInputStream(emlPath);
        Message msg = new MimeMessage(session, inMsg);
        map = parseEml(msg);

        return map;
    }

    private static Map<Object, Object> parseEml(Message msg) throws Exception {
        Map<Object, Object> map = new HashMap<>(10);
        // 发件人信息
        Address[] froms = msg.getFrom();
        if (froms != null) {
            InternetAddress addr = (InternetAddress) froms[0];
            System.out.println("============>发件人地址:" + addr.getAddress());
            map.put("fjrAddress", addr.getAddress());
            System.out.println("============>发件人显示名:" + addr.getPersonal());
            map.put("fjrName", addr.getPersonal());

        }
        //收件人信息
        Address[] tos = msg.getAllRecipients();
        List<String> sjrAddressList = new ArrayList<>();
        for (Address a : tos) {
            InternetAddress addr = (InternetAddress) a;
            System.out.println("============>收件人地址:" + addr.getAddress());
            sjrAddressList.add(addr.getAddress());
        }
        map.put("sjrAddressList", sjrAddressList);

        System.out.println("============>邮件主题:" + msg.getSubject());
        map.put("subject", msg.getSubject());
        // getContent() 是获取包裹内容, Part相当于外包装
        Object o = msg.getContent();
        if (o instanceof Multipart) {
            Multipart multipart = (Multipart) o;
            reMultipart(multipart);
        } else if (o instanceof Part) {
            Part part = (Part) o;
            rePart(part);
        } else {
            System.out.println("============>类型" + msg.getContentType());
            map.put("type", msg.getContentType());
            System.out.println("============>内容" + msg.getContent());
            map.put("content", msg.getContent());
        }

        return map;
    }


    /**
     * 解析内容
     *
     * @param part
     * @throws Exception
     */
    private static void rePart(Part part) throws Exception {
        if (part.getDisposition() != null) {
            String strFileNmae = part.getFileName();
            if (strFileNmae != null) {
                // MimeUtility.decodeText解决附件名乱码问题
                strFileNmae = MimeUtility.decodeText(strFileNmae);
                System.out.println("============>发现附件: " + strFileNmae);

                // 打开附件的输入流
                InputStream in = part.getInputStream();

                String strFile = "C:\\Users\\dell\\Desktop\\eml\\" + strFileNmae;
                FileOutputStream out = new FileOutputStream(strFile);
                byte[] bytes = new byte[1024];
                while (in.read(bytes, 0, 1024) != -1) {
                    out.write(bytes);
                }

                in.close();
                out.close();

            }

            System.out.println("============>内容类型: " + MimeUtility.decodeText(part.getContentType()));
            System.out.println("============>附件内容:" + part.getContent());


        } else {
            if (part.getContentType().startsWith("text/plain")) {
                System.out.println("============>文本内容:" + part.getContent());
            } else {
                // System.out.println("HTML内容:" + part.getContent());
            }
        }
    }

    /**
     * 接卸包裹(含所有邮件内容(包裹+正文+附件))
     *
     * @param multipart
     * @throws Exception
     */
    private static void reMultipart(Multipart multipart) throws Exception {
        // System.out.println("邮件共有" + multipart.getCount() + "部分组成");
        // 依次处理各个部分
        for (int j = 0, n = multipart.getCount(); j < n; j++) {
            // System.out.println("处理第" + j + "部分");
            Part part = multipart.getBodyPart(j);// 解包, 取出 MultiPart的各个部分,
            // 每部分可能是邮件内容,
            // 也可能是另一个小包裹(MultipPart)
            // 判断此包裹内容是不是一个小包裹, 一般这一部分是 正文 Content-Type: multipart/alternative
            if (part.getContent() instanceof Multipart) {
                Multipart p = (Multipart) part.getContent();// 转成小包裹
                // 递归迭代
                reMultipart(p);
            } else {
                rePart(part);
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值