【SpringBoot】A3 NO SELECT Unsafe Login. Please contact [email protected] for help异常处理

场景:

 

       在通过java代码读取邮件的方式有pop3和imap两种方式,但是在使用imap时,会报一个如下的异常:
A3 NO SELECT Unsafe Login. Please contact [email protected] for help异常处理

原因:

【SpringBoot】A3 NO SELECT Unsafe Login. Please contact kefu@188.com for help异常处理_第1张图片

意思就是说:这不是一个安全的连接,其实是网易没有遵循IMAP的规范,它强制要求你使用IMAP的ID命令,需要特色添加ID COMMAND

解决方式:

添加imap的id,然后再去读取邮件就好用了。具体的实现方式如下,我直接放上代码:

public static List reciveWithImap() throws  Exception {
    String user = "你的邮箱@163.com";// 邮箱的用户名
    String password = "设置里面的授权的密码,不是你登录邮箱的那个密码昂"; // 邮箱的密码

    Properties prop = System.getProperties();
    prop.put("mail.store.protocol", "imap");
    prop.put("mail.imap.host", "imap.163.com");
    prop.put("mail.smtp.auth", "true");

    //这部分就是解决异常的关键所在,设置IAMP ID信息
    HashMap IAM = new HashMap();
    //带上IMAP ID信息,由key和value组成,例如name,version,vendor,support-email等。
    // 这个value的值随便写就行
    IAM.put("name","myname");
    IAM.put("version","1.0.0");
    IAM.put("vendor","myclient");
    IAM.put("support-email","[email protected]");

    Session session = Session.getInstance(prop);

    // 使用imap会话机制,连接服务器
    int total = 0;
    IMAPStore store = (IMAPStore) session.getStore("imap");
    store.connect(user, password);
    store.id(IAM);

    IMAPFolder folder = (IMAPFolder) store.getFolder("INBOX"); // 收件箱
    folder.open(Folder.READ_WRITE);
    // 获取总邮件数
    total = folder.getMessageCount();
    System.out.println("-----------------共有邮件:" + total + " 封--------------");
    // 得到收件箱文件夹信息,获取邮件列表
    System.out.println("未读邮件数:" + folder.getUnreadMessageCount());
    Message[] messages = folder.getMessages();
    int messageNumber = 0;
    for (Message message : messages) {
      System.out.println("发送时间:" + message.getSentDate());
      System.out.println("主题:" + message.getSubject());
      System.out.println("内容:" + message.getContent());
      Flags flags = message.getFlags();
      if (flags.contains(Flags.Flag.SEEN)) {
        System.out.println("这是一封已读邮件");
      } else {
        System.out.println("未读邮件");
      }
      
      //每封邮件都有一个MessageNumber,可以通过邮件的MessageNumber在收件箱里面取得该邮件
      messageNumber = message.getMessageNumber();
    }
    Message message = folder.getMessage(messageNumber);
    System.out.println(message.getContent() + message.getContentType());
    // 释放资源
    if (folder != null) {
      folder.close(true);
    }

    if (store != null) {
      store.close();
    }
    return null;
  }

这样就可以解决问题了。

参考文献:

 http://help.mail.163.com/faqDetail.do?code=d7a5dc8471cd0c0e8b4b8f4f8e49998b374173cfe9171305fa1ce630d7f67ac211b1978002df8b23(官网给出的解决方式,也就是我代码中的部分)

你可能感兴趣的:(springboot,java)