All About JAVA javamail的pop3以及IMAP方式读取未读邮件等操作

/**
 * 可以在props下设置认证信息,协议和端口信息,超时等信息,这样在store.connect的时候可以根
 * 据props里是否设置了认证信息来选择不带参数的connect()或者如下有参数的connect(...)方法
 *  store.connect(user, password); store.connect(host, user, password);
 */
  Properties props = System.getProperties();
  props.setProperty("mail.imap.host", "mail.**.**.cn");
  props.setProperty("mail.imap.port", "143"); 具体端口信息由邮件提供商确定
  props.setProperty("mail.imap.connectiontimeout", "5000");
  props.setProperty("mail.imap.timeout", "5000");

代码正文:

Properties props = System.getProperties();
Store store = null;
// 用来存放邮件中文件夹的,可以简单的使用javax.mail.Folder类型,
// 如果只是取未读邮件数的话Folder类型就够了
IMAPFolder inbox = null; 
try {
    Session session = Session.getDefaultInstance(props, null);
    //如果使用pop3协议这里imap改成pop3,如果使用ssl连接这里应使用imaps
    store = session.getStore("imap"); 
    store.connect("mail.**.**.cn", "user","pwd");
    System.out.println(store);
    inbox = (IMAPFolder)store.getFolder("Inbox"); //取得收件箱对象
    //如果需要在取得邮件数后将邮件置为已读则这里需要使用READ_WRITE,否则READ_ONLY就可以
    inbox.open(Folder.READ_WRITE); 
    // Message messages[] = inbox.getMessages(); //获取所有邮件

    //建立搜索条件FlagTerm,这里FlagTerm继承自SearchTerm,也就是说除了获取未读邮
    //件的条件还有很多其他条件同样继承了SearchTerm的条件类,像根据发件人,主题搜索等,
    // 还有复杂的逻辑搜索类似:
    //     
    //    SearchTerm orTerm = new OrTerm(   
    //            new FromStringTerm(from),   
    //            new SubjectTerm(subject)   
    //            ); 
    //  
    // 可以上网搜索SearchTerm获取更多

    FlagTerm ft = 
        new FlagTerm(new Flags(Flags.Flag.SEEN), false); //false代表未读,true代表已读

    /**
    * Flag 类型列举如下
    * Flags.Flag.ANSWERED 邮件回复标记,标识邮件是否已回复。
    * Flags.Flag.DELETED 邮件删除标记,标识邮件是否需要删除。
    * Flags.Flag.DRAFT 草稿邮件标记,标识邮件是否为草稿。
    * Flags.Flag.FLAGGED 表示邮件是否为回收站中的邮件。
    * Flags.Flag.RECENT 新邮件标记,表示邮件是否为新邮件。
    * Flags.Flag.SEEN 邮件阅读标记,标识邮件是否已被阅读。
    * Flags.Flag.USER 底层系统是否支持用户自定义标记,只读。
    */

    Message messages[] = inbox.search(ft); //根据设置好的条件获取message 

    //遍历获取的Message数组获取信息
    for (Message message : messages) {
        //默认返回Message类型对象,因为我需要获取MessageID所以需要做强制
        //转换为IMAPMessage类型
        IMAPMessage imes = (IMAPMessage)message; 

        //我需要获取的邮件都是纯文本的,所以在这简单的做了判断,不是纯文本的直接跳过了。
        //如果需要对不固定的邮件进行读取需要使用message.getContentType()获取邮件
        //正文类型,然后根据类型进一步处理
        //如果返回“text/plain”或”text/html”为纯文本,如果为”multipart/*”则正文里面可
        //能还包含图片等信息
        if (!(message.getContent() instanceof String))
                    continue;
        Map<String, String> map = new HashMap<String, String>();
        map.put("content", (String)message.getContent());
        map.put("title", message.getSubject());
        //IMAPMessage类型对象可以获取MessageID和UID,两者是有区别的MessageID是
        //邮件的唯一标识,不只限于当前邮件系统,UID是当前邮件系统的唯一标识,
        //另外获取MessageID需要读取邮件,UID不需要读取邮件所以速度更快。
        map.put("messageId", imes.getMessageID()); 
        mailInfoList.add(map); //保存我要获取的信息map列表
        mesList.add(message); //保存我将要设置为已读的message列表
    }
    //将刚才我获取的邮件设置为已读
    if (mesList.size() > 0) {
        Message[] savedMailMessage = new Message[mesList.size()];
        mesList.toArray(savedMailMessage);
        inbox.setFlags(savedMailMessage, new Flags(Flags.Flag.SEEN),true);
    }

} catch (NoSuchProviderException e) {
    e.printStackTrace();
} catch (MessagingException e) {
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} finally {
    try {
        if (inbox != null) {
            inbox.close(false);
            inbox = null;
        }
        if (store != null) {
            store.close();
            store = null;
        }
    } catch (MessagingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。