解决163邮箱第三方客户端使用imap协议连接失败的问题
-
现象
使用JavaMail连接失败报错内容如下:
Unsafe Login. Please contact kefu@188.com for help -
具体的内容看官方的描述
连接地址 -
附上正确的代码
package com.face.email.data;
/**
* 读邮件示例
*
* @author baixuezhi
* @date 2023/5/4
*/
import com.sun.mail.imap.IMAPStore;
import java.util.HashMap;
import java.util.Properties;
import javax.mail.*;
@Deprecated
public class ReadMailExample {
public static void main(String[] args) {
String host = "imap.163.com";
String username = "xiaobai@163.com";
String password = "***********";
// 获取邮件会话
Properties props = new Properties();
props.put("mail.store.protocol", "imaps");
props.put("mail.imaps.host", host);
props.put("mail.imaps.port", "993");
//Session session = Session.getDefaultInstance(props, null);
HashMap IAM = new HashMap();
//带上IMAP ID信息,由key和value组成,例如name,version,vendor,support-email等。
IAM.put("name","ename");
IAM.put("version","1.0.0");
IAM.put("vendor","eclient");
IAM.put("support-email","xiaobai@163.com");
Session session = Session.getInstance(props);
try {
// 获取邮箱
IMAPStore store = (IMAPStore) session.getStore("imaps");
store.connect(username, password);
store.id(IAM);
Folder inbox = store.getFolder("inbox");
inbox.open(Folder.READ_WRITE);
// 获取邮件列表
Message[] messages = inbox.getMessages();
// 遍历邮件列表并打印邮件信息
for (int i = 0; i < messages.length; i++) {
Message message = messages[i];
if (message.isSet(Flags.Flag.SEEN)) {
// 已读邮件
System.out.println("已读邮件:");
System.out.println("From: " + message.getFrom()[0]);
System.out.println("Subject: " + message.getSubject());
System.out.println("Sent Date: " + message.getSentDate());
System.out.println();
} else {
// 未读邮件
System.out.println("未读邮件:");
System.out.println("From: " + message.getFrom()[0]);
System.out.println("Subject: " + message.getSubject());
System.out.println("Sent Date: " + message.getSentDate());
System.out.println();
}
}
// 关闭邮箱
inbox.close(false);
store.close();
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
- 之所以使用imap协议不使用smtp协议是因为,imap协议可以判断邮件是否已读,但是imap协议只支持邮件读取不支持发送,所以想要发送邮件还是需要smtp协议