java mail收邮件

该博客介绍了如何使用Java的IMAP协议来实现邮件的接收和处理。通过引入javax.mail-api和com.sun.mail的依赖,创建了一个MailUtil工具类,包含获取邮件服务器连接、搜索邮件、解析邮件内容和附件等功能。示例代码展示了如何根据不同的条件(如主题、发送人、时间范围等)来拉取邮件。
摘要由CSDN通过智能技术生成
邮箱接收邮件工具类
<javax.mail-api.version>1.6.2</javax.mail-api.version>
<!-- https://mvnrepository.com/artifact/javax.mail/javax.mail-api -->
<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>javax.mail-api</artifactId>
    <version>${javax.mail-api.version}</version>
</dependency>
<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>${javax.mail-api.version}</version>
</dependency>
package com.ciics.zyf.user.utils;

import cn.hutool.core.util.StrUtil;
import com.sun.mail.imap.IMAPStore;
import lombok.Data;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeUtility;
import javax.mail.search.*;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Array;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

/**
 * @author cxy
 * @date 2021/4/29 14:17
 */
@Slf4j
public class MailUtil {

    public enum ProtocolEnum{
        imap;
    }

    @Data
    public static class MailData{
        private String from;
        private String to;
        private String subject;
        private Date sentDate;
        private Date receivedDate;
        private Integer messageNumber;
        private String content;
        private byte[] attachment;
    }

    /**
     *
     * @param host 邮箱服务器host
     * @param port 邮箱服务器端口
     * @param username 邮箱用户名
     * @param pwd 邮箱密码(需要客户端专用密码,非登录密码)
     * @param protocolEnum 邮箱协议
     * @param subject 拉取条件-主题
     * @param sender 拉取条件-发送人
     * @param readFlag 拉取条件-是否已读
     * @param begin 拉取条件-开始时间
     * @param end 拉取条件-结束时间
     * @return
     */
    public static List<MailData> pullMessage(String host,int port,String username,String pwd,ProtocolEnum protocolEnum,String subject, String sender,Boolean readFlag,Date begin,Date end) throws Exception {
        Properties props = new Properties();
        props.setProperty("mail.store.protocol", protocolEnum.toString());
        props.setProperty("mail.imap.host", host);
        props.setProperty("mail.imap.port", String.valueOf(port));
        // 获取连接
        Session session = Session.getInstance(props);
        session.setDebug(true);

        Store store =  session.getStore(protocolEnum.toString());
        //下方替换对应帐号和授权码
        store.connect(username, pwd);
        Folder folder = store.getFolder("INBOX");
        //拉取后改为已读
        folder.open(Folder.READ_WRITE);
        ArrayList<SearchTerm> searchTerms = new ArrayList<>();
        //根据条件拉取
        if (null!=begin) {
            SearchTerm comparisonTermGe = new SentDateTerm(ComparisonTerm.GE, begin);
            searchTerms.add(comparisonTermGe);
        }
        if (null!=end) {
            SearchTerm comparisonTermLe = new SentDateTerm(ComparisonTerm.LE, end);
            searchTerms.add(comparisonTermLe);
        }
        if (null!=sender&&!"".equals(sender)) {
            FromTerm fromTerm = new FromTerm(InternetAddress.parse(sender)[0]);
            searchTerms.add(fromTerm);
        }
        if (null!=sender&&!"".equals(subject)) {
            SubjectTerm subjectTerm = new SubjectTerm(subject);
            searchTerms.add(subjectTerm);
        }
        if (null!=readFlag) {
            FlagTerm ft = new FlagTerm(new Flags(Flags.Flag.SEEN), readFlag);
            searchTerms.add(ft);
        }
        Message[] messages = null;
        if (CollectionUtils.isNotEmpty(searchTerms)) {
//            SearchTerm searchTerm = new SearchTerm() {
//                @SneakyThrows
//                @Override
//                public boolean match(Message message) {
//                    return message.getSubject().equals(subject);
//                }
//            };
            AndTerm andTerm = new AndTerm(searchTerms.toArray(new SearchTerm[searchTerms.size()]));
            messages = folder.search(andTerm);
        }else {
            messages = folder.getMessages();
        }
        if (null==messages||messages.length==0){
            return null;
        }
        ArrayList<MailData> mailDatas = new ArrayList<>();
        Arrays.stream(messages).forEach(msg -> {
            try {
                MailData mailData = new MailData();
                mailData.setFrom(genFrom(msg));
                mailData.setTo(parseAddress(getMailAddress(msg,Message.RecipientType.TO)));
                mailData.setMessageNumber(msg.getMessageNumber());
                mailData.setSubject(msg.getSubject());
                mailData.setReceivedDate(msg.getReceivedDate());
                mailData.setSentDate(msg.getSentDate());
                System.out.println(msg.getContentType());
                if (msg.isMimeType("text/plain")) {
                    mailData.setContent((String) msg.getContent());
                }
                mailDatas.add(mailData);
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
        return mailDatas;
    }

    public static String genFrom(Message mimeMessage) {
        String from = null;
        try {
            InternetAddress address[] = (InternetAddress[]) mimeMessage.getFrom();
            from = address[0].getAddress();
            if (from == null) {
                from = "";
                log.warn("发送人邮箱地址为空!");
            }
        } catch (MessagingException e) {
            e.printStackTrace();
        }
        return from;
    }

    public static String parseAddress(String personaddress) {
        if (StringUtils.isEmpty(personaddress)) {
            return "";
        }
        String regex = ".*<(.*)>.*";
        Pattern p = Pattern.compile(regex);
        List<String> list = new ArrayList<String>();
        for (String pa : personaddress.split(";")) {
            Matcher matcher = p.matcher(pa);
            if (matcher.matches()) {
                String addr = matcher.group(1);
                list.add(addr);
            }
        }
        return StringUtils.join(list.toArray(new String[0]), ";");
    }

    public static String getMailAddress(Message message, Message.RecipientType type) {
        try {
            InternetAddress[] address = (InternetAddress[]) message.getRecipients(type);
            if (address != null) {
                String[] addrs = new String[address.length];
                int i = 0;
                for (InternetAddress addr : address) {
                    String emailAddr = MimeUtility.decodeText(addr.getAddress());
                    String personal = MimeUtility.decodeText(addr.getPersonal());
                    addrs[i++] = personal + "<" + emailAddr + ">";
                }
                String mailAddr = StringUtils.join(addrs, ",");
                return mailAddr;
            }
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值