Java 未读邮件读取及解析

package com.dfham.cmdb.monitor.email;


import lombok.extern.slf4j.Slf4j;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import javax.mail.search.FlagTerm;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

@Slf4j
public class EmailAdapter {

    private static final String MAIL_IMAP_HOST = "imap.exmail.qq.com";
    private static final Properties props = new Properties();
    static {
        props.put("mail.imap.host", MAIL_IMAP_HOST);//QQ邮箱为:imap.qq.com
        props.put("mail.imap.auth", "true");
        props.setProperty("mail.store.protocol", "imap");
        props.put("mail.imap.starttls.enable", "true");
        props.setProperty("mail.imap.ssl.enable", "true");
        props.setProperty("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        //端口
        props.setProperty("mail.imap.port","993");
    }

    /**
     * 读取未读email邮件
     * @return
     */
    public static List<ImapEmailInfo> readEmails(String user,String password){
        List<ImapEmailInfo> result = new ArrayList<>();
        Session session = Session.getInstance(props);
        try {
            Store store = session.getStore();
            //企业邮箱如果开启了安全登录,密码需要使用专用密码,没有开启使用账号密码即可
            store.connect(MAIL_IMAP_HOST, user, password);
            Folder folder = store.getFolder("Inbox");
            //收取未读邮件,只读模式用于测试,READ_WRITE模式读取完成后邮件变成已读状态
            folder.open(Folder.READ_WRITE);
            //获得收件箱的邮件列表
            Message[] messages = folder.search(new FlagTerm(new Flags(Flags.Flag.SEEN),false));
            log.info("[readEmails] 搜索结果-未读邮件数:" + messages.length);
            log.info("[readEmails] folder-未读邮件数:" + folder.getUnreadMessageCount());
            //解析的邮件的方法,就粘贴了网上的了,有需要的直接点击参考文档的链接
            parseEmail(result,messages);

            if (folder != null) folder.close(true);
            if (store != null) store.close();
        }catch (Exception e){
            log.error("[readEmails] 异常: " + e.getMessage() ,e);
        }
        return result;
    }

    /**
     * 解析邮件并返回
     * @param result
     * @param messages
     */
    private static void parseEmail(List<ImapEmailInfo> result,Message[] messages) throws Exception {
        if (messages == null || messages.length == 0){
            log.info("没有可读取邮件");
            return;
        }
        for(Message message : messages){
            MimeMessage msg = (MimeMessage) message;
            ImapEmailInfo emailInfo = new ImapEmailInfo();
            emailInfo.setSubject(MimeUtility.decodeText(msg.getSubject()));
            emailInfo.setSender(getSenderAddress(msg));
            StringBuffer content = new StringBuffer();
            String contentType = msg.getContentType();
            if (contentType.toLowerCase().startsWith("text/plain")) {
                getHtmlContent(msg, content, true);
            } else {
                getHtmlContent(msg, content, false);
            }
            emailInfo.setContent(content.toString());
            result.add(emailInfo);
        }
    }

    //获取邮件发件人address
    private static String getSenderAddress(MimeMessage msg) throws Exception {
        Address[] froms = msg.getFrom();
        if (froms.length < 1)
            throw new MessagingException("没有发件人!");
        InternetAddress address = (InternetAddress) froms[0];
        if(address != null){
            return address.getAddress();
        }
        return null;
    }


    //获取邮件内的HTML内容
    private static void getHtmlContent(Part part, StringBuffer content,boolean plainFlag) throws MessagingException, IOException {
        //如果是文本类型的附件,通过getContent方法可以取到文本内容,但这不是我们需要的结果,所以在这里要做判断
        boolean isContainTextAttach = part.getContentType().indexOf("name") > 0;
        if (part.isMimeType("text/html") && !isContainTextAttach && plainFlag == false) {
            content.append(MimeUtility.decodeText(part.getContent().toString()));
        } else if (part.isMimeType("text/plain") && !isContainTextAttach && plainFlag) {
            content.append(part.getContent().toString());
        } else if (part.isMimeType("message/rfc822")) {
            getHtmlContent((Part) part.getContent(), content, plainFlag);
        } else if (part.isMimeType("multipart/*")) {
            Multipart multipart = (Multipart) part.getContent();
            int partCount = multipart.getCount();
            for (int i = 0; i < partCount; i++) {
                BodyPart bodyPart = multipart.getBodyPart(i);
                getHtmlContent(bodyPart, content, plainFlag);
            }
        }
    }
}
@Data
public class ImapEmailInfo implements Serializable {
    private static final long serialVersionUID = 6431149074654460271L;

    private String subject;
    private String sender;
    private String content;
}

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java可以使用JavaMail API来模拟邮件系统,实现接收和解析邮件的功能。JavaMail API是一个标准的Java EE库,可以通过简单的步骤来配置和使用。 首先,需要建立一个与邮件服务器的连接。可以使用JavaMail提供的Session类来创建一个和邮件服务器的连接会话。通过设置合适的属性,比如邮件服务器的地址、端口号、用户名和密码等,建立与邮件服务器的连接。 接下来,可以使用JavaMail提供的Store类来接收邮件。Store类代表了邮件服务器的存储机制,可以通过协议(如POP3或IMAP)来接收邮件。使用Store的getFolder()方法获取邮件文件夹,然后使用open()方法打开文件夹。 一旦成功打开文件夹,就可以通过Folder类提供的方法来读取邮件。可以使用getMessages()方法获取文件的所有邮件,然后通过遍历每一封邮件,使用Message类提供的方法来获取邮件的各种信息,比如发送者、主题、正文内容等。 在解析邮件时,可以使用JavaMail提供的MimeMessage类来处理邮件的多媒体内容,比如附件、HTML格式的正文等。MimeMessage类提供了许多方法来获取和解析邮件的各种组成部分,可以使用getContent()方法来获取邮件的内容。 最后,可以根据需要进一步处理解析出的邮件内容,比如保存附件、过滤垃圾邮件、将重要邮件移动到特定文件夹等。使用Java的字符串处理、文件操作等功能,可以对解析出的邮件进行进一步的操作和处理。 总之,使用Java可以通过JavaMail API模拟邮件系统,实现接收和解析邮件的功能,从而实现更多复杂的应用,比如自动化邮件处理、邮件通知等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值