mailcore(一)
? ? ? ?pop3協(xié)議規(guī)定了郵件客戶端與pop3服務器之間的通信規(guī)則。一共定義了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> ? ?查詢郵箱中的統(tǒng)計信息,+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協(xié)議相關的API:
? ? ? ?MCOPOPSession封裝了pop3客戶端與pop3服務器之間的通訊底層細節(jié)。
- (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協(xié)議規(guī)定了郵件客戶端與smtp服務器之間,以及兩臺smtp服務器之間的通訊規(guī)則。雖然smtp協(xié)議一共定義了18條命令,但是通常只需用到其中的6條命令,
? ?ehlo<SP>domain<CRLF> domain表示郵件發(fā)送者的主機名。郵件服務器返回的信息中包含支持的auth方式。
? ?auth<SP>(para)<CRLF> 指定認證方式。接下來要輸入base64編碼的username和pwd了。
? ?mail<SP>FROM:address<CRLF> 指定發(fā)件人的郵箱地址
? ?rept<SP>TO:address<CRLF> 指定收件人的郵箱地址
? ?data<CRLF> 表示數據區(qū)域開始,這個命令后面的所有內容都將被當成郵件內容,直到遇到"<CRLF>.<CRLF>",則表示郵件內容結束。
? ?quit<CRLF> 結束會話。
? ?mailcore2與smtp協(xié)議相關的api:
? ? ? ?MCOSMTPSession 封裝了郵件客戶端與smtp服務器之間的通訊規(guī)則:
- (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命令,指定收件人。
? ?接下來就是關于郵件內容的解析了,首先得了解郵件的格式。
? ?郵件內容的基本格式和細節(jié)由RFC822文檔和MIME協(xié)議定義。
? ?RFC郵件格式包含郵件頭和郵件體兩個主要的部分,郵件體部分只能表述一段普通的文本,無法表達圖片等二進制數據,且當收到“.”符號的單行時,“<CRLF>.<CRLF> ”后面的數據會被丟棄掉。
? ?但是可以通過某種編碼方式將二進制數據編碼成可打印的ascii字符后再作為RFC822格式的內容。郵件閱讀程序收到這種郵件后解碼成二進制數據。這樣就巧妙的用RFC格式文檔傳遞二進制數據了。
? ?但是郵件閱讀程序必須知道二進制數據編碼成ascii的編碼方式以及這些二進制數據在郵件內容中的起始位置。這些問題催生了mime協(xié)議的誕生,mime定義了如何在郵件體部分表達出豐富多樣的數據內容。
? ?MIME郵件就是采用了MIME協(xié)議的郵件,它新增了一些自己的頭字段,MIME-version指定mime的版本,content-type指定郵件體的mime類型及每段的分隔符,解決了二進制數據在郵件內容中的起始位置問題,content-transfer-encoding告知郵件閱讀程序二進制數據編碼方法。
? ?MIME郵件由mime消息組成。mime消息也包含頭和體兩部分,頭和體之間用空格分開,多個mime消息體之間采用某種分隔符標識進行分隔,它們之間的組合類型和分隔符標識由它門的組合mime消息的頭來描述。
? ?mime消息頭:
? ? ? 1.content-type ? ?字段內容以“主類型/子類型;boundarty="分隔符”的形式出現(xiàn)。主類型:text,image,multipart等,multipart主類型表示mime組合消息。mime組合消息有三種組合關系:混合,關聯(lián),選擇,混合(multipart/mixed)表示消息體中有文本,附件等組成。關聯(lián)(multipart/related)表示關聯(lián)組合類型,如html代碼內嵌引用的圖片等資源。選擇類型(multipart/alternative)表示該郵件內容既可以用純文本表示,也可以用html格式表示,如果郵件閱讀程序不支持html文本的話,就可以用純文本表示。
? ? 2.content-transfer-encoding ? ? 表示二進制內容編碼的方式。
? ?3.content-disposition ? ? 指定郵件閱讀程序處理數據內容的方式。inline直接處理,attachment當附件處理,
? ?4.content-ID ? ?出現(xiàn)在消息類型為"multipart/related"組合消息內,表示該消息的一個唯一標識號,該標識號會在html格式正文中被引用,content-id:451265.jpg,則html正文中的引用方式為:<img src=“cid:451265.jpg” >
? ?5.content-location ? ?為內嵌資源設置一個URI地址,html正文中可以直接使用該地址。
? ?6.content-base,為內嵌資源設置一個基準路徑。
總結
以上是生活随笔為你收集整理的mailcore(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《暗黑破坏神4》Beta测试系统需求
- 下一篇: 高通正在研发能像人眼一样的手机摄像头 何