郵箱開發(fā)

前記:本文章是郵箱開發(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)功能。


IMAP接口模型

如圖所示: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)

IMAP會(huì)話狀態(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;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市玛瘸,隨后出現(xiàn)的幾起案子蜕青,更是在濱河造成了極大的恐慌,老刑警劉巖糊渊,帶你破解...
    沈念sama閱讀 223,207評(píng)論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件右核,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡渺绒,警方通過(guò)查閱死者的電腦和手機(jī)贺喝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)宗兼,“玉大人躏鱼,你說(shuō)我怎么就攤上這事∫笊埽” “怎么了染苛?”我有些...
    開封第一講書人閱讀 170,031評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)主到。 經(jīng)常有香客問(wèn)我茶行,道長(zhǎng),這世上最難降的妖魔是什么登钥? 我笑而不...
    開封第一講書人閱讀 60,334評(píng)論 1 300
  • 正文 為了忘掉前任畔师,我火速辦了婚禮,結(jié)果婚禮上怔鳖,老公的妹妹穿的比我還像新娘茉唉。我一直安慰自己,他們只是感情好结执,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,322評(píng)論 6 398
  • 文/花漫 我一把揭開白布度陆。 她就那樣靜靜地躺著,像睡著了一般献幔。 火紅的嫁衣襯著肌膚如雪懂傀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,895評(píng)論 1 314
  • 那天蜡感,我揣著相機(jī)與錄音蹬蚁,去河邊找鬼恃泪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛犀斋,可吹牛的內(nèi)容都是我干的贝乎。 我是一名探鬼主播,決...
    沈念sama閱讀 41,300評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼叽粹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼览效!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起虫几,我...
    開封第一講書人閱讀 40,264評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤锤灿,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后辆脸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體但校,經(jīng)...
    沈念sama閱讀 46,784評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,870評(píng)論 3 343
  • 正文 我和宋清朗相戀三年啡氢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了状囱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,989評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡空执,死狀恐怖浪箭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情辨绊,我是刑警寧澤奶栖,帶...
    沈念sama閱讀 36,649評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站门坷,受9級(jí)特大地震影響宣鄙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜默蚌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,331評(píng)論 3 336
  • 文/蒙蒙 一冻晤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绸吸,春花似錦鼻弧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,814評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至码俩,卻和暖如春度帮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背稿存。 一陣腳步聲響...
    開封第一講書人閱讀 33,940評(píng)論 1 275
  • 我被黑心中介騙來(lái)泰國(guó)打工笨篷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瞳秽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,452評(píng)論 3 379
  • 正文 我出身青樓率翅,卻偏偏與公主長(zhǎng)得像练俐,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子安聘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,995評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容