当涉及到 Jakarta Mail 时,以下是一些基本知识点的总结,包括一些常见的类和方法。请注意,这只是一个基本的总结,而 Jakarta Mail 的使用可能涉及更多的细节和复杂性。

主题描述
连接和会话
Session用于创建邮件会话的类。
Transport用于发送邮件的类。
Store用于连接到邮件服务器的类。
邮件基础
Message代表邮件的抽象类,是邮件相关操作的核心。
MimeMessageMessage 的子类,用于表示 MIME 格式的邮件。
邮件夹
Folder代表邮件文件夹的抽象类,提供对邮件的基本操作。
IMAPFolder用于 IMAP 协议的邮件文件夹。
POP3Folder用于 POP3 协议的邮件文件夹。
Flags 和标记
Flags用于表示邮件的标记(flags),如已读、已删除等。
邮件内容和附件
Multipart用于处理多部分邮件的类。
BodyPart代表邮件的一个部分,可以是文本、附件等。
地址和邮件头
Address代表邮件地址的抽象类。
InternetAddressAddress 的子类,用于表示互联网邮件地址。
InternetHeaders用于表示邮件头的类。
处理邮件内容
MimeBodyPartBodyPart 的子类,用于表示 MIME 邮件的一部分。
处理附件
DataSource用于表示数据源的接口,可用于处理邮件附件。
错误处理
MessagingException用于表示邮件操作中的异常。

这个表格覆盖了 Jakarta Mail 中一些基本的类和概念。请注意,实际的使用可能涉及更多的细节和更复杂的场景,具体取决于您的具体需求和邮件服务器的要求。阅读 Jakarta Mail 的官方文档也是深入了解的好途径。

举例实例代码,比如查看收件箱的关键代码:

    try {
                    Properties props = configService.config(username,password);
                    Session session = Session.getDefaultInstance(props, null);
                    Store store = session.getStore(MailEnum.PROTOCOL.getLabel());
                    store.connect(configService.getImapHost(), username, password);
                    // 打开收件箱
                    Folder inbox = store.getFolder(MailEnum.FOLDER_TYPE_INBOX.getLabel());
                    inbox.open(Folder.READ_ONLY);
                    // 获取收件箱中的所有邮件,并按照日期降序排序
                    Message[] messages = inbox.getMessages();
                    List<Message> messageList = Arrays.asList(messages);
                    Collections.sort(messageList, (m1, m2) -> {
                        try {
                            return m2.getSentDate().compareTo(m1.getSentDate());
                        } catch (MessagingException e) {
                            e.printStackTrace();
                            return 0;
                        }
                    });
    
                    // 获取邮件列表
                    List<Message> currentPageMessages;
                    if(StringUtils.isNotEmpty(pageNumber) && StringUtils.isNotBlank(pageNumber) && StringUtils.isNotEmpty(pageSize)){
                        // 获取邮件数量
                        int totalMessages = inbox.getMessageCount();
                        // 根据每页邮件数量和页数计算起始邮件和结束邮件的索引
                        int startIndex = (Integer.valueOf(pageNumber) - 1) * Integer.valueOf(pageSize);
                        int endIndex = Math.min(startIndex + Integer.valueOf(pageSize), totalMessages);
                        // 获取当前页的邮件列表
                        currentPageMessages = messageList.subList(startIndex, endIndex);
                    }else{
                        currentPageMessages = messageList;
                    }
                    // 构建 JSON 数组来存储邮件
                    ArrayList<MailObject> mailObjectArrayList = new ArrayList<>();
                    for (int i = 0; i < currentPageMessages.size();i++){
                        Message message = currentPageMessages.get(i);
    
                        // 构建 JSON 对象来存储邮件信息
                        MailObject mailObject = new MailObject();
                        mailObject.setEid(String.valueOf(message.getMessageNumber()));
                        mailObject.setSubject(message.getSubject());
                        mailObject.setFrom(String.valueOf(message.getFrom()[0]));
                        mailObject.setTo(message.getAllRecipients());
                        mailObject.setDate(message.getSentDate().toString());
                        mailObject.setBody(message.getContent().toString());
                        // 将邮件信息添加到数组中
                        mailObjectArrayList.add(mailObject);
                    }
                    // 关闭收件箱和存储
                    inbox.close(false);
                    store.close();
                    // 返回收件箱列表
                    return JsonResult.success(mailObjectArrayList);
                } catch (Exception e) {
                    e.printStackTrace();
                    // 处理异常,返回错误消息
                    return JsonResult.error("获取收件箱列表发生异常,请联系管理员");
                }

保存带附件的邮件:

    try {
                    Properties props = configService.config(username, password);
                    Session session = Session.getDefaultInstance(props, null);
                    Store store = session.getStore(MailEnum.PROTOCOL.getLabel());
                    store.connect(configService.getImapHost(), username, password);
                    // 打开草稿箱
                    Folder draftsFolder = store.getFolder(MailEnum.FOLDER_TYPE_DRAFTS.getLabel());
                    draftsFolder.open(Folder.READ_WRITE);
    
                    // 创建一封新的 MimeMessage
                    MimeMessage draftMessage = new MimeMessage(session);
                    draftMessage.setFrom(new InternetAddress(from));
                    draftMessage.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
                    draftMessage.setSubject(subject);
    
                    if(StringUtils.isNotEmpty(emailId) && StringUtils.isNotBlank(emailId)){
                        // 根据邮件标识符获取指定邮件
                        Message message =draftsFolder.getMessage(Integer.valueOf(emailId));
                        // 删除原始草稿邮件
                        message.setFlag(Flags.Flag.DELETED, true);
                        // 执行 expunge 操作可能会有一些性能开销,并且标记为删除的邮件将被永久删除
                        draftsFolder.expunge();
                        // 修改时设置为已读
                        draftMessage.setFlag(Flags.Flag.SEEN,true);
                    }
    
                    //邮件内容部分---文本内容
                    MimeBodyPart textPart  = new MimeBodyPart(); //邮件中的文字部分
                    textPart.setText(content);
                    // 创建包含附件的Multipart对象
                    MimeMultipart multipart = new MimeMultipart();
    
                    for(MultipartFile file:files){
                        // 将文本内容部分添加到Multipart对象中
                        multipart.addBodyPart(textPart);
                        // 创建附件部分
                        MimeBodyPart attachmentPart = new MimeBodyPart();
                        // 将MultipartFile文件对象转换为DataSource对象
                        DataSource source = new FileDataSource(CommonUtils.convertMultipartFileToFile(file));
                        // 设置附件数据处理器
                        attachmentPart.setDataHandler(new DataHandler(source));
                        // 设置附件文件名
                        attachmentPart.setFileName(file.getOriginalFilename());
                        // 将附件部分添加到Multipart对象中
                        multipart.addBodyPart(attachmentPart);
                    }
                    // 将Multipart对象设置为邮件的内容
                    draftMessage.setContent(multipart);
                    // 保存草稿
                    draftsFolder.appendMessages(new Message[]{draftMessage});
    
                    // 关闭连接
                    draftsFolder.close(true);
                    store.close();
                    return JsonResult.success(true);
                }catch(Exception e){
                    e.printStackTrace();
                    // 处理异常,返回错误消息
                    return JsonResult.error("保存到草稿箱发生异常,请联系管理员");
                }

删除邮件中的附件:

    try {
                    Properties props = configService.config(username, password);
                    Session session = Session.getDefaultInstance(props, null);
                    Store store = session.getStore(MailEnum.PROTOCOL.getLabel());
                    store.connect(configService.getImapHost(), username, password);
                    // 打开草稿箱
                    Folder draftsFolder = store.getFolder(MailEnum.FOLDER_TYPE_DRAFTS.getLabel());
                    draftsFolder.open(Folder.READ_WRITE);
    
                    // 根据邮件标识符获取指定邮件
                    Message message =draftsFolder.getMessage(Integer.valueOf(emailId));
                    MimeMessage mimeMessage = new MimeMessage((MimeMessage) message);
    
                    // 将邮件转换为 Multipart 对象
                    Multipart multipart = (Multipart) mimeMessage.getContent();
                    // 遍历每个邮件部分
                    for (int i = 0; i < multipart.getCount(); i++) {
                        BodyPart bodyPart = multipart.getBodyPart(i);
                        // 检查邮件部分是否是附件
                        if (Part.ATTACHMENT.equalsIgnoreCase(bodyPart.getDisposition())) {
                            if(fileName.equals(bodyPart.getFileName())){
                                //删除附件
                                multipart.removeBodyPart(bodyPart);
                                LOGGER.info("delete att success.");
                                break;
                            }
                        }
                    }
                    // 保存修改后的邮件内容
                    mimeMessage.saveChanges();;
                    // 删除原始草稿邮件
                    message.setFlag(Flags.Flag.DELETED, true);
                    // 执行 expunge 操作可能会有一些性能开销,并且标记为删除的邮件将被永久删除
                    draftsFolder.expunge();
                    // 保存草稿
                    draftsFolder.appendMessages(new Message[]{mimeMessage});
                    // 关闭连接
                    draftsFolder.close(true);
                    store.close();
                    return JsonResult.success(true);
                }catch(Exception e){
                    e.printStackTrace();
                    // 处理异常,返回错误消息
                    return JsonResult.error("删除草稿箱中附件发生异常,请联系管理员");
                }

删除某封信:

    try {
                // 配置邮箱服务
                Properties props = configService.config(username, password);
                Session session = Session.getDefaultInstance(props, null);
                Store store = session.getStore(MailEnum.PROTOCOL.getLabel());
                store.connect(configService.getImapHost(), username, password);
                Folder draftsFolder = null;
                Folder deleteFolder = store.getFolder("已删除");
                deleteFolder.open(Folder.READ_WRITE);
    
                // 判断邮件是收件箱、发件箱、草稿箱中的邮件?
                if(emailType.equals(MailEnum.FOLDER_TYPE_DRAFTS.getLabel())){
                    draftsFolder = store.getFolder(MailEnum.FOLDER_TYPE_DRAFTS.getLabel());
                }else if(emailType.equals(MailEnum.FOLDER_TYPE_INBOX.getLabel())) {
                    draftsFolder = store.getFolder(MailEnum.FOLDER_TYPE_INBOX.getLabel());
                }else if(emailType.equals(MailEnum.FOLDER_TYPE_SENT.getLabel())) {
                    draftsFolder = store.getFolder(MailEnum.FOLDER_TYPE_SENT.getLabel());
                }else{
                    return JsonResult.error("对不起,邮件类型参数不合法,请检查后重试!");
                }
    
                // 打开对应的邮箱
                draftsFolder.open(Folder.READ_WRITE);
                if(emailId!=null && emailId.length>0){
                    for(String  id:emailId){
                        // 根据邮件标识符获取指定邮件
                        Message message =draftsFolder.getMessage(Integer.valueOf(id));
                        // 将该邮件置为删除邮件
                        message.setFlag(Flags.Flag.DELETED, true);
                        // 将已删除邮件拷到已删除文件夹下
                        draftsFolder.copyMessages(new Message[]{message}, deleteFolder);
                    }
                }else{
                    return JsonResult.error("请选择要删除哪一封邮件!");
                }
                // 关闭连接
                draftsFolder.close(true);
                store.close();
    
            } catch (MessagingException e) {
                e.printStackTrace();
                return JsonResult.error("删除邮件时发生异常,请联系管理员!");
            }