用JavaMail的imap协议连接邮箱并收取邮件,代码如下:
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.search.SubjectTerm;
import org.springframework.stereotype.Service;
import java.util.Properties;
@Service
public class EmailService {
public void searchEmailsBySubject(String subjectPrefix) {
// 邮箱配置信息
String host = "your_imap_server"; // 更换为你的 IMAP 服务器地址
String username = "[email protected]";
String password = "your_email_password";
Properties properties = new Properties();
properties.put("mail.store.protocol", "imaps");
properties.put("mail.imaps.host", host);
properties.put("mail.imaps.port", "993");
properties.put("mail.imaps.starttls.enable", "true");
// 创建会话
Session session = Session.getInstance(properties);
try {
// 连接到邮箱
Store store = session.getStore("imaps");
store.connect(host, username, password);
// 获取收件箱
Folder inbox = store.getFolder("INBOX");
inbox.open(Folder.READ_ONLY);
// 设置搜索条件 - 根据邮件标题搜索
SearchTerm subjectTerm = new SubjectTerm(subjectPrefix);
// 执行搜索
Message[] messages = inbox.search(subjectTerm);
// 处理搜索到的邮件
for (Message message : messages) {
System.out.println("Subject: " + message.getSubject());
System.out.println("From: " + InternetAddress.toString(message.getFrom()));
System.out.println("To: " + InternetAddress.toString(message.getRecipients(Message.RecipientType.TO)));
System.out.println("----------------------------------------");
}
// 关闭连接
inbox.close(false);
store.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
以上代码在有些电脑能运行,有些电脑上报错如下:
javax.mail.MessagingException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate);
nested exception is:
javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:695)
at javax.mail.Service.connect(Service.java:345)
at javax.mail.Service.connect(Service.java:226)
at com.terrynow.test.Test2.main(Test2.java:46)
Caused by: javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
at java.base/sun.security.ssl.HandshakeContext.<init>(HandshakeContext.java:172)
at java.base/sun.security.ssl.ClientHandshakeContext.<init>(ClientHandshakeContext.java:103)
at java.base/sun.security.ssl.TransportContext.kickstart(TransportContext.java:247)
at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:448)
at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:426)
at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:532)
at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:337)
at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:229)
at com.sun.mail.iap.Protocol.<init>(Protocol.java:116)
at com.sun.mail.imap.protocol.IMAPProtocol.<init>(IMAPProtocol.java:121)
at com.sun.mail.imap.IMAPStore.newIMAPProtocol(IMAPStore.java:710)
at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:659)
... 3 more
经查,这个错误通常是因为邮件服务器使用的加密协议与 Java 程序的默认配置不兼容所导致的,手动设置 SSL/TLS 协议的属性,便可以解决,代码如下:
Properties properties = new Properties();
properties.put("mail.store.protocol", "imaps");
properties.put("mail.imaps.host", host);
properties.put("mail.imaps.port", "993");
properties.put("mail.imaps.starttls.enable", "true");
properties.put("mail.imaps.ssl.protocols", "TLSv1.2"); // 指定使用 TLSv1.2 协议
// 创建会话
Session session = Session.getInstance(properties);
// 以下代码省略
文章评论