SpringBootjavax获取邮件内容,删除邮件、根据时间段筛选邮件,筛选时间段+未读邮件
导读
  最近负责整个消息⽹关微服务,短信已经实现退订功能(),客户那要求邮件也要实现邮件退订功能。因为邮件不能像短信⼀样可以实时监听,只能写个定时任务,设计2套⽅案。
  ⽅案⼀:操作完的邮件,将读取到的内容,记录到数据库中,并将邮件删掉
  ⽅案⼆:根据时间段,⽐如只获取24⼩时内未读的邮件
添加依赖
<dependency>
<groupId>org.apachemons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.11</version>
</dependency>
<!--javax邮件依赖-->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>1.5.5</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.5.5</version>
</dependency>
⽅案⼀(pop3)
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
import java.io.*;
SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
public class StoreMail {
final static String USER = "543210188@qq"; // ⽤户名
final static String PASSWORD = "xxxxx"; // 密码
public final static String MAIL_SERVER_HOST = "smtp.qq"; // 邮箱服务器
public static void main(String[] args) throws Exception {
// 创建⼀个有具体连接信息的Properties对象
Properties prop = new Properties();
prop.setProperty("mail.debug", "true");
prop.setProperty("mail.store.protocol", "pop3");
prop.setProperty("mail.pop3.host", MAIL_SERVER_HOST);
// 1、创建session
Session session = Instance(prop);
/
/ 2、通过session得到Store对象
Store store = Store();
// 3、连上邮件服务器
// 4、获得邮箱内的邮件夹
Folder folder = Folder("inbox");
//只读
//        folder.open(Folder.READ_ONLY);
//读写
folder.open(Folder.READ_WRITE);
// 获得邮件夹Folder内的所有邮件Message对象
Message[] messages = Messages();
// 解析所有邮件
for (int i = 0, count = messages.length; i < count; i++) {
MimeMessage msg = (MimeMessage) messages[i];
System.out.println("------------------解析第" + MessageNumber() + "封邮件-------------------- ");
System.out.println("主题: " + getSubject(msg));
System.out.println("发件⼈: " + getFrom(msg));
System.out.println("收件⼈:" + getReceiveAddress(msg, null));
System.out.println("发送时间:" + getSentDate(msg, null));
System.out.println("是否已读:" + isSeen(msg));
System.out.println("邮件优先级:" + getPriority(msg));
System.out.println("是否需要回执:" + isReplySign(msg));
System.out.println("邮件⼤⼩:" + Size() * 1024 + "kb");
boolean isContainerAttachment = isContainAttachment(msg);
System.out.println("是否包含附件:" + isContainerAttachment);
if (isContainerAttachment) {
saveAttachment(msg, "f:\\mailTest\\"+Subject() + "_"+i+"_"); //保存附件
}
if (i == 2) {
//删除邮件
msg.setFlag(Flags.Flag.DELETED, true);
System.out.println("删除");
}
StringBuffer content = new StringBuffer(30);
getMailTextContent(msg, content);
System.out.println("邮件正⽂:" + content);
System.out.println("------------------第" + MessageNumber() + "封邮件解析结束-------------------- ");
System.out.println();
}
// 5、关闭
folder.close(true);
store.close();
}
/
**
* 删除邮件
*
* @param messages 要解析的邮件列表
*/
public static void messages) throws MessagingException, IOException {
if (messages == null || messages.length < 1)
throw new MessagingException("未到要解析的邮件!");
// 解析所有邮件
for (int i = 0, count = messages.length; i < count; i++) {
/**
*  邮件删除
*/
Message message = messages[i];
String subject = Subject();
// set the DELETE flag to true
message.setFlag(Flags.Flag.DELETED, true);
System.out.println("Marked DELETE for message: " + subject);
}
}
/**
* 获得邮件主题
*
* @param msg 邮件内容
* @return 解码后的邮件主题
*/
public static String getSubject(MimeMessage msg) throws UnsupportedEncodingException, MessagingException {        return MimeUtility.Subject());
}
/**
* 获得邮件发件⼈
*
* @param msg 邮件内容
* @return 姓名 <Email地址>
* @throws MessagingException
* @throws UnsupportedEncodingException
*/
public static String getFrom(MimeMessage msg) throws MessagingException, UnsupportedEncodingException {        String from = "";
Address[] froms = From();
if (froms.length < 1)
throw new MessagingException("没有发件⼈!");
InternetAddress address = (InternetAddress) froms[0];
String person = Personal();
if (person != null) {
person = MimeUtility.decodeText(person) + " ";
} else {
person = "";
}
from = person + "<" + Address() + ">";
return from;
}
/**
* 根据收件⼈类型,获取邮件收件⼈、抄送和密送地址。如果收件⼈类型为空,则获得所有的收件⼈
* <p>Message.RecipientType.TO  收件⼈</p>
* <p>Message.RecipientType.CC  抄送</p>
* <p>Message.RecipientType.BCC 密送</p>
*
* @param msg  邮件内容
* @param type 收件⼈类型
* @return 收件⼈1 <;邮件地址1>, 收件⼈2 <;邮件地址2>, ...
* @throws MessagingException
*/
public static String getReceiveAddress(MimeMessage msg, Message.RecipientType type) throws MessagingException {        StringBuffer receiveAddress = new StringBuffer();
Address[] addresss = null;
if (type == null) {
addresss = AllRecipients();
} else {
addresss = Recipients(type);
}
if (addresss == null || addresss.length < 1)
throw new MessagingException("没有收件⼈!");
for (Address address : addresss) {
InternetAddress internetAddress = (InternetAddress) address;
receiveAddress.UnicodeString()).append(",");
}
receiveAddress.deleteCharAt(receiveAddress.length() - 1); //删除最后⼀个逗号
String();
}
/
**
* 获得邮件发送时间
*
* @param msg 邮件内容
* @return yyyy年mm⽉dd⽇星期X HH:mm
* @throws MessagingException
*/
public static String getSentDate(MimeMessage msg, String pattern) throws MessagingException {
Date receivedDate = SentDate();
if (receivedDate == null)
return "";
if (pattern == null || "".equals(pattern))
pattern = "yyyy年MM⽉dd⽇ E HH:mm ";
return new SimpleDateFormat(pattern).format(receivedDate);
}
/**
* 判断邮件中是否包含附件
*
* @return 邮件中存在附件返回true,不存在返回false
* @throws MessagingException
* @throws IOException
*/
session下载
public static boolean isContainAttachment(Part part) throws MessagingException, IOException {
boolean flag = false;
if (part.isMimeType("multipart/*")) {
MimeMultipart multipart = (MimeMultipart) Content();
int partCount = Count();
for (int i = 0; i < partCount; i++) {
BodyPart bodyPart = BodyPart(i);
String disp = Disposition();
if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) {
flag = true;
} else if (bodyPart.isMimeType("multipart/*")) {
flag = isContainAttachment(bodyPart);
} else {
String contentType = ContentType();
if (contentType.indexOf("application") != -1) {
flag = true;
}
if (contentType.indexOf("name") != -1) {
flag = true;
}
}
if (flag) break;
}
} else if (part.isMimeType("message/rfc822")) {
flag = isContainAttachment((Part) Content());
}
return flag;
}
/**
* 判断邮件是否已读
*
* @param msg 邮件内容
* @return 如果邮件已读返回true, 否则返回false
* @throws MessagingException
*/
public static boolean isSeen(MimeMessage msg) throws MessagingException {
Flags().contains(Flags.Flag.SEEN);
}
/**
* 判断邮件是否需要阅读回执
*
* @param msg 邮件内容
* @return 需要回执返回true, 否则返回false
* @throws MessagingException
*/
public static boolean isReplySign(MimeMessage msg) throws MessagingException {
boolean replySign = false;
String[] headers = Header("Disposition-Notification-To");
if (headers != null)
replySign = true;
return replySign;
}
/**
* 获得邮件的优先级
*
* @param msg 邮件内容
* @return 1(High):紧急  3:普通(Normal)  5:低(Low)
* @throws MessagingException
*/
public static String getPriority(MimeMessage msg) throws MessagingException {
String priority = "普通";
String[] headers = Header("X-Priority");
if (headers != null) {
String headerPriority = headers[0];
if (headerPriority.indexOf("1") != -1 || headerPriority.indexOf("High") != -1)
priority = "紧急";
else if (headerPriority.indexOf("5") != -1 || headerPriority.indexOf("Low") != -1)
priority = "低";
else
priority = "普通";
}
return priority;
}
/**
* 获得邮件⽂本内容
*
* @param part    邮件体
* @param content 存储邮件⽂本内容的字符串
* @throws MessagingException
* @throws IOException
*/
public static void getMailTextContent(Part part, StringBuffer content) throws MessagingException, IOException {
//如果是⽂本类型的附件,通过getContent⽅法可以取到⽂本内容,但这不是我们需要的结果,所以在这⾥要做判断
boolean isContainTextAttach = ContentType().indexOf("name") > 0;
if (part.isMimeType("text/*") && !isContainTextAttach) {
content.Content().toString());
} else if (part.isMimeType("message/rfc822")) {
getMailTextContent((Part) Content(), content);
} else if (part.isMimeType("multipart/*")) {
Multipart multipart = (Multipart) Content();
int partCount = Count();
for (int i = 0; i < partCount; i++) {
BodyPart bodyPart = BodyPart(i);
getMailTextContent(bodyPart, content);
}
}
}
/**
* 保存附件
*
* @param part    邮件中多个组合体中的其中⼀个组合体
* @param destDir 附件保存⽬录
* @throws UnsupportedEncodingException
* @throws MessagingException
* @throws FileNotFoundException
* @throws IOException
*/
public static void saveAttachment(Part part, String destDir) throws UnsupportedEncodingException, MessagingException,            FileNotFoundException, IOException {
if (part.isMimeType("multipart/*")) {
Multipart multipart = (Multipart) Content();    //复杂体邮件
//复杂体邮件包含多个邮件体
int partCount = Count();
for (int i = 0; i < partCount; i++) {
//获得复杂体邮件中其中⼀个邮件体
BodyPart bodyPart = BodyPart(i);
//某⼀个邮件体也有可能是由多个邮件体组成的复杂体
String disp = Disposition();
if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) {
InputStream is = InputStream();
saveFile(is, destDir, FileName()));
} else if (bodyPart.isMimeType("multipart/*")) {
saveAttachment(bodyPart, destDir);
} else {
String contentType = ContentType();
if (contentType.indexOf("name") != -1 || contentType.indexOf("application") != -1) {
InputStream(), destDir, FileName()));
}
}
}
} else if (part.isMimeType("message/rfc822")) {
saveAttachment((Part) Content(), destDir);
}
}
/**
* 读取输⼊流中的数据保存⾄指定⽬录
*
* @param is      输⼊流
* @param fileName ⽂件名
* @param destDir  ⽂件存储⽬录
* @throws FileNotFoundException
* @throws IOException
*/
private static void saveFile(InputStream is, String destDir, String fileName)
throws FileNotFoundException, IOException {
BufferedInputStream bis = new BufferedInputStream(is);
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(new File(destDir + fileName)));
int len = -1;
while ((len = ad()) != -1) {
bos.write(len);
bos.flush();
}
bos.close();
bis.close();
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。