iOS开发实战:Mailcore深度解析

来源:互联网 发布:ajax jquery json data 编辑:程序博客网 时间:2024/04/30 02:44

MailCore 是一个依赖libetpan,简单封装的IMAP/SMTP邮箱类库

安装这里就不讲了 自己去看 https://github.com/MailCore/MailCore


这里主要讲讲 这个类库的解析以及相关知识的总结,mailcore把程序主要分成了三个部分,SMTP,MIME,以及IMAP(已经把IMAP的功能封装到了一系列的Model中间了):


咱们先说SMTP这块的代码,这里的东西比较少:

首先这里有链接的三种Type

typedef enum {    CTSMTPConnectionTypePlain = 0,    CTSMTPConnectionTypeStartTLS,    CTSMTPConnectionTypeTLS} CTSMTPConnectionType;
上面是三中SMTP的链接方式,有不可靠地,有可靠的,有把不可靠变成可靠地,他们分别使用了不同的端口进行链接

https://www.fastmail.fm/help/technical/ssltlsstarttls.html


CTSMTPConnection 这个类中做一件事 就是发件,把你的一系列参数传进去,它会先判断是否可以连接,这里就是对应着他的第二个方法,检查SMTP链接,检查成功就可以继续下面的工作,发件,也就是对应的第二个方法。这里是同步的方法。

相对应的就有异步的方法,CTSMTPAsyncConnection,在这里使用了NSThread来处理异步,并且根据这个线程的状态判断整体发件的状态。

下面我先来说两个名词 SMTP 和 ESMTP,SMTP(Simple Mail TransferProtocol)是简单发件协议,ESMTP就是在上面加了几种验证机制,增加命令EHLO和AUTH,同时也就是说普通的SMTP没有验证机制,但是其实现在基本上都是ESMTP了。详情看这个 http://www.iteye.com/topic/573780,而对应的 mailcore中也建立了 smtp和esmtp两种类,在这两种类中都封装了一个libetpan的类mailsmtp,里面的所有方法基本上都是通过mailsmtp完成的。

ESMTP的几种验证机制: LOGIN模式 基于BASE64编码;PLAIN明文;CRAM-MD5:服务器返回一段字符转,客户端加上自己的账户密码,传回去,这些都是用BASE64加密的,然后服务器再使用MD5验证

详情见下http://linxucn.blog.51cto.com/1360306/837365


下面说Mailcore中的MIME部分

MIME大家都熟悉,是一种文件格式,在这里的意义就是信件内容,因为大家也都知道,信件是分成几个分块的,我们可以根据需要下载我们想要的内容

先说Mailcore的两个工具类:

CTMIMEFactory:作用就是转换作用,把libetpan的mailmime 转化成为CTMIME

CTMIME_Enumerator:MIME迭代器,作用是把一个MIME分成最小的分块,然后输出出来


下面先说MIME在这里有几种,基本分成三种文件头,多部分MIME,独立的MIME,其中独立的MIME又包括了信件内容和附件,

CTMIME_MessagePart比其他MIME多了mailimf_fields存放参数,而CTMIME_MultiPart多了数组来存取子MIME

CTMIME_SinglePart在这里是一个比较重要的类,在这里来区分不同的MIME的类型,并且提供了fetch内容的方法,而且这里还可以做一些拓展,比如说添加是否是内嵌附件的判断,等等,归到底来说,mailcore只是一个对libetpan的简单的封装,很多东西都可以自己拓展的。


最后一部分说Mailcore的模型和其中封装的IMAP方法

首先介绍他的工具类 MailCoreUtilities ,他的作用是转换方法,略去不说

CTCoreAddress 邮件地址类 两个属性,没什么可说的

CTCoreAttachment,CTBareAttachment:每个bareAttchment拥有一个CTMIME_SinglePart,可以由此fetch内容由此转化为他的父类CTBareAttachment

CTCoreAccount:负责连接IMAP服务器和获取Folder,Folder在这里分三种,普通folder,订阅folder,Gmail文件夹extendFolder(用来记录状态的类是 CTXlistResult)

这里面其实有很多种认证方法,下面是libetpan的类型,大家有兴趣可以查下,如果想要添加新的验证方法,可以在account里面添加新的拓展方法

enum {  IMAP_AUTH_TYPE_PLAIN,            /* plain text authentication */  IMAP_AUTH_TYPE_SASL_ANONYMOUS,   /* SASL anonymous */  IMAP_AUTH_TYPE_SASL_CRAM_MD5,    /* SASL CRAM MD5 */  IMAP_AUTH_TYPE_SASL_KERBEROS_V4, /* SASL KERBEROS V4 */  IMAP_AUTH_TYPE_SASL_PLAIN,       /* SASL plain */  IMAP_AUTH_TYPE_SASL_SCRAM_MD5,   /* SASL SCRAM MD5 */  IMAP_AUTH_TYPE_SASL_GSSAPI,      /* SASL GSSAPI */  IMAP_AUTH_TYPE_SASL_DIGEST_MD5   /* SASL digest MD5 */};

CTCoreFolder:个人感觉是最重要的类,因为他承担着最重要的任务,获取邮件,改变邮件状态等等,而且从代码量上来看,这也是最多的类

先说一个重要的类型 CTFetchAttributes,这个东西定义了你要去取得邮件的哪些部分,如果你要扩展,可以在这里多加上一些参数

先说明一下IMAP的获取邮件的机制,邮件有两个属性UID和NUM

邮件拥有两个ID都是顺序增长的,区别是UID不会变化,创建的时候是什么一会就是什么,但是NUM会根据当前邮件的状态的变化而变化,简单来说就是如果前面有邮件被删除,邮件num顺序前挪。所以在向前取得邮件的时候可以根据num获取,这样就可以保证获取邮件的数量。

CTCoreMessage:这个folder拥有三个重要的类型( mailmessage,mailimf_single_fields,CTMIME)的参数,其中的基本所有的方法都是是从这三个参数中解出来


说了这么多其实也没说什么,也没有放什么代码,就是简单解析了下mailcore,希望对大家有所帮助。

0 0
原创粉丝点击