前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java解析eml文件工具类

Java解析eml文件工具类

作者头像
JokerDJ
发布2023-11-27 15:27:40
2550
发布2023-11-27 15:27:40
举报
文章被收录于专栏:JokerDJJokerDJ

依赖

代码语言:javascript
复制
 <!-- https://mvnrepository.com/artifact/javax.mail/mail -->
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4.7</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-core</artifactId>
           <version>5.3.6</version>
       </dependency>

#EmlUtil

代码语言:javascript
复制
import org.springframework.util.StringUtils;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 使用Java的mail包解析 标准的 .eml格式的邮件文件
 *
 * @author
 * @date 2019/08/07
 */
public class EmlUtil {
    // 定义发件人、收件人、SMTP服务器、用户名、密码、主题、内容等
    private String displayName;

    private String from;

    private List<String> to=new ArrayList<>();

    private String cc;

    private String bcc;

    private String server;

    private String subject;

    private String content;

    private String parsingPath;

    public String getDisplayName() {
        return displayName;
    }

    public String getFrom() {
        return from;
    }

    public List<String> getTo() {
        return to;
    }

    public String getServer() {
        return server;
    }

    public String getSubject() {
        return subject;
    }

    public String getContent() {
        return content;
    }

    public String getParsingPath() {
        return parsingPath;
    }

    public void setParsingPath(String parsingPath) {
        this.parsingPath = parsingPath;
    }

    public Vector<String[]> getAttachList() {
        return attachList;
    }

    public void setAttachList(Vector<String[]> attachList) {
        this.attachList = attachList;
    }

    public static Map<String, Object> getResult() {
        return result;
    }

    public static void setResult(Map<String, Object> result) {
        EmlUtil.result = result;
    }

    /**
     * 用于保存发送附件的文件名的集合(<code>new String[]{文件名,显示名称}</code>)
     */
    public void addFile(String[] filename) {
        attachList.add(filename);
    }

    public String getContentType() {
        return contentType;
    }

    public void setContentType(String contentType) {
        this.contentType = contentType;
    }

    public String getCharset() {
        return charset;
    }

    public void setCharset(String charset) {
        this.charset = charset;
    }

    /**
     * 设置SMTP服务器地址
     */
    public void setServer(String smtpServer) {
        this.server = smtpServer;
    }

    /**
     * 设置发件人的地址
     */
    public void setFrom(String from) {
        this.from = from;
    }

    /**
     * 设置显示的名称
     */
    public void setDisplayName(String displayName) {
        this.displayName = displayName;
    }

    /**
     * 设置接收者
     */
    public void setTo(List<String> to) {
        this.to = to;
    }

    public String getCc() {
        return cc;
    }

    public void setCc(String cc) {
        this.cc = cc;
    }

    public String getBcc() {
        return bcc;
    }

    public void setBcc(String bcc) {
        this.bcc = bcc;
    }

    /**
     * 设置主题
     */
    public void setSubject(String subject) {
        this.subject = subject;
    }

    /**
     * 设置主体内容
     */
    public void setContent(String content) {
        this.content = content;
    }

    public String getSentDate() {
        return sentDate;
    }

    public void setSentDate(String sentDate) {
        this.sentDate = sentDate;
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    /**
     * 用于保存发送附件的文件名的集合(<code>new String[]{文件名,显示名称}</code>)
     */
    private Vector<String[]> attachList = new Vector<String[]>();

    private String contentType = "text/html";

    private String charset = "utf-8";

    private int port = 25;

    private String sentDate;

    static Map<String, Object> result = new HashMap<>();

    public Map<String, Object> getEmlContent(String file) throws Exception {
        result = new HashMap<>();
        parserFile(file);
        return result;
    }

    public Map<String, Object> getEmlContent(File file) throws Exception {
        result = new HashMap<>();
        parserFile(file.getAbsolutePath());
        return result;
    }

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

    private 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());
//            System.out.println("发件人显示名:" + addr.getPersonal());
            result.put("sender", addr.getAddress());
        }
        //收件人信息
        Address[] tos = msg.getAllRecipients();
        String sjrAddressList = "";
        for (Address a : tos) {
            InternetAddress addr = (InternetAddress) a;
//            System.out.println("====>收件人地址:" + addr.getAddress());
            if (addr.getAddress() != null && addr.getAddress().length() >= 0) {
                sjrAddressList += addr.getAddress() + ",";
            }

        }
        sjrAddressList = sjrAddressList.substring(0, sjrAddressList.length() - 1);
        result.put("receiver", sjrAddressList);
//        System.out.println("邮件主题:" + msg.getSubject());

        result.put("senddate", msg.getSentDate());
        result.put("subject", msg.getSubject());
        result.put("receivedate", msg.getSentDate());
        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());
        }

        return map;
    }

    /**
     * 解析内容
     *
     * @param part
     * @throws Exception
     */
    private Map<String, Object> rePart(Part part) throws Exception {
        Map<String, Object> map = new HashMap<>();
        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();
                File dir = new File(parsingPath);
                if (!dir.exists()) {
                    dir.mkdirs();
                }
                String strFile = parsingPath/*"C:\\Users\\23328\\Downloads\\test\\"*/ + strFileNmae;
                map.put("attachname", strFileNmae);
                String type = strFileNmae.substring(strFileNmae.lastIndexOf(".") + 1);
                map.put("type", type);
                map.put("attachdownloadurl", strFile);
                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()));
            if (result.get("content").toString() != null && result.get("htmlcontent").toString() != null) {
                if (part.getContentType().startsWith("text/plain")) {
                    System.out.println("文本内容:" + part.getContent());
                    result.put("content", part.getContent());
                } else if (part.getContentType().startsWith("text/html")) {
                    System.out.println("HTML内容:" + part.getContent());
                    result.put("htmlcontent", part.getContent().toString());

                }
            }
            return map;

        } else {

            if (part.getContentType().startsWith("text/plain")) {
                System.out.println("文本内容:" + part.getContent());
                result.put("content", part.getContent());
            } else if (part.getContentType().startsWith("text/html")) {
//                System.out.println(part.getContentType());
                System.out.println("HTML内容:" + part.getContent());
                result.put("htmlcontent", part.getContent().toString());

            }
        }
        return null;
    }

    /**
     * 接卸包裹(含所有邮件内容(包裹+正文+附件))
     *
     * @param multipart
     * @throws Exception
     */
    private void reMultipart(Multipart multipart) throws Exception {
        // System.out.println("邮件共有" + multipart.getCount() + "部分组成");
        // 依次处理各个部分
        List<Map<String, Object>> mapList = new ArrayList<>();
        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 {
                Map<String, Object> rePart = rePart(part);
                mapList.add(rePart);
                result.put("Attachment", mapList);
            }
        }
    }

    /**
     * 将email写至文件
     *
     * @throws IOException
     * @throws FileNotFoundException
     * @throws MessagingException
     */
    public void writeTo(String filename) throws FileNotFoundException,
            IOException, MessagingException {
        Properties props = System.getProperties();
        props.put("mail.smtp.host", "smtp.163.com");
        props.put("mail.smtp.port", port);
        props.put("mail.smtp.auth", "false");

        Session session = Session.getDefaultInstance(props, null);
        session.setDebug(false);

        Message msg = new MimeMessage(session);
        Address from_address = new InternetAddress(from, displayName);
        msg.setFrom(from_address);

        InternetAddress[] addressTo =  new InternetAddress[to.size()];
        for (int i = 0; i < to.size(); i++) {
            InternetAddress internetAddress = new InternetAddress();
            internetAddress.setAddress(to.get(i));
            addressTo[i]=internetAddress;
        }
        msg.setRecipients(Message.RecipientType.TO, addressTo);

        if (StringUtils.hasLength(cc)) {
            InternetAddress[] addressCc = {new InternetAddress(cc)};
            try {
                msg.setRecipients(Message.RecipientType.CC, addressCc);
            } catch (MessagingException e) {
                e.printStackTrace();
            }
        }

        if (StringUtils.hasLength(bcc)) {
            InternetAddress[] addressBcc = {new InternetAddress(bcc)};
            msg.setRecipients(Message.RecipientType.BCC, addressBcc);
        }

        msg.setSubject(subject);
        Multipart mp = new MimeMultipart();
        MimeBodyPart mbp = new MimeBodyPart();
        mbp.setContent(content.toString(), getContentType() + "; charset="
                + getCharset());
        mp.addBodyPart(mbp);
        if (!attachList.isEmpty()) {// 有附件
            for (String[] file : attachList) {
                mbp = new MimeBodyPart();
                FileDataSource fds = new FileDataSource(file[0]); // 得到数据源
                mbp.setDataHandler(new DataHandler(fds)); // 得到附件本身并至入BodyPart
                String dspName = file.length < 2 ? fds.getName() : file[1];
                mbp.setFileName(MimeUtility.encodeText(dspName, getCharset(),
                        "B")); // 得到文件名同样至入BodyPart
                mp.addBodyPart(mbp);
            }
            attachList.removeAllElements();
        }
        msg.setContent(mp); // Multipart加入到信件
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            msg.setSentDate(dateFormat.parse(getSentDate())); // 设置信件头的发送日期

        } catch (ParseException e) {
            e.printStackTrace();
        }


        msg.saveChanges();
        // 写至文件
        msg.writeTo(new FileOutputStream(new File(filename)));
    }

    //写入测试
    public static void main(String[] args) throws Exception {
        EmlUtil emlUtil = new EmlUtil();
        emlUtil.setSubject("test");
        emlUtil.setContent("test");
        emlUtil.setDisplayName("test");
        emlUtil.setFrom("test");
        List<String> strings = new ArrayList<>();
        strings.add("test");
        emlUtil.setTo(strings);
        emlUtil.setSentDate("2021-04-14 12:20:00");
        emlUtil.writeTo("D:/test.eml");
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-11-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 依赖
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档