声明:由于MailCore2 SDK API众多,所以将从功能使用的角度以及结合项目来阐述。
(1) 邮件账户方面:我们需要验证账户,验证通过,则把该账户保存下来。
邮件接收分IMAP和POP协议。
checkAccountOperation
- (MCOSMTPOperation *) checkAccountOperationWithFrom:(MCOAddress *)from;
-
(2) 验证账户后,我们首先就是要获取文件夹信息,
MCOIMAPFolderInfoOperation类API用来获取邮件文件夹的信息。
- (MCOIMAPFolderInfoOperation *) folderInfoOperation:(NSString *)folder;
- (void) start:(void (^)(NSError * error, MCOIMAPFolderInfo * info))
completionBlock;
fetchAllFoldersOperation
- (void) start:(void (^)(NSError * error, NSArray * folders))completionBlock;
- (MCOIMAPFolderStatusOperation *) folderStatusOperation:(NSString *)folder;
- (void) start:(void (^)(NSError * error, MCOIMAPFolderStatus * status))
completionBlock;
(3)IMAP API
MCOIMAPSession类基本属性和常用API
@property (nonatomic, copy) NSString *hostname;
@property (nonatomic, assign) unsigned int port;
@property (nonatomic, copy) NSString *username;
@property (nonatomic, copy) NSString *password;
@property (nonatomic, copy) NSString *OAuth2Token;
@property (nonatomic, assign) MCOAuthType authType;
@property (nonatomic, assign) MCOConnectionType connectionType;
- (MCOIMAPFetchFoldersOperation *) fetchSubscribedFoldersOperation;
- (MCOIMAPOperation *) renameFolderOperation:(NSString *)folder otherName:(NSString *)otherName
- (MCOIMAPOperation *) deleteFolderOperation:(NSString *)folder
- (MCOIMAPOperation *) createFolderOperation:(NSString *)folder
-
- (MCOIMAPOperation *) subscribeFolderOperation:(NSString *)folder;
- (MCOIMAPOperation *) expungeOperation:(NSString *)folder;
- (MCOIMAPOperation *) unsubscribeFolderOperation:(NSString *)folder;
- (MCOIMAPOperation *) expungeOperation:(NSString *)folder;
- (MCOIMAPAppendMessageOperation
*)appendMessageOperationWithFolder:(NSString *)folder
messageData:(NSData *)messageData
flags:(MCOMessageFlag)flags;
- (MCOIMAPCopyMessagesOperation *)copyMessagesOperationWithFolder:(NSString *)folder uids:(MCOIndexSet *)uids destFolder:(NSString *)destFolder
- (MCOIMAPOperation *) storeFlagsOperationWithFolder:(NSString *)folder
uids:(MCOIndexSet *)uids
kind:(MCOIMAPStoreFlagsRequestKind)kind
flags:(MCOMessageFlag)flags;
- (MCOIMAPOperation *) storeLabelsOperationWithFolder:(NSString *)folder
uids:(MCOIndexSet *)uids
kind:(MCOIMAPStoreFlagsRequestKind)kind
labels:(NSArray *)labels;
- (MCOIMAPFetchMessagesOperation *)
fetchMessagesByUIDOperationWithFolder:(NSString *)folder
requestKind:(MCOIMAPMessagesRequestKind)requestKind
uids:(MCOIndexSet *)uids;
- (MCOIMAPFetchMessagesOperation *)
fetchMessagesByNumberOperationWithFolder:(NSString *)folder
requestKind:(MCOIMAPMessagesRequestKind)requestKind
numbers:(MCOIndexSet *)numbers;
- (MCOIMAPFetchContentOperation *)
fetchMessageByUIDOperationWithFolder:(NSString *)folder
uid:(uint32_t)uid
urgent:(BOOL)urgent;
- (MCOIMAPFetchContentOperation *) fetchMessageAttachmentByUIDOperationWithFolder:(NSString *)folder uid:(uint32_t)uid partID:(NSString *)partID encoding:(MCOEncoding)encoding urgent:(BOOL)urgent;
- (MCOIMAPSearchOperation *) searchOperationWithFolder:(NSString *)folder kind:(MCOIMAPSearchKind)kind searchString:(NSString *)searchString;
- (MCOIMAPSearchOperation *)
searchExpressionOperationWithFolder:(NSString *)folder
expression:(MCOIMAPSearchExpression *)expression;
- (MCOIMAPMessageRenderingOperation *)
htmlRenderingOperationWithMessage:(MCOIMAPMessage *)message
folder:(NSString *)folder;
- (MCOIMAPMessageRenderingOperation *)
htmlBodyRenderingOperationWithMessage:(MCOIMAPMessage *)message
folder:(NSString *)folder;
- (MCOIMAPMessageRenderingOperation *)
plainTextRenderingOperationWithMessage:(MCOIMAPMessage *)message folder:(NSString *)folder;
- (MCOIMAPMessageRenderingOperation *) plainTextBodyRenderingOperationWithMessage:(MCOIMAPMessage *)message
folder:(NSString *)folder;
(3) SMTP API
其基本属性和POP以及IMAP差不多,其主要功能是用来发送邮件。
- (MCOSMTPSendOperation *) sendOperationWithData:(NSData *)messageData;
- (MCOSMTPSendOperation *) sendOperationWithData:(NSData *)messageData
from:(MCOAddress *)from
recipients:(NSArray *)recipients;
(4) POP API
Pop会话的基本属性和IMAP类似,但请求有所变化,与IMAP有诸多不同。
- (MCOPOPFetchMessagesOperation *) fetchMessagesOperation;
- (MCOPOPFetchHeaderOperation *)
fetchHeaderOperationWithIndex:(unsigned int)index;
- (MCOPOPFetchMessageOperation *)
fetchMessageOperationWithIndex:(unsigned int)index;
- (MCOPOPOperation *)
deleteMessagesOperationWithIndexes:(MCOIndexSet *)indexes;
- (MCOPOPOperation *) disconnectOperation
邮件列表加载函数调用顺序说明:
加载masterViewController后,开始加载邮件
调用:
-(void)loadEmail
在loadEmail中,为了展示效果,首先从数据库加载邮件,调用:
- (void)loadEmailsWithCache:(BOOL)allowed,
然后执行新的邮件检测,调用:
- (void)checkNewEmailShouldSynchnize
而在这个函数中,我们要将上一次的邮件最大UID(已经缓存)和这一次的邮件最大UID做对比,如果存在差值,则证明有新邮件需要同步,否则直接返回,这样加快速度。
我们不知道哪些邮件需要同步,但我们肯定的是没有邮件概要的需要我们去同步,所以,当上面的提到的差值大于0时,那么我们得重新获取列表。拿到的就是最新的20封头,我们会去检测哪些是没有缓存的,这二十封邮件都要检测,是为了防止上次同步失败,当我们获得这个需要同步的邮件队列后,用GCD开启异步线程去加载邮件内容即调用:
- (void)asynchronousDownloadAllMessagesContent:(NSArray*)filteredMessages,
然后异步加载邮件body,调用:
- (void)downloadAllMeasseagesContentByMessages:(NSArray *)filteredMessages
AndFinishBlock:(ComplishBlock)finishBlock andIndex:(NSInteger)index
获取完成后,发送通知给Cell,由于cell携带email数据模型,对比下uid即可达到指定更新body的效果。
当所有需要同步的邮件完成UI更新时(cell上body变化),将此邮件列表交由后台处理,保存到数据库,这样FMDB不会占用主线程,所以邮件同步管理类调用:
//本地同步邮件列表数据数据到数据库
-(void)synEmailToDB