zoukankan      html  css  js  c++  java
  • IMAP命令与分析

      Internet Mail Access Protocol(缩写为IMAP,以前称作交互邮件访问协议(interactive mail access protocol))IMAP是斯坦福大学在1986年开发的研发的一种邮件获取协议。它的主要作用是邮件客户端(例如MS Outlook Express)可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。当前的权威定义是RFC3501。IMAP协议运行在TCP/IP协议之上,使用的端口是143。它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作。

      具体协议内容可以查阅:http://www.faqs.org/rfcs/rfc3501.html 中文版:http://blog.csdn.net/qqnnhhbb/article/details/6428681

      与POP3协议类似,IMAP(Internet消息访问协议)也是提供面向用户的邮件收取服务。常用的版本是IMAP4。IMAP4改进了POP3的不足,用户可以通过浏览信件头来决定是否收取、删除和检索邮件的特定部分,还可以在服务器上创建或更改文件夹或邮箱,它除了支持POP3协议的脱机操作模式外,还支持联机操作和断连接操作。它为用户提供了有选择的从邮件服务器接收邮件的功能、基于服务器的信息处理功能和共享信箱功能。IMAP4的脱机模式不同于POP3,它不会自动删除在邮件服务器上已取出的邮件,其联机模式和断连接模式也是将邮件服务器作为“远程文件服务器”进行访问,更加灵活方便。

      支持连接和断开两种操作模式。当使用POP3时,客户端只会连接在服务器上一段的时间,直到它下载完所有新信息,客户端即断开连接。在IMAP中,只要用户界面是活动的和下载信息内容是需要的,客户端就会一直连接在服务器上。对于有很多或者很大邮件的用户来说,使用IMAP4模式可以获得更快的响应时间。支持多个客户同时连接到一个邮箱。POP3协议假定邮箱当前的连接是唯一的连接。相反,IMAP4协议允许多个用户同时访问邮箱同时提供一种机制让客户能够感知其他当前连接到这个邮箱的用户所做的操作。支持访问消息中的MIME部分和部分获取。几乎所有的Internet邮件都是以MIME格式传输的。MIME允许消息包含一个树型结构,这个树型结构的叶子节点都是单一内容类型而非叶子节点都是多块类型的组合。IMAP4协议允许客户端获取任何独立的MIME部分和获取信息的一部分或者全部。这些机制使得用户无需下载附件就可以浏览消息内容或者在获取内容的同时浏览。支持在服务器保留消息状态信息。通过使用在IMAP4协议中定义的标志客户端可以跟踪消息状态,例如邮件是否被读取,回复,或者删除。这些标识存储在服务器,所以多个客户在不同时间访问一个邮箱可以感知其他用户所做的操作。支持在服务器上访问多个邮箱。IMAP4客户端可以在服务器上创建,重命名,或删除邮箱(通常以文件夹形式显现给用户)。支持多个邮箱还允许服务器提供对于共享和公共文件夹的访问。支持服务器端搜索。IMAP4提供了一种机制给客户使客户可以要求服务器搜索符合多个标准的信息。在这种机制下客户端就无需下载邮箱中所有信息来完成这些搜索。支持一个定义良好的扩展机制。吸取早期Internet协议的经验,IMAP的扩展定义了一个明确的机制。很多对于原始协议的扩展已被提议并广泛使用。无论使用POP3还是IMAP4来获取消息,客户端使用SMTP协议来发送。邮件客户可能是POP客户端或者IMAP客户端,但都会使用SMTP。

    IMAP的状态图如下:

      

    (1)未预认证的连接(OK欢迎)
    (2)预认证的连接(PREAUTH欢迎)
    (3)被拒绝的连接(BYE欢迎)
    (4)成功LOGIN或者AUTHENTICATE命令
    (5)成功的SELECT或者EXAMINE命令
    (6)CLOSE命令,或者失败的SELECT、EXAMINE命令
    (7)LOGOUT命令,服务器关闭,或者连接已关闭

    这里使用telnet命令来对126邮箱进行操作参数分别是邮件服务器地址和端口(143)如果是SSL的话连993

    capability命令请求服务器支持的功能列表,从这返回可见126邮箱不支持AUTHENTICATE功能的。

    noop命令什么也不做,用来向服务器发送自动命令,防止因长时间处于不活动状态而导致连接中断

    使用STARTTLS命令可以加密传输邮件内容,因为我使用的是telnet不支持加密传输,所以使用明文登录。

    不过在IMAP协议中要求“

    一个服务器实现体必须实现一个配置,认证时,要求:
    (1)STARTTLS命令已经通过。
    或者
    (2)其它保护会话防密码窃听的机制已经提供。
    或者
    (3)以下措施已采用:
    (a)LOGINDISABLED功能被通报,且使用简单文本密码的[SASL]机制(如,PLAIN)没在功能列表中通报。
    (b)AUTHENTICATE命令返回一个错误,即使密码是正确的。
    (c)AUTHENTICATE命令返回使用简单文本密码的所有[SASL]机制的一个错误,即使密码是正确的。
    针对一个失败的LOGIN命令的一个服务器错误邮件不应当指明该用户名,对于该密码,是无效的。

    登录成功后状态变为authenticated。

    select 命令选择一个邮箱,如果成功则状态变为selected。此时是可对邮箱进行读写操作的。

    examine命令和select命令效果一样,返回的内容也类似,区别在于examine是只读的。

    create命令创建文件夹

    rename命令能够重命名

    delete 删除指定文件夹和其所有邮件

    subscribe 指定邮箱为活动的

    可以通过lsub查看活动邮箱

    unsubscribe取消订阅活动邮箱

    list命令列出符合条件的邮箱,第一个参数是基址,第二个是邮箱名,可使用通配符。

    status显示指定邮箱的指定信息,该命令不会改变当前邮箱的选中状态。

    append命令添加一个新邮件到指定文件夹中

    check命令用来在邮箱设置一个检查点。没有参数。就是IMAP中的sync命令。任何未完成的操作,例如从服务器内存向硬盘写数据,都将会被做完以保持邮箱的一致性状态。该命令确保乃村中的磁盘缓冲数据都被写到了磁盘上。

    close命令取消当前选中状态,变回authenticated

    expunge命令删除所有flags中有deleted标记的邮件

    search命令可以根据搜索条件在活动状态的邮箱中搜索邮件,并返回邮件号。搜索的关键字有如下几种:

    ALL
    邮件中所有邮件;ANDing的默认初始关键词。
    ANSWERED
    带有/Answered标记位的邮件。
    BCC <string>
    在信封结构的BCC域包含有指定字符串的邮件。
    BEFORE <date>
    实际日期(忽视时间和时区)早于指定日期的邮件。
    BODY <string>
    在邮件的主体域包含有指定字符串的邮件。
    CC <string>
    在信封结构的CC域包含有指定字符串的邮件。
    DELETED
    带有/Deleted标记位的邮件。
    DRAFT
    带有/Draft标记位的邮件。
    FLAGGED
    带有/Flagged标记位的邮件。
    FROM <string>
    在信封结构的FROM域包含有指定字符串的邮件。
    HEADER <field-name> <string>
    带有一个含指定field-name([RFC-2822]中定义)的头部、且在该头部(它跟在colon之后)的文本中包含指定字符串的邮 件。如果将要检索的字符串(参数中的string)长度为零,那么,它将匹配带有一个含指定field-name、内容可有可无的头部行的所有邮件。
    KEYWORD <flag>
    带有指定关键词标记位的邮件。
    LARGER <n>
    带有一个[RFC-2822](定义)的、大于指定字节数的大小的邮件。
    NEW
    带有/Recent标记位,但不带有/Seen标记的邮件。它在功能上等效于“(RECENT UNSEEN)”。
    NOT <search-key>
    不符合指定检索关键词的邮件。
    OLD
    不带有/Recent标记位的邮件。它在功能上等效于“NOT RECENT”(与“NOT NEW”相反)。
    ON <date>
    实际日期(忽视时间和时区)在指定日期的邮件。
    OR <search-key1> <search-key2>
    符合任意一个检索关键词的邮件。
    RECENT
    带有/Recent标记位的邮件。
    SEEN
    带有/Seen标记位的邮件。
    SENTBEFORE <date>
    [RFC-2822]Date: header(忽视时间和时区)早于指定日期的邮件。
    SENTON <date>
    [RFC-2822]Date: header (忽视时间和时区)在指定日期的邮件。
    SENTSINCE <date>
    [RFC-2822]Date: header (忽视时间和时区)在指定日期或者晚于指定日期的邮件。
    SINCE <date>
    实际日期(忽视时间和时区)在指定日期或者晚于指定日期的邮件。
    SMALLER <n>
    带有一个[RFC-2822]的、小于指定字节数大小的邮件。
    SUBJECT <string>
    在信封结构的SUBJECT域含有指定字符串的邮件。
    TEXT <string>
    在邮件的头部或者主体含有指定字符串的邮件。
    TO <string>
    在信封结构的TO域含有指定字符串的邮件。
    UID <sequence set>
    带有指定唯一标识符集相应的唯一标识符的邮件。序列集顺序排列是允许的。
    UNANSWERED
    不带有/Answered标记位的邮件。
    UNDELETED
    不带有/Deleted标记位的邮件。
    UNDRAFT
    不带有/Draft标记位的邮件。
    UNFLAGGED
    不带有/Flagged标记位的邮件。
    UNKEYWORD <flag>
    不带有指定关键词标记位的邮件。
    UNSEEN
    不带有/Seen标记位的邮件。
     
    搜索从2013年1月1日到2013年5月1日的邮件

    搜索标题或者正文中包含test字符串的邮件

    FETCH 命令用于读取邮件的文本信息,且仅用于显示的目的。包含两个参数,messageset:表示希望读取的邮件号列表,IAMP服务器邮箱中的每个邮件都有 一个唯一的ID标识,(邮件号列表参数可以是一个邮件号,也可以是由逗号分隔的多个邮件号,或者由冒号间隔的一个范围),IMAP服务器返回邮件号列表中 全部邮件的指定数据项内容。
    数据名参数确定能够被独立返回的邮件的一部分,下面我们看看各参数返回的邮件信息:
    ALL:只返回按照一定格式的邮件摘要,包括邮件标志、RFC822.SIZE、自身的时间和信封信息。IMAP客户机能够将标准邮件解析成这些信息并显示出来。
    BODY:只返回邮件体文本格式和大小的摘要信息。IMAP客户机可以识别这些细腻,并向用户显示详细的关于邮件的信息。其实是一些非扩展的BODYSTRUCTURE的信息。
    FAST:只返回邮件的一些摘要,包括邮件标志、RFC822.SIZE、和自身的时间。
    FULL:同样的还是一些摘要信息,包括邮件标志、RFC822.SIZE、自身的时间和BODYSTRUCTURE的信息。
    BODYSTRUCTUR: 是邮件的[MIME-IMB]的体结构。这是服务器通过解析[RFC-2822]头中的[MIME-IMB]各字段和[MIME-IMB]头信息得出来 的。包括的内容有:邮件正文的类型、字符集、编码方式等和各附件的类型、字符集、编码方式、文件名称等等。
    ENVELOPE:信息的信封结构。是服务器通过解析[RFC-2822]头中的[MIME-IMB]各字段得出来的,默认各字段都是需要的。主要包括:自身的时间、附件数、收件人、发件人等。
    FLAGS:此邮件的标志。
    INTERNALDATE:自身的时间。
    RFC822.SIZE:邮件的[RFC-2822]大小
    RFC822.HEADER:在功能上等同于BODY.PEEK[HEADER],
    RFC822:功能上等同于BODY[]。
    RFC822.TEXT:功能上等同于BODY[TEXT]
    UID:返回邮件的UID号,UID号是唯一标识邮件的一个号码。
    BODY[section] <<partial>>:返回邮件的中的某一指定部分,返回的部分用section来表示,section部分包含的信息通常是 代表某一部分的一个数字或者是下面的某一个部分:HEADER, HEADER.FIELDS, HEADER.FIELDS.NOT, MIME, and TEXT。如果section部分是空的话,那就代表返回全部的信息,包括头信息。
    BODY[HEADER]返回完整的文件头信息。
    BODY[HEADER.FIELDS ()]:在小括号里面可以指定返回的特定字段。
    BODY[HEADER.FIELDS.NOT ()]:在小括号里面可以指定不需要返回的特定字段。
    BODY[MIME]:返回邮件的[MIME-IMB]的头信息,在正常情况下跟BODY[HEADER]没有区别。
    BODY[TEXT]:返回整个邮件体,这里的邮件体并不包括邮件头。
    现在我们遇到了一个问题,如果我们要单独提取邮件的附件怎么办?
    通过以上的命令我们是无法做到的,但是我们别忘了在section部分还有其他的方式可以来表示我们要提取的邮件的部分,那就的通过区段数来表示。那下面就让我们来看看什么是区段数。
    每 个邮件都至少有一个区段数,Non-[MIME-IMB]型的邮件和non-multipart [MIME-IMB]的邮件是没有经过MIME编码之后的信息的,那这样的信息只有一个区段数1。多区段型的信息被编排成一个连续的区段数,这和实际信息 里出现的是一样的。如果一个特定的区段有类型信息或者是多区段的,一个MESSAGE/RFC822类型的区段也含有嵌套的区段数,这些区段数是指向这些 信息区段的信息体的。
    说了那么多拗口的,现在我们讲的更简单易懂一些。在一个邮件体里面,区段数1代表的邮件的正文,区段数二代表的是第一个附 件,区段数三代表的是第二个附件,以此类推。在这些区段里,如果有哪个区段又是多区段的,比如2区段的内容格式是mulipart或者是 MESSAGE/RFC822类型的,那么这个区段又嵌套了多个子区段,嵌套的各子区段是用2.1,2.2……等等表示,类似,如果2.1又有嵌套,那么 还会有2.1.1,2.1.2等区段。这样的嵌套是没有限制的。

    抓取431号邮件的摘要

    抓取430到433号邮件的日期和主题

    抓取433号邮件的附件的前128字节

    store命令用于修改指定邮件的属性,包括给邮件打上已读标记、删除标记,等等。

    copy命令将制定邮件拷贝到指定邮箱中

    uid命令可以将邮件号为条件的命令转为唯一标示符来表示

    logout命令退出系统

  • 相关阅读:
    判断arm立即数是否合法的小程序
    一个操作系统的实现:关于ALIGN的若干解释
    一个郁闷的C语言小问题
    test
    浮点数的比较
    一个操作系统的实现:Descriptor 3详解
    一个操作系统的实现:关于CPL、RPL、DPL
    C99可变长数组VLA详解
    SVProgressHUD 用法
    IOS CALayer 详解
  • 原文地址:https://www.cnblogs.com/crystalray/p/3304688.html
Copyright © 2011-2022 走看看