前記:本文章是郵箱開發(fā)協(xié)議層開發(fā)的說(shuō)明文檔,并結(jié)合IOS MailCore 2框架進(jìn)行比對(duì)學(xué)習(xí)校翔,以期對(duì)郵箱開發(fā)有更好的理解弟跑。
第一章 IMAP
1、IMAP簡(jiǎn)介
1.1 IMAP 和 POP區(qū)別
1)防症、POP不能方便的處理多個(gè)信箱孟辑,IMAP可通過(guò)提供多個(gè)遠(yuǎn)程信箱的訪問(wèn)和在遠(yuǎn)程服務(wù)器上保留全部信件的能力。
2)蔫敲、POP不能很好的解決多客戶端對(duì)同一信箱的訪問(wèn)饲嗽。IMAP支持多個(gè)用戶作為不同標(biāo)識(shí)訪問(wèn)同一文件夾。
3)奈嘿、IMAP支持信件和MIME結(jié)構(gòu)貌虾,客戶端不需要做復(fù)雜的信件結(jié)構(gòu)分析。
1.2 接口模型
1)裙犹、MUA尽狠,MTA與MDA基本概念
MUA(Mail User Agent):顧名思義衔憨,MUA就是“郵件用戶代理”。郵件需要代理袄膏,這是由于通常Client端的計(jì)算機(jī)無(wú)法直接寄信(不然為什么要郵件主機(jī)践图?),所以沉馆,需要通過(guò)MUA幫我們傳遞信件平项,不論是送信還是收信,Client端用戶都需要通過(guò)各個(gè)操作系統(tǒng)提供的MUA才能夠使用郵件系統(tǒng)悍及。舉個(gè)例子闽瓢,Windows里的OutLook Express、Netscape里的mail功能與KDE里的Kmail都是MUA心赶。MUA主要的功能就是接收郵件主機(jī)的電子郵件扣讼,并提供用戶瀏覽與編寫郵件的功能。
MTA(Mail Transfer Agent):MUA是用在Client端的軟件缨叫,而MTA是用在郵件主機(jī)上的軟件椭符,它也是主要的郵件服務(wù)器。MTA就是“郵件傳送代理”的意思耻姥,既然是“傳送代理”销钝,那么用戶寄信與收信時(shí),都找MTA就對(duì)了琐簇!因?yàn)樗?fù)責(zé)幫用戶傳送蒸健。基本上婉商,MTA的功能如下似忧。
接收外部主機(jī)寄來(lái)的信件:既然是郵件主機(jī),接收信件自然是主要功能丈秩,只要這個(gè)信件里有MTA內(nèi)部賬號(hào)盯捌,這封信就會(huì)被MTA收下來(lái);
幫用戶發(fā)(寄出)信:既然可以收信蘑秽,自然也可以發(fā)信饺著,只要用戶具有合法的使用MTA的權(quán)力,就可以利用這臺(tái)MTA主機(jī)把信傳送出去肠牲!不過(guò)要注意幼衰,MTA會(huì)將信件送給目的地的MTA而不是目的地的MUA。不要搞錯(cuò)了埂材!
曾經(jīng)有個(gè)朋友跟我說(shuō)塑顺,要我傳數(shù)據(jù)給他,因?yàn)樗邮瘴业男偶运挠?jì)算機(jī)(指的是Windows那個(gè)Client端計(jì)算機(jī))得一直開著严拒,真是不方便扬绪!聽(tīng)到這句話時(shí),我嚇了一跳——這個(gè)概念是不對(duì)的裤唠,因?yàn)橛脩羰褂玫氖荕UA挤牛,而信件僅會(huì)送達(dá)MTA主機(jī)上,收种蘸、發(fā)信件時(shí)墓赴,都需要通過(guò)MTA幫忙處理,所以航瞭,用戶在使用郵件編輯器“MUA”將數(shù)據(jù)編輯完畢之后诫硕,按下送出承粤,并且成功送到MTA之后粘咖,接下來(lái)的事情就是MTA的工作了,跟用戶的Client端計(jì)算機(jī)沒(méi)有關(guān)系瘫怜。
用戶收自己的信:用戶可以將放置在郵件主機(jī)的信件收到自己的個(gè)人計(jì)算機(jī)上滨彻。
MDA(Mail Delivery Agent):“郵件投遞代理”主要的功能就是將MTA接收的信件依照信件的流向(送到哪里)將該信件放置到本機(jī)賬戶下的郵件文件中(收件箱)藕届,或者再經(jīng)由MTA將信件送到下個(gè)MTA。如果信件的流向是到本機(jī)亭饵,這個(gè)郵件代理的功能就不只是將由MTA傳來(lái)的郵件放置到每個(gè)用戶的收件箱休偶,它還可以具有郵件過(guò)濾(filtering)與其他相關(guān)功能。
如圖所示:MTA接收到達(dá)的電子郵件辜羊、并把它提交給一個(gè)MDA踏兜,由它把電子郵件投遞給一個(gè)信箱。IMAP客戶機(jī)管理它的本地信箱只冻,并與IMAP服務(wù)器通信管理它的遠(yuǎn)程信箱庇麦。IMAP服務(wù)器提供了一個(gè)遠(yuǎn)程客戶機(jī)與存放在服務(wù)器上的信箱之間的接口。
IMAP允許多個(gè)客戶機(jī)同時(shí)訪問(wèn)同一個(gè)信箱喜德,如果一個(gè)客戶機(jī)刪除里一個(gè)客戶機(jī)已經(jīng)選擇的信箱中的信件,IMAP服務(wù)器會(huì)通知客戶機(jī)的變化垮媒。
1.3 協(xié)議狀態(tài)
客戶機(jī)一旦連接到服務(wù)器舍悯,服務(wù)器就會(huì)輸出一個(gè)連接問(wèn)候,客戶機(jī)使用這個(gè)問(wèn)候確定服務(wù)器是否愿意進(jìn)行對(duì)話睡雇,以及服務(wù)器所處的狀態(tài)萌衬。
會(huì)話通常從未驗(yàn)證狀態(tài)開始,除非會(huì)話已經(jīng)預(yù)先進(jìn)行驗(yàn)證它抱。在這個(gè)狀態(tài)中秕豫,只需要少量的命令來(lái)驗(yàn)證。
在客戶機(jī)對(duì)服務(wù)器確認(rèn)身份后,會(huì)話進(jìn)入已驗(yàn)證狀態(tài)混移,這時(shí)有更多的命令可以使用祠墅。為了使用特定的信箱,客戶機(jī)必須發(fā)出select或者examine命令進(jìn)入select(選擇)狀態(tài)歌径。如果命令失敗毁嗦,會(huì)話保持在selected狀態(tài)中。一旦處于authenticated狀態(tài)回铛,它保持在那里狗准,直到準(zhǔn)備終止,或者發(fā)出close命令茵肃。
最后的狀態(tài)是logout(注銷)腔长,它是準(zhǔn)備連接終止。當(dāng)客戶機(jī)發(fā)出logout命令验残,或者在服務(wù)器決定關(guān)閉連接時(shí)捞附,進(jìn)入這個(gè)狀態(tài)。
1.4 命令和應(yīng)答
- IMAP僅僅規(guī)定了一個(gè)超時(shí)值胚膊,一個(gè)不活動(dòng)自動(dòng)注銷的定時(shí)器故俐,限制客戶機(jī)的空閑時(shí)間。
- 命令行和應(yīng)答行不區(qū)分大小寫紊婉。
1.5 狀態(tài)應(yīng)答
狀態(tài)應(yīng)答是服務(wù)器發(fā)送命令或會(huì)話狀態(tài)給客戶機(jī)的主要途徑药版。
- 兩種類型的狀態(tài)應(yīng)答
1)、標(biāo)記狀態(tài)應(yīng)答
標(biāo)記狀態(tài)應(yīng)答也稱為完整狀態(tài)應(yīng)答喻犁,在應(yīng)答行的第一個(gè)字段含有一個(gè)標(biāo)記槽片,指示特定的命令是成功、失敗肢础,還是其他類型的協(xié)議錯(cuò)誤还栓。
2)、非標(biāo)記狀態(tài)應(yīng)答
非標(biāo)記應(yīng)答在應(yīng)答行的第一個(gè)字段含有一個(gè)“*”字符传轰,傳遞與特定的命令不直接關(guān)聯(lián)的信息剩盒。包括狀態(tài)應(yīng)答和服務(wù)器數(shù)據(jù)。 - 常用應(yīng)答狀態(tài)碼
1)慨蛙、OK應(yīng)答
OK應(yīng)答有兩種用法辽聊。當(dāng)在標(biāo)記應(yīng)答中使用時(shí),它指示該標(biāo)記標(biāo)識(shí)的命令成功的完成期贫。當(dāng)在非標(biāo)記應(yīng)答中跟匆,它是來(lái)自服務(wù)器的信息信件,可以是任意想要的類型通砍。
eg: a042 noop
標(biāo)記狀態(tài)應(yīng)答:
a042 ok noop completed
非標(biāo)記狀態(tài)應(yīng)答:
* OK imap.example.com server ready
2)玛臂、NO應(yīng)答
eg:a030 create team-notes
標(biāo)記狀態(tài)應(yīng)答:
a030 no mailbox already esists
非標(biāo)記狀態(tài)應(yīng)答:
* no [alert] MailBox is at 95% quota
3)、BAD應(yīng)答
eg:a1035 noop blurp
標(biāo)記狀態(tài)應(yīng)答:
a1035 bad invalid argument
非標(biāo)記狀態(tài)應(yīng)答:
* bad missing tag
4)、PREAUTH應(yīng)答
PREAUTH 狀態(tài)應(yīng)答僅在會(huì)話開始的時(shí)候看到迹冤,僅作為非標(biāo)記應(yīng)答發(fā)送
e.g
* preauth localhost server ready
5)讽营、BYE應(yīng)答
僅作為非標(biāo)記應(yīng)答發(fā)送
e.g
* bye server loging out
1.6 服務(wù)器數(shù)據(jù)
1)、簡(jiǎn)介
定義:除應(yīng)答狀態(tài)外叁巨,服務(wù)器也可以發(fā)送服務(wù)器數(shù)據(jù)斑匪。且服務(wù)器數(shù)據(jù)總是非標(biāo)記的。
組成: 信件文件锋勺、信件標(biāo)志蚀瘸、信箱列表、搜索結(jié)果和服務(wù)器功能等庶橱。
具體的關(guān)鍵字會(huì)在后面章節(jié)介紹贮勃。
1.7 關(guān)于多個(gè)等待處理的命令
- SMTP支持命令的順序執(zhí)行(流水線)。
- SMTP還支持多個(gè)等待命令按任意順序處理(非流水線處理)苏章。
在非流水線處理模式中:需注意多個(gè)命令不引入二義性
假設(shè)同時(shí)發(fā)出一個(gè)rename 和 create命令
//1寂嘉、按順序執(zhí)行
b285 rename status-reports status-reports-old
b286 create status-reports
// 執(zhí)行結(jié)果
b285 OK rename completed
b286 OK create completed
//2、加入命令按相反順序執(zhí)行
b285 rename status-reports status-reports-old
b286 create status-reports
// 執(zhí)行結(jié)果
b286 no mailbox already exitsts
b285 OK rename completed
2枫绅、IMAP數(shù)據(jù)對(duì)象
2.1 NIL
表示不存在的值的地方使用的一個(gè)符號(hào)泉孩。
2.2 郵箱名
- 信箱名是IMAP中的文字量,使用一個(gè)字符串作為語(yǔ)法元素并淋。
- 在各大廠商中的郵件協(xié)議中只有一個(gè)特殊的信箱名:INBOX寓搬,這是指用于存儲(chǔ)到達(dá)電子郵箱的主信箱。且不區(qū)分大小寫县耽。
- 在各大廠商的其他(除INBOX)的郵箱名可能不禁相同句喷,比如有的廠商的發(fā)送箱寫作:Send Mail但是可能其他廠商會(huì)寫作:send-mail。
2.3 內(nèi)部日期
表示當(dāng)一個(gè)電子郵件加載到信箱中時(shí)兔毙,指定的一個(gè)內(nèi)部日期唾琼,即收到(或發(fā)送)信件的時(shí)間和日期。
2.4 大小
表示郵件數(shù)據(jù)大小的數(shù)值澎剥。
2.5 sequence-num
- 用來(lái)標(biāo)識(shí)當(dāng)前信件在整個(gè)信件集合中的位置锡溯。
- 需要注意的是:某個(gè)信件在信件集合中的位置不是一成不變的,一個(gè)具體的例子哑姚,當(dāng)用用戶在A客戶端登錄趾唱,他對(duì)信件標(biāo)號(hào)為5的信件感興趣,端來(lái)A客戶端蜻懦,在B客戶端中登錄他刪除的了信件標(biāo)號(hào)為2的信件,此時(shí)再次登錄A客戶端時(shí)夕晓,原來(lái)標(biāo)識(shí)為5 的信件將會(huì)被更改為4宛乃。這在信箱的數(shù)據(jù)緩存時(shí)應(yīng)有相應(yīng)的策略來(lái)解決這個(gè)問(wèn)題。
2.6 唯一標(biāo)識(shí)符 UID
- 概念:信件放在信箱中時(shí),IMAP給每個(gè)信件指定的一個(gè)唯一的標(biāo)識(shí)符征炼。
- 類型:32位整數(shù)
- 唯一標(biāo)識(shí)符按遞增的順序進(jìn)行分配析既,但是不要求是連續(xù)的,但這些數(shù)字必須是升序的谆奥。
- 不變性:不管郵箱中信件的增刪都不會(huì)影響郵件的唯一標(biāo)識(shí)符的改變眼坏。
2.7 信件標(biāo)志
- 概念:用來(lái)標(biāo)識(shí)一個(gè)郵件的信息狀態(tài)。常見(jiàn)的標(biāo)志有:新郵件酸些、已閱郵件宰译、已讀郵件、未讀郵件魄懂、刪除郵件沿侈、星標(biāo)郵件。
- 用戶在客戶端開發(fā)時(shí)可進(jìn)行自定義的郵件市栗。
@interface MCOIMAPMessage : MCOAbstractMessage <NSCoding>
/** IMAP UID of the message. */
@property (nonatomic, assign) uint32_t uid;
/** IMAP sequence number of the message.
@warning *Important*: This property won't be serialized. */
@property (nonatomic, assign) uint32_t sequenceNumber;
/* Size of the entire message */
@property (nonatomic, assign) uint32_t size;
/** Flags of the message, like if it is deleted, read, starred etc */
@property (nonatomic, assign) MCOMessageFlag flags;
/** The contents of the message flags when it was fetched from the server */
@property (nonatomic, assign) MCOMessageFlag originalFlags;
/** Flag keywords of the message, mostly custom flags */
@property (nonatomic, copy) NSArray * /* NSString */ customFlags;
/** It's the last modification sequence value of the message synced from the server. See RFC4551 */
@property (nonatomic, assign) uint64_t modSeqValue;
/** Main MIME part of the message */
@property (nonatomic, retain) MCOAbstractPart * mainPart;
/** All Gmail labels of the message */
@property (nonatomic, copy) NSArray * /* NSString */ gmailLabels;
/** Gmail message ID of the message */
@property (nonatomic, assign) uint64_t gmailMessageID;
/** Gmail thread ID of the message */
@property (nonatomic, assign) uint64_t gmailThreadID;
/**
Returns the part with the given part identifier.
@param partID A part identifier looks like 1.2.1
*/
- (MCOAbstractPart *) partForPartID:(NSString *)partID;
/**
HTML rendering of the message to be displayed in a web view.
The delegate should implement at least
[MCOAbstractMessage:dataForIMAPPart:folder:]
so that the complete HTML rendering can take place.
*/
- (NSString *) htmlRenderingWithFolder:(NSString *)folder
delegate:(id <MCOHTMLRendererIMAPDelegate>)delegate;
@end
2.8 信件結(jié)構(gòu)
- 關(guān)鍵字段列表
1缀拭、 Date(發(fā)送或收件時(shí)間,date類型)
2填帽、 Subject (主題蛛淋,字符串類型)
3、 From (信件來(lái)自篡腌,地址類型)
4褐荷、 Sender (發(fā)送者,地址類型)
5哀蘑、 Reply-To (回復(fù)诚卸,數(shù)組類型,數(shù)組元素為地址類型)
6绘迁、 To (發(fā)送至合溺,數(shù)組類型,數(shù)組元素為地址類型)
7缀台、 Cc (抄送棠赛,數(shù)組類型,數(shù)組元素為地址類型)
8膛腐、 Bcc (密送睛约,數(shù)組類型,數(shù)組元素為地址類型)
9哲身、 Message-ID (信件標(biāo)志辩涝,字符串類型)
- 由上面可見(jiàn)Subject、Message-ID是字符串類型勘天,而From怔揩、Sender捉邢、From、To商膊、Cc伏伐、Bcc 都是地址類型。以下是MailCore 2框架中MCOMessageHeader中的參數(shù)晕拆,從中可以看出更詳細(xì)的關(guān)于郵箱Header的信息藐翎。
@interface MCOMessageHeader : NSObject <NSCopying, NSCoding>
/** Message-ID field.*/
@property (nonatomic, copy) NSString * messageID;
/** Message-ID auto-generated flag.*/
@property (nonatomic, readonly, getter=isMessageIDAutoGenerated) BOOL messageIDAutoGenerated;
/** References field. It's an array of message-ids.*/
@property (nonatomic, copy) NSArray * /* NSString */ references;
/** In-Reply-To field. It's an array of message-ids.*/
@property (nonatomic, copy) NSArray * /* NSString */ inReplyTo;
/** Date field: sent date of the message.*/
@property (nonatomic, strong) NSDate * date;
/** Received date: received date of the message.*/
@property (nonatomic, strong) NSDate * receivedDate;
/** Sender field.*/
@property (nonatomic, copy) MCOAddress * sender;
/** From field: address of the sender of the message.*/
@property (nonatomic, copy) MCOAddress * from;
/** To field: recipient of the message. It's an array of MCOAddress.*/
@property (nonatomic, copy) NSArray * /* MCOAddress */ to;
/** Cc field: cc recipient of the message. It's an array of MCOAddress.*/
@property (nonatomic, copy) NSArray * /* MCOAddress */ cc;
/** Bcc field: bcc recipient of the message. It's an array of MCOAddress.*/
@property (nonatomic, copy) NSArray * /* MCOAddress */ bcc;
/** Reply-To field. It's an array of MCOAddress.*/
@property (nonatomic, copy) NSArray * /* MCOAddress */ replyTo;
/** Subject of the message.*/
@property (nonatomic, copy) NSString * subject;
/** Email user agent name: X-Mailer header.*/
@property (nonatomic, copy) NSString * userAgent;
/** Returns a header created from RFC 822 data.*/
+ (MCOMessageHeader *) headerWithData:(NSData *)data;
/** Initialize a header with RFC 822 data.*/
- (instancetype) initWithData:(NSData *)data;
/** Adds a custom header.*/
- (void) setExtraHeaderValue:(NSString *)value forName:(NSString *)name;
/** Remove a given custom header.*/
- (void) removeExtraHeaderForName:(NSString *)name;
/** Returns the value of a given custom header.*/
- (NSString *) extraHeaderValueForName:(NSString *)name;
/** Returns an array with the names of all custom headers.*/
- (NSArray * /* NSString */) allExtraHeadersNames;
/** Extracted subject (also remove square brackets).*/
- (NSString *) extractedSubject;
/** Extracted subject (don't remove square brackets).*/
- (NSString *) partialExtractedSubject;
/** Fill the header using the given RFC 822 data.*/
- (void) importHeadersData:(NSData *)data;
/** Returns a header that can be used as a base for a reply message.*/
- (MCOMessageHeader *) replyHeaderWithExcludedRecipients:(NSArray * /* MCOAddress */)excludedRecipients;
/** Returns a header that can be used as a base for a reply all message.*/
- (MCOMessageHeader *) replyAllHeaderWithExcludedRecipients:(NSArray * /* MCOAddress */)excludedRecipients;
/** Returns a header that can be used as a base for a forward message.*/
- (MCOMessageHeader *) forwardHeader;
@end
// 地址結(jié)構(gòu)是用圓括號(hào)列表表示:
liuweihua<645565656@qq.com>
//圓括號(hào)表示為:
("liuweihua" NIL "645565656" "qq.com")
// 說(shuō)明
// 地址結(jié)構(gòu)是有個(gè)圓括號(hào)列表好友電子郵件地址的分析元素。這些元素
// 按照個(gè)人按照個(gè)人名稱实幕、SMTP吝镣、源路由、信箱名茬缩、和域名列出
-
地址結(jié)構(gòu)
地址列表
一下摘自MailCore 2 MCOAddress(地址結(jié)構(gòu)類的接口文檔)從中可以更好的看出地址結(jié)構(gòu)的內(nèi)容赤惊。
@interface MCOAddress : NSObject <NSCopying, NSCoding>
/** Creates an address with a display name and a mailbox.
Example: [MCOAddress addressWithDisplayName:@"DINH Viêt Hoà" mailbox:@"hoa@etpan.org"] */
+ (MCOAddress *) addressWithDisplayName:(NSString *)displayName
mailbox:(NSString *)mailbox;
/** Creates an address with only a mailbox.
Example: [MCOAddress addressWithMailbox:@"hoa@etpan.org"]*/
+ (MCOAddress *) addressWithMailbox:(NSString *)mailbox;
/** Creates an address with a RFC822 string.
Example: [MCOAddress addressWithRFC822String:@"DINH Vi=C3=AAt Ho=C3=A0 <hoa@etpan.org>"]*/
+ (MCOAddress *) addressWithRFC822String:(NSString *)RFC822String;
/** Creates an address with a non-MIME-encoded RFC822 string.
Example: [MCOAddress addressWithNonEncodedRFC822String:@"DINH Viêt Hoà <hoa@etpan.org>"]*/
+ (MCOAddress *) addressWithNonEncodedRFC822String:(NSString *)nonEncodedRFC822String;
/**
Returns an NSArray of MCOAddress objects that contain the parsed
forms of the RFC822 encoded addresses.
For example: @[ @"DINH Vi=C3=AAt Ho=C3=A0 <hoa@etpan.org>" ]*/
+ (NSArray *) addressesWithRFC822String:(NSString *)string;
/**
Returns an NSArray of MCOAddress objects that contain the parsed
forms of non-encoded RFC822 addresses.
For example: @[ "DINH Viêt Hoà <hoa@etpan.org>" ]*/
+ (NSArray *) addressesWithNonEncodedRFC822String:(NSString *)string;
/** Returns the display name of the address.*/
@property (nonatomic, copy) NSString * displayName;
/** Returns the mailbox of the address.*/
@property (nonatomic, copy) NSString * mailbox;
/** Returns the RFC822 encoding of the address.
For example: "DINH Vi=C3=AAt Ho=C3=A0 <hoa@etpan.org>"*/
- (NSString *) RFC822String;
/** Returns the non-MIME-encoded RFC822 encoding of the address.
For example: "DINH Viêt Hoà <hoa@etpan.org>"*/
- (NSString *) nonEncodedRFC822String;
- 信件結(jié)構(gòu)體
IMAP在云括號(hào)列表中提供了另外一種數(shù)據(jù)結(jié)構(gòu),即信件體結(jié)構(gòu)凰锡,它是信件的MIME結(jié)構(gòu)的分析表示未舟。
主要分為:非多部件(nom-multipart)和多部件(multipart)兩個(gè)主要結(jié)構(gòu)。
//MIME 媒體類型
//Content-Type 內(nèi)容類型
//Content-ID 內(nèi)容ID
//Content-Description 內(nèi)容描述
//Content-Transfer-Encoding 傳輸加密方式
typedef NS_ENUM(NSInteger, MCOEncoding) {
/** 7bit encoding.*/
MCOEncoding7Bit = 0, /** should match MAILIMAP_BODY_FLD_ENC_7BIT*/
/** 8bit encoding.*/
MCOEncoding8Bit = 1, /** should match MAILIMAP_BODY_FLD_ENC_8BIT*/
/** binary encoding.*/
MCOEncodingBinary = 2, /** should match MAILIMAP_BODY_FLD_ENC_BINARY*/
/** base64 encoding.*/
MCOEncodingBase64 = 3, /** should match MAILIMAP_BODY_FLD_ENC_BASE64*/
/** quoted-printable encoding.*/
MCOEncodingQuotedPrintable = 4, /** should match MAILIMAP_BODY_FLD_ENC_QUOTED_PRINTABLE*/
/** other encoding.*/
MCOEncodingOther = 5, /** should match MAILIMAP_BODY_FLD_ENC_OTHER*/
/** Negative values should be used for encoding not supported by libetpan.*/
/** UUEncode encoding.*/
MCOEncodingUUEncode = -1
};
@interface MCOIMAPPart : MCOAbstractPart <NSCoding>
/** A part identifier looks like 1.2.1 */
@property (nonatomic, copy) NSString * partID;
/** The size of the single part in bytes */
@property (nonatomic, nonatomic) unsigned int size;
/** It's the encoding of the single part */
@property (nonatomic, nonatomic) MCOEncoding encoding;
/**
Returns the decoded size of the part.
For example, for a part that's encoded with base64, it will return actual_size * 3/4.
*/
- (unsigned int) decodedSize;
@end
3掂为、標(biāo)準(zhǔn)命令
3.1 capability
// capability 命令返回服務(wù)器功能的列表裕膀,包括版本信息,以及支持的驗(yàn)證機(jī)制和擴(kuò)展勇哗。
tag SP "capability"
//服務(wù)器應(yīng)答:
"*" SP "capability" 1* (SP capalibity-item)
// MailCore 2 提供了相應(yīng)的接口
/**
Returns an operation to request capabilities of the server.
See MCOIMAPCapability for the list of capabilities.
canIdle = NO;
MCOIMAPCapabilityOperation * op = [session capabilityOperation];
[op start:^(NSError * __nullable error, MCOIndexSet * capabilities) {
if ([capabilities containsIndex:MCOIMAPCapabilityIdle]) {
canIdle = YES;
}
}];
*/
- (MCOIMAPCapabilityOperation *) capabilityOperation;
3.2 noop
// 什么也不做總是成功昼扛,如果客戶機(jī)沒(méi)有其他命令需要發(fā)送的話,
//它可以使用這個(gè)命令周期性的查詢狀態(tài)更新欲诺,也可以用于復(fù)位不活動(dòng)的自動(dòng)注銷定時(shí)器
tag SP "noop"
//MailCore 2 也提供了相應(yīng)的接口信息
/**
Returns an operation that will perform a No-Op operation on the given IMAP server.
MCOIMAPOperation * op = [session noopOperation];
[op start:^(NSError * __nullable error) {
...
}];
*/
- (MCOIMAPOperation *) noopOperation;
3.3 Logout
// 退出IMAP會(huì)話抄谐,服務(wù)器發(fā)送一個(gè)BYE應(yīng)答行,然后關(guān)閉連接扰法。
tag SP "logout"
// MailCore 2 也提供了相應(yīng)的接口信息
/**
Returns an operation to disconnect the session.
It will disconnect all the sockets created by the session.
MCOIMAPOperation * op = [session disconnectOperation];
[op start:^(NSError * __nullable error) {
...
}];
*/
- (MCOIMAPOperation *) disconnectOperation;
3.4 Login
tag SP "login" SP user-name SP password
//login用于驗(yàn)證客戶端蛹含,如果該命令成功,會(huì)話狀態(tài)進(jìn)入
//authenticated塞颁,如果因?yàn)槟硞€(gè)原因?qū)е碌卿浭浦箱。?//服務(wù)器發(fā)送NO應(yīng)答,并保持noauthenticated狀態(tài)祠锣。
//MailCore 2 提供了相應(yīng)的接口
/**
Returns an operation that will check whether the IMAP account is valid.
MCOIMAPOperation * op = [session checkAccountOperation];
[op start:^(NSError * __nullable error) {
...
}];
*/
- (MCOIMAPOperation *) checkAccountOperation;
3.5 creat
// creat 命令在服務(wù)器上創(chuàng)建制定的信箱酷窥。
// 如果該信箱已經(jīng)存在,則這個(gè)命令將失效伴网。
// mailCore 2 中相應(yīng)的代碼示例為:
/**
Returns an operation that creates a new folder
MCOIMAPOperation * op = [session createFolderOperation:@"holidays 2013"];
[op start:^(NSError * __nullable error) {
...
}];
*/
- (MCOIMAPOperation *) createFolderOperation:(NSString *)folder;
3.6 delete
//delete 刪除指定的郵箱
//MailCore 2 提供了相應(yīng)的接口:
/**
Create an operation for deleting a folder
MCOIMAPOperation * op = [session deleteFolderOperation:@"holidays 2009"];
[op start:^(NSError * __nullable error) {
...
}]];
*/
- (MCOIMAPOperation *) deleteFolderOperation:(NSString *)folder;
3.7 rename
// 改變信箱的名稱
//MailCore 2 提供了相應(yīng)的接口:
/**
Creates an operation for renaming a folder
MCOIMAPOperation * op = [session renameFolderOperation:@"my documents" otherName:@"Documents"];
[op start:^(NSError * __nullable error) {
...
}];
*/
- (MCOIMAPOperation *) renameFolderOperation:(NSString *)folder otherName:(NSString *)otherName;
3.8 status
// 返回指定信箱的狀態(tài)信息
//關(guān)鍵字:
// messages:信箱中的心劍術(shù)
// recent :最近信件數(shù)
// uidnext:將分配給新郵件的下一個(gè)uid
// uidvalidity:信箱的唯一合法性值
// unseen: 未讀新建的標(biāo)識(shí)
// mailCore 2 給出相應(yīng)的接口:
/**
Returns an operation that retrieves folder status (like UIDNext - Unseen -)
MCOIMAPFolderStatusOperation * op = [session folderStatusOperation:@"INBOX"];
[op start:^(NSError *error, MCOIMAPFolderStatus * info) {
NSLog(@"UIDNEXT: %lu", (unsigned long) [info uidNext]);
NSLog(@"UIDVALIDITY: %lu", (unsigned long) [info uidValidity]);
NSLog(@"messages count: %lu", [info totalMessages]);
}];
*/
- (MCOIMAPFolderStatusOperation *) folderStatusOperation:(NSString *)folder;
3.9 select/examine
// 打開信箱進(jìn)行讀寫訪問(wèn)蓬推,允許訪問(wèn)其中的信件
3.10 close
關(guān)閉目前選擇的信箱,如果信箱是可寫的澡腾,它還清理設(shè)置為刪除標(biāo)志的信件拳氢。
3.11 subscribe
// 在某些情況下募逞,List命令并不適合獲取郵箱列表,例如在服務(wù)器可能
有幾千個(gè)新聞組馋评,新聞閱讀客戶端提供預(yù)定和取消預(yù)定的能力,允許用戶
避免查看不感興趣的新聞組刺啦。這時(shí)可通過(guò)預(yù)定(subscribe)來(lái)進(jìn)行郵件的預(yù)定
/**
Returns an operation to subscribe to a folder.
MCOIMAPOperation * op = [session createFolderOperation:@"holidays 2013"];
[op start:^(NSError * __nullable error) {
if (error != nil)
return;
MCOIMAPOperation * op = [session subscribeFolderOperation:@"holidays 2013"];
...
}];
*/
- (MCOIMAPOperation *) subscribeFolderOperation:(NSString *)folder;
3.12 unsubscribe
// 取消預(yù)定
/**
Returns an operation to unsubscribe from a folder.
MCOIMAPOperation * op = [session unsubscribeFolderOperation:@"holidays 2009"];
[op start:^(NSError * __nullable error) {
if (error != nil)
return;
MCOIMAPOperation * op = [session deleteFolderOperation:@"holidays 2009"]
...
}];
*/
- (MCOIMAPOperation *) unsubscribeFolderOperation:(NSString *)folder;
3.13 copy
// 把一組信件復(fù)制到制定的信箱留特,保留他們的標(biāo)志和內(nèi)部信息
/**
Returns an operation to copy messages to a folder.
MCOIMAPCopyMessagesOperation * op = [session copyMessagesOperationWithFolder:@"INBOX"
uids:[MCIndexSet indexSetWithIndex:456]
destFolder:@"Cocoa"];
[op start:^(NSError * __nullable error, NSDictionary * uidMapping) {
NSLog(@"copied to folder with UID mapping %@", uidMapping);
}];
*/
- (MCOIMAPCopyMessagesOperation *)copyMessagesOperationWithFolder:(NSString *)folder
uids:(MCOIndexSet *)uids
destFolder:(NSString *)destFolder NS_RETURNS_NOT_RETAINED;
3.14 check
// 允許客戶機(jī)出發(fā)當(dāng)前選擇信箱的一個(gè)檢查點(diǎn)
3.15 search
// 獲取匹配的信件
/**
Returns an operation to search for messages with a simple match.
MCOIMAPSearchOperation * op = [session searchOperationWithFolder:@"INBOX"
kind:MCOIMAPSearchKindFrom
searchString:@"laura"];
[op start:^(NSError * __nullable error, MCOIndexSet * searchResult) {
...
}];
*/
- (MCOIMAPSearchOperation *) searchOperationWithFolder:(NSString *)folder
kind:(MCOIMAPSearchKind)kind
searchString:(NSString *)searchString;
/**
3.16 fetch
//獲取郵箱的制定數(shù)據(jù)項(xiàng)
/** @name Fetching Messages */
/**
Returns an operation to fetch messages by UID.
MCOIMAPFetchMessagesOperation * op = [session fetchMessagesByUIDOperationWithFolder:@"INBOX"
requestKind:MCOIMAPMessagesRequestKindHeaders | MCOIMAPMessagesRequestKindStructure
uids:MCORangeMake(1, UINT64_MAX)];
[op start:^(NSError * __nullable error, NSArray * messages, MCOIndexSet * vanishedMessages) {
for(MCOIMAPMessage * msg in messages) {
NSLog(@"%lu: %@", [msg uid], [msg header]);
}
}];
*/
- (MCOIMAPFetchMessagesOperation *) fetchMessagesByUIDOperationWithFolder:(NSString *)folder
requestKind:(MCOIMAPMessagesRequestKind)requestKind
uids:(MCOIndexSet *)uids DEPRECATED_ATTRIBUTE;
3.17 store
// 更改制定新建組的信件標(biāo)志
/**
Returns an operation to change flags of messages.
For example: Adds the seen flag to the message with UID 456.
MCOIMAPOperation * op = [session storeFlagsOperationWithFolder:@"INBOX"
uids:[MCOIndexSet indexSetWithIndex:456]
kind:MCOIMAPStoreFlagsRequestKindAdd
flags:MCOMessageFlagSeen];
[op start:^(NSError * __nullable error) {
...
}];
*/
- (MCOIMAPOperation *) storeFlagsOperationWithFolder:(NSString *)folder
uids:(MCOIndexSet *)uids
kind:(MCOIMAPStoreFlagsRequestKind)kind
flags:(MCOMessageFlag)flags;
3.18 expunge
//永久刪除當(dāng)前選擇信箱中設(shè)置為刪除標(biāo)志的郵件
/**
Returns an operation to expunge a folder.
MCOIMAPOperation * op = [session expungeOperation:@"INBOX"];
[op start:^(NSError * __nullable error) {
...
}];
*/
- (MCOIMAPOperation *) expungeOperation:(NSString *)folder;