邮箱接收邮件工具类
<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;
}
}