问题描述
因公司业务需求,需要用程序访问163邮箱,读取并发送邮件;测试阶段用的是我本人的邮箱,该邮箱注册时间在10年以上,开发测试一切正常;
开发完成,在用正式邮箱(最近注册)进行最终测试时,程序报了异常:
javax.mail.MessagingException: A3 NO EXAMINE Unsafe Login. Please contact kefu@188.com for help;
nested exception is:
com.sun.mail.iap.CommandFailedException: A3 NO EXAMINE Unsafe Login. Please contact kefu@188.com for help
at com.sun.mail.imap.IMAPFolder.open(IMAPFolder.java:1022)
at com.sun.mail.imap.IMAPFolder.open(IMAPFolder.java:950)
......
at sun.reflect.GeneratedMethodAccessor19696.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:283)
at
解决方案
经过一番搜索,找到了可行的解决方案,在调用调用open之前,添加如下代码:
Map<String, String> idMap = new HashMap<String, String>();
idMap.put("name", "***");// 这里是一个姓名,可以随便写
idMap.put("version", "7.26");
idMap.put("os", "windows");
idMap.put("os-version", "6.1");
idMap.put("vendor", "***");// 随便写
idMap.put("contact", "***");// 是一个邮箱
IMAPStore imapStore = (IMAPStore) store;
imapStore.id(idMap);
另外,我用的java.mail版本是“1.5.2”
官方给的解释是:
当您使用IMAP协议接收邮件时候,为了用户帐号信息安全,系统要求您的客户端表明相关“身份”信息才可以允许连接。
官方链接:imap连接提示Unsafe Login,被阻止的收信行为
不知道这个链接能存在多久,下面贴出网页内容:
imap连接提示Unsafe Login,被阻止的收信行为
当您使用IMAP协议接收邮件时候,为了用户帐号信息安全,系统要求您的客户端表明相关“身份”信息才可以允许连接。
否则将会返回如下报错:Unsafe Login. Please contact kefu@188.com for help
同时邮箱内将收到相关提醒邮件,如下图所示:
![在这里插入图片描述](https://img-blog.csdnimg.cn/ee63c80875e5454e818c8eee43c956be.png#pic_center)
常用客户端例如:Outlook,foxmail,邮箱大师不会出现该类问题。
如果您所使用的客户端因为该限制导致无法接收。请您联系软件开发人员更新相关源代码,在连接服务器时带上IMAP ID信息,相关JAVA示例代码如下:(其他语言或框架请联系对应开发者处理,网易仅提供JAVA语言示例代码。)
********************代码块区域开始********************
Properties props = new Properties();
props.setProperty("mail.store.protocol", "imap");
props.setProperty("mail.imap.host", "imap.163.com");
props.setProperty("mail.imap.port", "143");
HashMap IAM = new HashMap();
//带上IMAP ID信息,由key和value组成,例如name,version,vendor,support-email等。
IAM.put("name","myname");
IAM.put("version","1.0.0");
IAM.put("vendor","myclient");
IAM.put("support-email","testmail@test.com");
Session session = Session.getInstance(props);
IMAPStore store = (IMAPStore) session.getStore("imap");
//下方替换对应帐号和授权码
store.connect("testmail@163.com", "password");
store.id(IAM);
********************代码块区域结束********************
相关规范链接请参考:
https://www.ietf.org/rfc/rfc2971.txt
https://javaee.github.io/javamail/docs/api/index.html?com/sun/mail/imap/IMAPStore.html
(请使用JavaMail 1.5.1及更新的版本)