mailcore 2 iOS 之一 IMAP
公司开发oa中的邮箱,资源限制,最后iOS开发采用的mailcore2-ios框架。研究的不深,只当做个分享,口条不好,凑合看吧。
安装
我直接用的cocoapods,非常方便,只是资源包大了一点,耐心等待就好了,其他方式没试过。pod 'mailcore2-ios'
https://github.com/MailCore/mailcore2 官方,有问题提issue,开发者会很热心回答的。
更新/纠错日志
- 2018-12-11 纠错:IMAP-4.单封邮件获取和处理.根据uid获取单封邮件 有误,
range的范围应该是(uid, 0),而不是(uid, 1),这样获取到的是两封
,脑子秀逗了。 - 2018-12-11 更新:创建草稿邮件
- 2018-12-12 更新:SMTP协议
开发
个人比较喜欢imap协议,功能比较丰富,不过用mailcore搞起来似乎费劲了一点,我也只是实现了一些基本功能,高级的还在研究。
计划分享一下下面几项🤗🤗🤗🤗🤗
- IMAP
- 登录
- 文件夹列表、命名空间
- 邮件列表拉取
- 邮件列表中单封邮件内容获取和处理
- 邮件的各种标记添加
- 删除邮件
- 附件和html内容解析
- 草稿箱邮件创建
- POP
- SMTP
IMAP
1.登录
首先设置账号信息,也就是创建session;然后校验;
1 | self.imapSession.hostname = session.imapHost; //imap.xxx.com.cn |
校验信息:
1 | MCOIMAPOperation *checkOp = [session checkAccountOperation];//这里的session就是配置帐号信息的session |
2.获取文件夹目录
命名空间:它这里有个namespace,对于中文名称
的📂名称,需要通过命名空间
来解析,不然很可能是👇这种乱码
:
1 | //这是当时解析网易邮箱的乱码,找原因找了好久😭😭😭,在一篇博客上看到的解决办法。 |
先把正确的放出来,找回点走下去的信心💔💔💗💖…
1 | INBOX |
因为某些邮箱的session莫名其妙没有自带默认的命名空间
,我采取的笨办法是先去获取一下namespace,不过嘛,,,居然获取到的也时有时无😱😱😱😱😱
1 | MCOIMAPSession *session = [MMIMAPTool getSession]; |
关键的一句:NSString *folername = [namespace componentsFromPath:f.path][0];
1 | MCOIMAPFetchFoldersOperation * ops = [session fetchAllFoldersOperation]; |
获取某个文件夹的mail数目等信息
1 | MCOIMAPFolderInfoOperation *folderInfo = [session folderInfoOperation:foldername]; |
3.拉取某个文件夹邮件列表
1 | //这里的kind我觉得是需要拉取的内容们,我是几乎大部分都down了,可以看情况自己选择; |
还有另外一个方法,但是实在没太搞懂里面的number参数,文档里说sequence number不能排序用,所以我没选择这个方法,主要是没懂👺👺👺👺👺👺👺
1 | //Returns an operation to fetch messages by (sequence) number. |
4.单封邮件获取和处理
根据uid获取单封邮件
1
2
3
4//和获取邮件列表一样,不过range的长度是0;
MCOIndexSet *uids = [MCOIndexSet indexSetWithRange:MCORangeMake(uid, 0)];
//之前写错了,range长度应该是0,而不是1;
//MCOIndexSet *uids = [MCOIndexSet indexSetWithRange:MCORangeMake(uid, 1)];获取邮件纯文本内容(不包括html样式等)
1
2
3
4
5
6
7
8
9
10
11
12
13{
//这里是在上一步获取单个邮件的回调内进行的
//这个方法是自动把文本中的空行之类的去掉了,也有不去掉和可选是否去掉的方法
MCOIMAPMessage *msg = [//上一步的message];
MCOIMAPMessageRenderingOperation * messageRenderingOperation = [session plainTextBodyRenderingOperationWithMessage:msg folder:foldername];
[messageRenderingOperation start:^(NSString * plainTextBodyString,NSError * error) {
if (error == nil) {
complete(plainTextBodyString, msg);
}else{
NSLog(@"fetch plain text error:%@",error);
}
}];
}
1 | 文档里注释的不能再清楚了,自己查阅吧😈😈😈😈😈 |
- 获取html内容,放在一个webview中显示基本内容应该没问题了
1
2
3
4
5
6
7
8
9MCOIMAPMessage *msg = [同样是上一步的message];
MCOIMAPMessageRenderingOperation * messageRenderingOperation = [session htmlBodyRenderingOperationWithMessage:msg folder:foldername];
[messageRenderingOperation start:^(NSString * _Nullable htmlString, NSError * _Nullable error) {
if (error == nil) {
complete(htmlString, msg);
}else{
NSLog(@"fetch plain text error:%@",error);
}
}];
5.添加各种标记
已读未读,小红旗标记等等。需要注意的是,“kind”区分是添加标记还是移除标记
,例如已读“MCOMessageFlagSeen”标记,移除就成了未读,没有“unseen”之类的。。。
1 | - (void)setFlagged:(BOOL)flagged message:(NSInteger)uid folder:(NSString *)folder { |
6.删除邮件
为什么先说的标记那部分,因为删除邮件也是添加“delete”标记。这里需要做一个区分,要删除的邮件是不是在 “已删除/草稿箱” 这两个文件夹
。
主要操作有三个:
- 1、copy一份到“已删除”
- 2、设置删除标记
- 3、执行擦除expunge操作
1 | //**如果是不在已删除,草稿箱,执行1、2、3 |
7.附件处理和html内容解析
官方demo
https://github.com/MailCore/mailcore2/tree/master/example/ios/iOS%20UI%20Test/iOS%20UI%20Test
github上他们有写一个demo,我直接用了里面两个类,messageView又自己加了些乱七八糟的逻辑。protocol方便解析的,具体讲解后续更新。MCOHTMLRendererIMAPDelegate
这个协议里面,提供了可以自主解析附件、图片、html内容,以及简单给定html展示样式的方法。先贴出header、正文、附件,我自己写的一个简单展示模板吧,内容处理这块东西太多了,整理一下再继续更新。
TemplateForAttachment.html
TemplateForMessage.html
TemplateForMainHeader.html
8.创建草稿箱邮件
“append” 拼接的概念,往一个文件夹内添加邮件;
- 1、新建一封新邮件(SMTP中讲创建邮件)
- 2、获取你的草稿箱文件夹名称
- 3、执行append操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15//这里的data就是新建的邮件;
- (void)createDraft:(NSData *)data block:(void(^)(bool success, uint32_t uid, NSString *folder))block
{
if (!imapSession ) {
return;
}
NSString *folder = @"Drafts" //草稿箱 ,或者是你邮箱服务器解析到的草稿箱文件夹名称;
MCOIMAPAppendMessageOperation *op = [imapSession appendMessageOperationWithFolder:folder messageData:data flags:MCOMessageFlagDraft];
[op start:^(NSError *error, uint32_t createdUID) {
//do your operation;
NSLog(@"create Draft message :%@",@(createdUID));
}];
}