当涉及到 Jakarta Mail 时,以下是一些基本知识点的总结,包括一些常见的类和方法。请注意,这只是一个基本的总结,而 Jakarta Mail 的使用可能涉及更多的细节和复杂性。
主题 | 描述 |
---|---|
连接和会话 | |
Session | 用于创建邮件会话的类。 |
Transport | 用于发送邮件的类。 |
Store | 用于连接到邮件服务器的类。 |
邮件基础 | |
Message | 代表邮件的抽象类,是邮件相关操作的核心。 |
MimeMessage | Message 的子类,用于表示 MIME 格式的邮件。 |
邮件夹 | |
Folder | 代表邮件文件夹的抽象类,提供对邮件的基本操作。 |
IMAPFolder | 用于 IMAP 协议的邮件文件夹。 |
POP3Folder | 用于 POP3 协议的邮件文件夹。 |
Flags 和标记 | |
Flags | 用于表示邮件的标记(flags),如已读、已删除等。 |
邮件内容和附件 | |
Multipart | 用于处理多部分邮件的类。 |
BodyPart | 代表邮件的一个部分,可以是文本、附件等。 |
地址和邮件头 | |
Address | 代表邮件地址的抽象类。 |
InternetAddress | Address 的子类,用于表示互联网邮件地址。 |
InternetHeaders | 用于表示邮件头的类。 |
处理邮件内容 | |
MimeBodyPart | BodyPart 的子类,用于表示 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("删除邮件时发生异常,请联系管理员!");
}