1.引入jar包
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>jakarta.mail</artifactId>
<version>1.6.5</version>
</dependency>
2.打开IMAP/SMTP服务获取授权码
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/fdbfd909794b28b3cf561413819fbd5a.png)
3.java程序
@Data
public class EmailEntity {
private String sentDate;
private String receiveDate;
private String subject;
private List<String> toName;
private List<String> toAddress;
private String fromAddress;
private String fromName;
private List<String> ccName;
private List<String> ccAddress;
private String content;
private List<String> replyName;
private List<String> replyAddress;
}
@Data
public class MailReceiver {
private String mailServerHost;
private String mailServerPort;
private String receiveEmailAddress;
}
public class ReceiveEmailUtil {
public List<EmailEntity> receiveEmail(MailReceiver mailReceiver, Date start, Date end,
HashMap<String, String> iam) {
Properties props = new Properties();
props.setProperty("mail.store.protocol", "imap");
props.setProperty("mail.imap.host", mailReceiver.getMailServerHost());
props.setProperty("mail.imap.port", mailReceiver.getMailServerPort());
props.setProperty("mail.imap.auth.login.disable", "true");
props.setProperty("mail.imap.ssl.enable", "true");
List<EmailEntity> res = null;
Session session = null;
IMAPStore store = null;
Folder folder = null;
Thread t = Thread.currentThread();
ClassLoader ccl = t.getContextClassLoader();
t.setContextClassLoader(Session.class.getClassLoader());
try {
session = Session.getInstance(props, new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(mailReceiver.getReceiveEmailAddress(),
mailReceiver.getReceiveEmailPassword());
}
});
store = (IMAPStore) session.getStore("imap");
store.connect(mailReceiver.getMailServerHost(),
mailReceiver.getReceiveEmailAddress(), mailReceiver.getReceiveEmailPassword());
store.id(iam);
folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
res = new ArrayList<>();
Message[] messages = getEmail(folder, start, end, res);
detailEmail(messages, res);
folder.close();
store.close();
} catch (MessagingException | IOException e) {
e.printStackTrace();
}finally {
t.setContextClassLoader(ccl);
}
return res;
}
private Message[] getEmail(Folder folder, Date start, Date end, List<EmailEntity> res) throws MessagingException {
Message[] messages;
int num = folder.getMessageCount();
if ((start == null) && (end == null)) {
messages = folder.getMessages(num, num);
} else {
int emailIndex = Math.max((num - 99), 1);
Message[] allMessages = folder.getMessages(emailIndex, num);
messages = Arrays.stream(allMessages).filter(m -> {
try {
return betweenDate(m, start, end);
} catch (MessagingException e) {
e.printStackTrace();
}
return false;
}).toArray(Message[]::new);
}
return messages;
}
private boolean betweenDate(Message message, Date start, Date end) throws MessagingException {
if (message.getReceivedDate() == null) {
return false;
}
return message.getReceivedDate().before(end) &&
message.getReceivedDate().after(start) ||
message.getReceivedDate().equals(start);
}
private void detailEmail(Message[] messages, List<EmailEntity> res) throws MessagingException, IOException {
for (Message e : messages) {
EmailEntity email = new EmailEntity();
if (e.getFrom() != null) {
InternetAddress sender = (InternetAddress) e.getFrom()[0];
email.setFromAddress(sender.getAddress());
email.setFromName(sender.getPersonal());
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String receiveDate = e.getReceivedDate() == null ? "null" : sdf.format(e.getReceivedDate());
email.setReceiveDate(receiveDate);
String sendDate = e.getSentDate() == null ? "null" : sdf.format(e.getSentDate());
email.setSentDate(sendDate);
email.setSubject(e.getSubject());
HashMap<String, List<String>> to = addressConvert(e.getRecipients(Message.RecipientType.TO));
email.setToAddress(to.get("address"));
email.setToName(to.get("name"));
HashMap<String, List<String>> cc = addressConvert(e.getRecipients(Message.RecipientType.CC));
email.setCcAddress(cc.get("address"));
email.setCcName(cc.get("name"));
HashMap<String, List<String>> re = addressConvert(e.getReplyTo());
email.setReplyAddress(re.get("address"));
email.setReplyName(re.get("name"));
email.setContent(getBody(e));
res.add(email);
}
}
private HashMap<String, List<String>> addressConvert(Address[] original) {
HashMap<String, List<String>> res = new HashMap<>();
if (original == null) {
res.put("name", null);
res.put("address", null);
return res;
}
List<String> name = new ArrayList<>();
List<String> address = new ArrayList<>();
Arrays.stream(original).forEach(t -> {
InternetAddress ter = (InternetAddress) t;
address.add(ter.getAddress());
name.add(ter.getPersonal());
});
res.put("name", name);
res.put("address", address);
return res;
}
private String getBody(Part part) throws MessagingException, IOException {
if (part.isMimeType("text/*")) {
return part.getContent().toString();
}
if (part.isMimeType("multipart/*")) {
Multipart multipart = (Multipart) part.getContent();
for (int i = 0; i < multipart.getCount(); i++) {
BodyPart bodyPart = multipart.getBodyPart(i);
String body = getBody(bodyPart);
if (!body.isEmpty()) {
return body;
}
}
}
return "";
}
public Date getStartTime() {
Calendar todayStart = Calendar.getInstance();
todayStart.set(Calendar.HOUR_OF_DAY, 0);
todayStart.set(Calendar.MINUTE, 0);
todayStart.set(Calendar.SECOND, 0);
todayStart.set(Calendar.MILLISECOND, 0);
return todayStart.getTime();
}
public Date tomorrow(Date today) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(today);
calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) + 1);
return calendar.getTime();
}
}
public class ReceQQmail {
ReceiveEmailUtil util = new ReceiveEmailUtil();
public String getSmsCode() throws Exception {
MailReceiver qqReceive = new MailReceiver();
qqReceive.setMailServerHost("imap.qq.com");
qqReceive.setMailServerPort("993");
qqReceive.setReceiveEmailAddress("xxxxxxxx@qq.com");
qqReceive.setReceiveEmailPassword("xxxxxxxxxxxxxxx");
HashMap<String, String> iam = new HashMap<>();
List<EmailEntity> emailEntities = util.receiveEmail(qqReceive, null, null, iam);
EmailEntity emailEntity = null;
if(emailEntities.size() > 0){
emailEntity = emailEntities.get(0);
}
String content = emailEntity.getContent();
return content ;
}
}