• 讲座:采用Store检查邮件(1)


    讲座:采用Store检查邮件(1)


    一、邮件接收的体系结构
    JavaMail API中定义了一个java.mail.Store类,用于运行邮件的接收任务,该类的实例对象封装了某种邮件接收协议的底层实施细节。应用程序调用这个类的方法就能够获得用户邮箱中的各个邮件夹的信息。JavaMail中的使用Folder对象表示邮件夹,通过Folder对象的方法应用程序进而又能够获得该邮件夹中的全部邮件信息,而每封邮件信息JavaMail又分别使用了一个Message对象进行封装。JavaMail中接收邮件主要涉及的例如以下图所看到的:

    图1:JavaMail Store的API(取自《JavaMail开发具体解释》)

    1. 从Session对象中获得实现了某种邮件发送协议的Store对象
    2. 以某个邮件账户的身份连接上POP3或IMAP4server
    3. 调用Store的getFolder方法,获代替表该账户的邮件中的某个邮件夹的Folder对象
    4. 调用Folder对象中的getMessages或getMessage方法,获取邮件夹中的全部邮件或某一封邮件


    二、Store类

    和Transport类一样,javax.mail.Store类也是继承了javax.mail.Service类。

    Store类用于连接邮件server,并訪问邮件接收server上的邮件夹。Store类是一个抽象类。

    Sun公司在mail.jar包的com/sun/mail/pop3文件夹中提供的POP3的实现子类POP3Store,事实上现了POP3协议的底层实施细节。能够通过Session对象中定义的mail.store.protocol属性构建对应的协议实现类,并返回实例对象。其经常用法有:

    connect() throws MessagingException
    connect(String host, String user, String password) 
    throws MessagingException
    connect(String host, String port, String user, String password)
    throws MessagingException                                                                                                                                                   
    这三种方法运行client与邮件server的连接请求。

    会抛出下列异常:
    连接认证失败: AuthenticationFailedException
    已连接:抛出 IllegalStateException异常
    其它原因:抛出MessageException异常                   

    isConnected() 用于检測client与邮件server是否已经连接
    abstract Folder getFolder(java.lang.String name)
    throws MessagingException
    用于返回指定名称的邮件夹(Folder)对象

    使用getFolder方法式,name指定的是邮件夹的名称。假设client与邮件server没有连接的情况下调用该方法。该方法会抛出MessagingException异常。

    同一时候调用该方法是要注意两点:

    1. 指定的邮件夹在邮件server上不存在,该方法也将返回指定名称的Folder对象,假设用户想推断得到的邮件夹是否存在还须要调用Folder的exists方法推断。

    2. 通过POP3协议获得的Store对象调用这种方法时。邮件夹名称仅仅能指定为"INBOX"。

    三、Folder类

    Folder类是一个抽象类。应用程序通过调用Store的getFolder方法获得Folder类的实例对象,Folder类经常使用的方法例如以下:

    abstract boolean exists()
    throws MwessagingException                                                                                                      
    推断当前邮件夹在邮件server中是否存在,若client与邮件server已经断开则抛出 MessagingException异常
    abstract void open(int mode) 设置client訪问邮件账户的操作权限。


    Folder.READ_ONLY:仅仅能读取邮件夹中的邮件
    Folder.READ_WRITE:能够改动而且读取当中的邮件

    abstract Message getMessage(int msgnum)                                                                                              从邮件夹中获取指定邮件对象
    abstract
    Message[] getMessages()
    Message[] getMessages(int start, int end)
    Message[] getMessage(int[] msgnum)
    各自是返回全部邮件、指定范围内的全部邮件对象
    abstract
    Message[] serach(SearchTerm term)
    Message[] search(SearchTerm term, Message[] msgs)                                                                                                                                                                 
    搜索邮件夹中符合条件的邮件。


    SearchTerm类在后面介绍,第一个方法搜索整个邮件夹,而后者搜索的范围有msgs数组指定

    abstract int getMessageCount() 返回邮件夹中邮件的总数
    abstract void close(boolean expunge) 关闭当前的Folder对象。expunge表示在删除对象前是否删除已经设置了删除标记的邮件从而更新folder

    四、Flags类

    mail.jar包中的Flags类代表一组邮件标记的集合,邮件标记用于标识邮件的使用状况,比如:删除标记、已读标记等。JavaMail中的邮件标记分为系统标记和用户标记。系统标记是指Flags.Flag这个内部类中表示的邮件标记,用户标记指用户自己定义的标记。


    Flags.Flag是Flags的内部类,该内部类定义了一些常量分别表示各种不同的邮件标记,这些标记都是系统标记。

    Flags.Flag中定义的常量
    常量 说明
    Flags.Flag.ANSWERED 邮件回复标记,用于标识邮件是否已经回复
    Flags.Flag.DELETED 邮件删除标记
    Flags.Flag.DRAFT 草稿邮件标记
    Flags.Flag.FLAGGED 用于表示邮件是否为回收站中的邮件
    Flags.Flag.RECENT 新邮件标记,用于表示邮件是否是新邮件
    Flags.Flag.SEEN 邮件阅读标记,用于表示邮件是否已经阅读
    Flags.Flag.USER                                                                                                  底层系统是否支持用于自己定义标记,应用程序仅仅能检索这个属性,而不能设置这个属性
       

    设置邮件标记应该注意的问题:为邮件server中的邮件设置邮件标记依赖于详细的邮件协议,比如POP3协议仅仅定义了dele命令,因此POP3server仅仅支持JavaMail中的Flags.Flag.DELETED标记。尽管POP3server不支持除Flags.Flag.DELETED标记以外的其它邮件标记,可是client软件能够为本地硬盘上的邮件设置这些邮件标记。以方便用户管理本地邮件。


    Flags类中的经常用法
    Flags()
    Flags(Flags flags)
    Flags(Flags.Flag flag)
    Flags(java.lang.String flag)
    构造一个空的Flags对象
    用指定的Flags对象构造一个Flags对象
    用指定的系统标记构造一盒Flags对象
    用于指定的用户标记构造一个Flags对象
    void add(Flags.Flag flag)
    void add(java.lang.String flag)
    void add(Flags flag)                                                                                                                                                            
    添加指定的系统标记到Flags对象
    添加指定的用户标记到Flags对象
    添加一个Flags对象中包括的全部邮件标记到当前的Flags对象中
    void remove(Flags.Flag flag)
    void remove(java.lang.String flag)
    void remove(Flags flag)
    从当前的Flags对象中删除指定的系统标记
    从当前的Flags对象中删除用户标记
    从当前Flags对象中删除參数Flags对中定义的全部邮件标记
    boolean contains(Flags.Flag flag)
    boolean contains(java.lang.String flag)
    boolean contains(Flags flag)                          
    检查当前对象中是否包括指定的系统标记
    检查当前对象中是否包括指定的用户标记
    检查当前对象中是否包括指定的Flags对象中的全部邮件标记
    Flags.Flag[] getSystemFlags() 返回Flags对象中的全部系统标记
    String[] getUserFlags() 返回Flags对象中全部的用户标记
    Flags getFlags()
    void setFlags(Flags flag, boolean set)
    getFlags方法用于得到Message对象中设置的邮件标记
    setFlags方法用于为Message对象设置邮件标记,当中set參数用于表示flags对象代表的邮件标记是设置到Message对象中的。还是从Message对象中删除。当set为true时表示设置,false表示删除

    //设置邮件标识
    folder.open(Folder.READ_WRITE);  //以读写模式打开邮件夹
    message.setFlag(Flags.Flag,true);  //设置邮件标记
    message.saveChange();                //保存设置
    
    //清除邮件标识
    folder.open(Folder.READ_WRITE);
    Flags flags = messgae.getFlags();
    if(flags.contains(Flags.Flag)){
    	message.setFlag(Flags.Flag, false);
    }
    message.saveChanges();


    PS:删除保存在POP3server中的邮件时,应用程序首先要为邮件设置为删除标记,然后调用folder.close(true)方法关闭当前邮件夹对象POP3server才会删除保存在server中的邮件。

    在JavaMail的API文档中能够知道Folder类定义了一个名为expunge的方法,该方法的定义就是用来删除邮件夹中全部设置了删除标记的邮件。

    事实上应用程序不能调用这种方法来删除保存在POP3server中的邮件,因为POP3本分的限制所导致其不能调用其本身POP3Folder.expunge()方法删除邮件。

    而IMAP协议则同意client在邮件server上直接运行邮件删除操作。

    IMAP实现类IMAPFolder中提供了IMAPFolder.expunge方法删除邮件事实上事实上直接调用Folder.expunge方法垃圾桶。




    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    ASP.NET 下载文件方式
    分享各大平台接口(空间,微博)
    BitmapToASCii
    C#操作进程(Process)
    Config ConnectionStrings
    Import Excel void (NPOI)
    C# Serialize
    C# 属性
    调用存储过程的方法
    Redis配置与安装
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4851980.html
Copyright © 2020-2023  润新知