admin管理员组

文章数量:1530043

场景:

 

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

原因:

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

解决方式:

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

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

    Properties prop = System.getProperties();
    prop.put("mail.store.protocol", "imap");
    prop.put("mail.imap.host", "imap.163");
    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","testmail@test");

    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/faqDetail.do?code=d7a5dc8471cd0c0e8b4b8f4f8e49998b374173cfe9171305fa1ce630d7f67ac211b1978002df8b23(官网给出的解决方式,也就是我代码中的部分)

本文标签: 异常selectunsafeSpringBootkefu