spring boot 中使用 IMAP协议读取邮件
1.邮箱授权
QQ邮箱授权,打开 “设置” 切换到 “账户” 找到下图中设置,开启 “POP3/SMTP服务” 和 “IMAP/SMTP服务”,开启后获取的授权码记得保存后续会用到
2.导入maven 依赖
<!-- 邮件email -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
3.读取邮件(IMAP协议对应邮箱端口 993),POP3协议与IMAP协议授权码不同
public class ImapMail {
public static void main(String[] args) throws Exception {
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";//ssl加密
// 定义连接imap服务器的属性信息
String port = "993";
String imapServer = "imap.qq.com";
String protocol = "imap";
//有些参数可能不需要
Properties props = new Properties();
props.setProperty("mail.imap.socketFactory.class", SSL_FACTORY);
props.setProperty("mail.imap.socketFactory.fallback", "false");
props.setProperty("mail.transport.protocol", protocol); // 使用的协议
props.setProperty("mail.imap.port", port);
props.setProperty("mail.imap.socketFactory.port", port);
//创建会话
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("邮箱账号","授权码");
}
});
//存储对象
Store store = session.getStore("imap");
//连接
store.connect("imap.qq.com",993,"邮箱账号","授权码");
Folder folder = null;
try {
// 获得收件箱
folder = store.getFolder("INBOX");
// 以读写模式打开收件箱
folder.open(Folder.READ_WRITE);
//false 表示未读
FlagTerm flagTerm = new FlagTerm(new Flags(Flags.Flag.SEEN),false);
//获得收件箱的邮件列表
Message[] messages = folder.search(flagTerm);
// 打印不同状态的邮件数量
System.out.println("收件箱中共" + messages.length + "封邮件!");
System.out.println("收件箱中共" + folder.getUnreadMessageCount() + "封未读邮件!");
System.out.println("收件箱中共" + folder.getNewMessageCount() + "封新邮件!");
System.out.println("收件箱中共" + folder.getDeletedMessageCount() + "封已删除邮件!");
System.out.println("------------------------开始解析邮件----------------------------------");
for (int i = 0; i < messages.length; i++) {
System.out.println("消息:"+messages[i].getSubject());
String from = MimeUtility.decodeText(messages[i].getFrom()[0].toString());
InternetAddress internetAddress = new InternetAddress(from);
System.out.println("发件人:" + internetAddress.getPersonal() + '(' + internetAddress.getAddress() + ')');
}
} catch (NoSuchProviderException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
} finally {
try {
if (folder != null) {
folder.close(false);
}
if (store != null) {
store.close();
}
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
}