先简单了解下pop3和smtp协议:

pop3协议规定了邮件客户端与pop3服务器之间的通信规则。一共定义了12条pop3命令供邮件客户端来检索和获取电子邮箱中的邮件信息。下面简单描述下这些命令( <SP>代表空格,<CRLF>代表回车和换行)。

user<SP>username<CRLF>  邮件客户端与pop3服务器建立连接后的第一条命令,向服务器通知帐 户名,不过,貌似任意用户名,服务器都会返回+OK。

pass<SP>password<CRLF>  用于向服务器传递密码。

apop<SP>name,digest<CRLF> 用于替换user和pass命令,以md5数字摘要的形式向pop3邮件服务器提交帐户密码。

stat<CRLF>    查询邮箱中的统计信息,+OK 21 5678952

uidl<SP>index<CRLF>    查询第index封邮件的唯一标识号,+OK 562481

list<SP>(index)<CRLF>  查询第index或所有邮件的信息,返回邮件index size的信息。

retr<SP>index<CRLF>      获取指定index邮件的全部信息。整封完整邮件。

dele<SP>index<CRLF>    给第index封邮件设置删除标识。

rset<CRLF>   清除所有邮件的删除标识。

top<SP>index<SP>n<CRLF>  获取第index封邮件的邮件头+n行邮件体的信息。

noop<CRLF>  检测pop3客户端与pop3服务器的连接情况。

quit<CRLF>  结束邮件接收过程。

mailcore2与pop3协议相关的API:

MCOPOPSession封装了pop3客户端与pop3服务器之间的通讯底层细节。

- (MCOPOPOperation *)checkAccountOperation 封装了命令user和pass,完成向邮件服务器进行认证的过程

- (MCOPOPOperation *)deleteMessagesOperationWithIndexes:(MCOIndexSet *)indexes 封装了命令dele,给邮件设置删除标识。

- (MCOPOPOperation *)disconnectOperation 封装了命令quit,结束邮件接收过程。

     - (MCOPOPFetchHeaderOperation *)fetchHeaderOperationWithIndex:(unsigned int)index 封装了命令top,n=0的情况。

     - (MCOPOPFetchMessageOperation *)fetchMessageOperationWithIndex:(unsigned int)index 封装了命令retr,获取指定邮件的全部信息。

- (MCOPOPFetchMessagesOperation *)fetchMessagesOperation 封装了命令stat,list和uidl,返回所有邮件的index,size,和uidl信息。


   smtp协议规定了邮件客户端与smtp服务器之间,以及两台smtp服务器之间的通讯规则。虽然smtp协议一共定义了18条命令,但是通常只需用到其中的6条命令,

   ehlo<SP>domain<CRLF> domain表示邮件发送者的主机名。邮件服务器返回的信息中包含支持的auth方式。

   auth<SP>(para)<CRLF> 指定认证方式。接下来要输入base64编码的username和pwd了。

   mail<SP>FROM:address<CRLF> 指定发件人的邮箱地址

   rept<SP>TO:address<CRLF> 指定收件人的邮箱地址

   data<CRLF> 表示数据区域开始,这个命令后面的所有内容都将被当成邮件内容,直到遇到"<CRLF>.<CRLF>",则表示邮件内容结束。

   quit<CRLF> 结束会话。

   mailcore2与smtp协议相关的api:

       MCOSMTPSession 封装了邮件客户端与smtp服务器之间的通讯规则:

- (MCOSMTPOperation *)checkAccountOperationWithFrom:(MCOAddress *)from 封装了ehlo与auth命令,完成与smtp服务器的认证。

- (MCOSMTPSendOperation *)sendOperationWithData:(NSData *)messageData 封装了data命令,messagedata就是data命令后面的内容。收件人信息从messageData中提取。

- (MCOSMTPSendOperation *)sendOperationWithData:(NSData *)messageData from:(MCOAddress *)from recipients:(NSArray *)recipients 封装了data命令,指定收件人。

接下来就是关于邮件内容的解析了,首先得了解邮件的格式。

邮件内容的基本格式和细节由RFC822文档和MIME协议定义。

RFC邮件格式包含邮件头和邮件体两个主要的部分,邮件体部分只能表述一段普通的文本,无法表达图片等二进制数据,且当收到“.”符号的单行时,“<CRLF>.<CRLF> ”后面的数据会被丢弃掉。

但是可以通过某种编码方式将二进制数据编码成可打印的ascii字符后再作为RFC822格式的内容。邮件阅读程序收到这种邮件后解码成二进制数据。这样就巧妙的用RFC格式文档传递二进制数据了。

但是邮件阅读程序必须知道二进制数据编码成ascii的编码方式以及这些二进制数据在邮件内容中的起始位置。这些问题催生了mime协议的诞生,mime定义了如何在邮件体部分表达出丰富多样的数据内容。

MIME邮件就是采用了MIME协议的邮件,它新增了一些自己的头字段,MIME-version指定mime的版本,content-type指定邮件体的mime类型及每段的分隔符,解决了二进制数据在邮件内容中的起始位置问题,content-transfer-encoding告知邮件阅读程序二进制数据编码方法。

MIME邮件由mime消息组成。mime消息也包含头和体两部分,头和体之间用空格分开,多个mime消息体之间采用某种分隔符标识进行分隔,它们之间的组合类型和分隔符标识由它门的组合mime消息的头来描述。

mime消息头:

1.content-type    字段内容以“主类型/子类型;boundarty="分隔符”的形式出现。主类型:text,image,multipart等,multipart主类型表示mime组合消息。mime组合消息有三种组合关系:混合,关联,选择,混合(multipart/mixed)表示消息体中有文本,附件等组成。关联(multipart/related)表示关联组合类型,如html代码内嵌引用的图片等资源。选择类型(multipart/alternative)表示该邮件内容既可以用纯文本表示,也可以用html格式表示,如果邮件阅读程序不支持html文本的话,就可以用纯文本表示。

2.content-transfer-encoding     表示二进制内容编码的方式。

3.content-disposition     指定邮件阅读程序处理数据内容的方式。inline直接处理,attachment当附件处理,

4.content-ID    出现在消息类型为"multipart/related"组合消息内,表示该消息的一个唯一标识号,该标识号会在html格式正文中被引用,content-id:451265.jpg,则html正文中的引用方式为:<img src=“cid:451265.jpg” >

5.content-location    为内嵌资源设置一个URI地址,html正文中可以直接使用该地址。

6.content-base,为内嵌资源设置一个基准路径。

mailcore(一)相关推荐

  1. mailcore -- Mail port

    以163为例的各个Mail服务器SSL协议端口号和非SSL协议端口号

  2. mailcore -- POP

    MCOPOPSession *session = [[MCOPOPSession alloc] init]; [session setHostname:@"pop.qq.com"] ...

  3. 网上搜集第三方(一)

    iOS开发-常用第三方开源框架介绍 为了了解一下目前第三方库的普及程度,下面列举一些知名App对第三方库的依赖. 网易新闻 AppleReachability ASIHTTPRequest EGOTa ...

  4. iOS 使用 MailCore2

    安装 1.从github上拉代码下来: git clone https://github.com/MailCore/mailcore2/ 2.添加到你的项目中去: 把 build-mac/mailco ...

  5. 开源 iOS 项目分类索引大全

    GitHub 上大概600个开源 iOS 项目的分类和介绍,对于你挑选和使用开源项目应该有帮助 系统基础库 Category/Util  sstoolkit 一套Category类型的库,附带很多自定 ...

  6. iOS 开源项目(一)

    pod上面直接搜名字就好 系统基础库 sstoolkit 一套Category类型的库,附带很多自定义控件 功能不错- BlocksKit 将Block风格带入UIKit和Founcation coc ...

  7. iOS(iPhone,iPad))开发(Objective-C)开发库常用库索引

    http://www.code4app.com 这网站不错,收集各种 iOS App 开发可以用到的代码示例  http://www.cocoacontrols.com/ 英文版本的lib收集  ht ...

  8. iOS(iPhone,iPad))开发(Obje…

    原文地址:iOS(iPhone,iPad))开发(Objective-C)开发库常用库索引 作者:子木潇雨 http://www.code4app.com 这网站不错,收集各种 iOS App 开发可 ...

  9. 史上最全的iOS开源项目分类汇总

    学了这么久,还是抽时间把github上比较好用的第三方总结了一下: Category/Util sstoolkit 一套Category类型的库,附带很多自定义控件 功能不错- BFKit 又一套Ca ...

最新文章

  1. hdu 1495 非常可乐(BFS)
  2. 如果有一个类是 myClass , 关于下面代码正确描述的是?
  3. GetLastInputInfo 判断离开状态
  4. python中返回上一步操作_selenium操作iframe元素,切入退出操作
  5. java与jquery的选择器区别_java day44【JQuery 基础:概念,快速入门,JQuery对象和JS对象区别与转换,选择器,DOM操作,案例】...
  6. AspectJ学习笔记
  7. jdbc和mysql做游戏排行榜_MySQL数据库与JDBC编程
  8. 移动端点击拉起输入_耐用的筛分式移动破碎站
  9. 两种改变 Windows Vista UI语言的途径
  10. 如何在苹果Mac中使用“启动安全性实用工具”?
  11. mysql 查询最大值的总和_mysql中最大值和最小值以及总和查询与计数查询的实例详解...
  12. 小白进阶——Mike21(一)
  13. adb命令——简单常用命令介绍:截图——adb shell screencap -p /sdcard/123.png...
  14. 21年6月阿里巴巴Java暑期实习面经回顾(已上岸)
  15. python输入三个数形成各种三角形
  16. Clevo P950系列拆机
  17. CiteSpace分析专利概况
  18. 小功能⭐️U3D异步加载功能
  19. Coursera半价优惠
  20. Kubernetes1.13集群安装dashboard 1.10.1

热门文章

  1. 360浏览器打不开qq空间_网页突然打不开其他软件却能上网?怎么解决?
  2. 计算机一级考试考网络什么,计算机一级考试内容 一级考试难不难
  3. h5页面如何预览excel文件_如何让excel文件读取变得更简单
  4. 火狐浏览器打印网页不全_武汉社保网上下载打印流程
  5. 第4.3节 Python中与迭代相关的函数
  6. Django项目:CRM(客户关系管理系统)--12--05PerfectCRM实现King_admin注册功能获取内存01...
  7. 【BZOJ 4555】 4555: [Tjoi2016Heoi2016]求和 (NTT)
  8. BitNami一键安装Redmine
  9. windows系统-程序加载时生成栈和堆的过程
  10. c#中程序以管理员身份运行的三种办法