说明
基于imap实现邮件内容的读取
引入pom.xml文件
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
源码
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import javax.mail.*;
import javax.mail.internet.MimeUtility;
import javax.mail.search.FlagTerm;
import java.io.InputStream;
import java.util.Date;
import java.util.Objects;
import java.util.Properties;
/****
*
* 读取邮件工具
*****/
@Slf4j
public class EmailReaderUtil {
/**
* 读取邮件内容
*
* @param username 邮箱用户名
* @param password 邮箱密码
* @param host 邮箱服务器地址
* @param port 邮箱服务器端口
* @param ssl 是否开启SSL
* @return
*/
public static void getEmailContent(String username, String password, String host, String port, String ssl) {
Properties props = new Properties();
props.put("mail.store.protocol", "imap");
props.put("mail.imap.host", host);
props.put("mail.imap.port", port);
props.put("mail.imap.ssl.enable", ssl);
Session session;
Store store = null;
Folder folder = null;
try {
session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
store = session.getStore("imap");
store.connect();
folder = store.getFolder("INBOX");
if (!folder.exists()) {
log.error("INBOX文件夹不存在");
return;
}
folder.open(Folder.READ_WRITE);
//获取全部
//Message[] messages = folder.getMessages();
//获取未读邮件
Flags seenFlag = new Flags(Flags.Flag.SEEN);
FlagTerm unseenFlagTerm = new FlagTerm(seenFlag, false);
Message[] messages = folder.search(unseenFlagTerm);
for (Message message : messages) {
try {
if (message.getContentType().toLowerCase().contains("multipart")) {
Multipart multipart = (Multipart) message.getContent();
for (int i = 0; i < multipart.getCount(); i++) {
BodyPart bodyPart = multipart.getBodyPart(i);
if (Objects.isNull(bodyPart) || StringUtils.isBlank(bodyPart.getFileName()) || bodyPart.getDisposition() == null || !bodyPart.getDisposition().equalsIgnoreCase(Part.ATTACHMENT)) {
continue;
}
String fileName = MimeUtility.decodeText(bodyPart.getFileName());
//可以指定解析相应后缀的文件
if (!fileName.endsWith(".docx")) {
continue;
}
InputStream inputStream = bodyPart.getInputStream();
//todo 解析邮件附件内容
//邮件已读
message.setFlag(Flags.Flag.SEEN, true);
}
}else{
String content=message.getContent().toString();
//todo 解析邮件文本内容
//邮件已读
message.setFlag(Flags.Flag.SEEN, true);
}
} catch (Exception e) {
e.printStackTrace();
log.error("{}获取单个邮件异常,msg={}", username, e.getMessage(), e);
}
}
} catch (Exception e) {
e.printStackTrace();
log.error("{}获取邮件异常,msg={}", username, e.getMessage(), e);
} finally {
if (folder != null) {
try {
folder.close(false);
} catch (MessagingException e) {
e.printStackTrace();
}
}
if (store != null) {
try {
store.close();
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
}
}