名,諸如 “d=ipad: v=5.1: s=imap.gmail.com:u=martinirapportive.com”。代理服務器 104 解析該用戶名串,并且在連接到消息服務器“imap.gmail.com”時使用“martin@_rapportive.com”作為用戶名。替換地,可以使用不透明唯一標識符作為用戶名,如果代理服務器104保持從那些標識符到消息服務器106帳戶細節(jié)的映射的話??上蛴脩裘砑悠渌侄巍H绻麤]有任何字段將被用戶修改,則可使用HMAC (基于哈希的消息認證代碼)或其他認證代碼來防止用戶篡改用戶名串。
[0048]在一些實施例中,建議向用戶名串中包括關于連接和消息服務器106的信息,并且保持口令串未改變。在一些情況下,用戶常常改變其口令,但是很少改變其用戶名。在這些情況下,如果消息服務器106拒絕登陸,則代理服務器104可以將該拒絕轉(zhuǎn)送到客戶端設備102,并且客戶端設備102可以在不改變用戶名的情況下提示用戶以獲得其新口令。當客戶端設備102用同一用戶名和新口令來重試時,代理服務器104可以在不要求任何特殊處理的情況下將新口令轉(zhuǎn)送到消息服務器106。
[0049]圖8根據(jù)實施例描述了圖示出隨著事件可在IMAP代理配置中發(fā)生的事件的序列和定時的圖800。在建立到IMAP代理服務器的連接之后,客戶端設備通常執(zhí)行TLS (傳輸層安全)握手以在嘗試登陸之前建立安全通道。當IMAP代理服務器接收到證書時,其從用戶名字段提取上游服務器主機名,連接到上游服務器,使用TLS來建立安全通道,并且使用上游用戶名和口令來嘗試登陸。然后可以將上游登陸嘗試的成功或失敗傳遞到客戶端設備上。
[0050]一旦客戶端設備102被認證,則代理服務器104可以在沒有修改的情況下安全地通過從客戶端設備102接收到的大多數(shù)命令并從消息服務器106接收相應響應。在圖8中,這用“選擇收件箱”命令來舉例說明。針對從客戶端設備102接收到的FETCH、UID FETCH或APPEND (及可能的其他)命令以及來自消息服務器106的相應響應執(zhí)行進一步處理,如下所述。
[0051]FETCH命令被客戶端設備102用于各種目的,諸如下載郵箱中的所有消息的概要,下載所選消息的全文或下載消息附件。圖8圖示出FETCH的兩個用途,由此,客戶端首先下載收件箱中的所有消息的標題,并且然后下載所選消息的全體。在一些實施例中,可使用包含在消息標題中的信息來對補充信息的高速緩存器進行“預先準備”或“預熱”,使得可更快地處理用于全體的后續(xù)FETCH請求。例如,如果發(fā)送者的電子郵件地址正被用來搜索補充信息,則可以從消息標題提取電子郵件地址。此預先準備操作可異步地發(fā)生:隨著消息標題被返回到客戶端設備的同時,補充信息服務可開始處理電子郵件地址。
[0052]當由客戶端設備來發(fā)送用于消息主體(或消息主體的一部分)的FETCH命令時,如圖8中的“獲取消息”所示,代理服務器首先從上游服務器獲取該消息或消息部分。其然后將該消息傳遞至代碼轉(zhuǎn)換過程,該代碼轉(zhuǎn)換過程可訪問補充信息服務,其又可利用任何數(shù)目的社交簡檔服務??稍诖a轉(zhuǎn)換期間同時地實現(xiàn)到那些社交簡檔服務的請求,或者可按照獨立的時間表實現(xiàn)并高速緩存。然后將代碼轉(zhuǎn)換消息返回到客戶端。
[0053]在沒有任何標題的情況下,F(xiàn)ETCH命令允許客戶端請求消息的特定部分(“數(shù)據(jù)項目”),諸如一個特定MIME部分。由特定FETCH命令從客戶端設備102請求的數(shù)據(jù)項目可能不包含代理服務器104所需的所有信息以執(zhí)行所需消息重寫功能。例如,如果要求發(fā)送者電子郵件地址,則代理服務器104要求BODY[HEADER.FIELDS (FROM)]數(shù)據(jù)項目,并且為了正確地對MME結(jié)構(gòu)進行變換,其要求BODYSTRUCTURE數(shù)據(jù)項目,如果請求中的其他數(shù)據(jù)項目是用于特定MME部分而不是整個主體的話。如果FETCH請求是用于附件,并且應用程序不要求附件的重寫,則可不要求附加數(shù)據(jù)項目。
[0054]可以以各種方式獲得客戶端設備102針對特定消息未請求、但代理服務器104針對正確的重寫要求的數(shù)據(jù)項目。一個選項是使代理服務器104通過適當?shù)乇3指櫺蛄芯幪柕淖兓蚒IDVALIDITY而按序號或WD來保持用于此消息元數(shù)據(jù)的其自己的持久性儲庫。如果不期望持久性儲庫,則代理服務器104可隨著從客戶端設備102接收的FETCH請求被轉(zhuǎn)送到消息服務器106而向其中插入附加請求數(shù)據(jù)項目,使得來自消息服務器106的相應響應包含消息的正確重寫所需的所有數(shù)據(jù)項目。在相應響應被轉(zhuǎn)送到客戶端設備102之前由代理服務器104從相應響應去除被添加到FETTH請求的任何數(shù)據(jù)項目以保持協(xié)議正確性。
[0055]消息服務器106的一些現(xiàn)有實施方式可能具有缺陷,影響是即使客戶端請求附加標題字段,諸如BODY [HEADER.FIELDS (FROM)]數(shù)據(jù)項目,其也不會被消息服務器106返回。IMAP代理服務器104可通過使用同一序列集向消息服務器106執(zhí)行附加FETCH請求、僅請求此類標題字段來圍繞此類缺陷進行工作。在發(fā)布附加命令的代理服務器104的這些實施例中,采取鎖(lock)來防止客戶端設備102同時地發(fā)布IMAP連接的總體狀態(tài)的命令,諸如SELECT,直至附加命令和響應循環(huán)已完成為止。
[0056]由代理服務器104如下處理消息服務器106對FETCH請求的響應。如在下面的關于消息重寫的小節(jié)中描述的處理的響應中的任何B0DY[]數(shù)據(jù)項目。以與消息重寫規(guī)則一致的方式修改響應中的任何BODYSTRUCTURE數(shù)據(jù)項目,特別地,在這里還反映任何MME部分(諸如用文本/html部分來替換文本/明文部分)的字符編碼或內(nèi)容類型的任何改變。類似地以與消息重寫規(guī)則一致的方式來修改響應中的任何BODY[HEADER]數(shù)據(jù)項目,包含內(nèi)容類型標題??筛马憫械娜魏蜶FC822.SIZE數(shù)據(jù)項目以在重寫已發(fā)生之后的消息尺寸??蛻舳?02最初請求的其他數(shù)據(jù)項目可在沒有修改的情況下通過。
[0057]如果應用程序需要消息服務器106所報告的消息集合與由代理服務器104報告給客戶端設備102的消息集合之間的嚴格的一一對應,則可在沒有修改的情況下在消息服務器106與客戶端設備102之間傳遞任何消息序列號和WD。然而,如果應用程序要求修改客戶端設備102看到的消息集合(例如,當讀取特定郵箱的內(nèi)容時或者為了如下所述地引入虛擬郵箱,應隱藏低重要性的消息),則代理服務器104保持客戶端設備102與消息服務器106的序號和WD的各視圖之間的映射。另外,代理服務器104在所有命令和響應中對其進行雙向的轉(zhuǎn)換。序號服從在序列中未顯示出間隙的IMAP的契約,但是由于該映射并不在會話本地,所以其不要求持久性存儲。用WD,允許有間隙。因此,只要消息未被代理服務器104隱藏并添加,則代理服務器104可以對與客戶端設備102的通信使用與其用于與消息服務器106的通信相同的UID值。如果應用程序需要向客戶端設備102呈現(xiàn)在消息服務器106上不存在的消息(諸如適用于此特定客戶端設備102的系統(tǒng)通知),則為了服從IMAP協(xié)議要求,則代理服務器104針對每個消息持久地存儲由消息服務器106呈現(xiàn)的UID和呈現(xiàn)給客戶端設備102的WD (其可以是不同的,并且如果由代理服務器104插入或隱藏消息,則UID可不存在)。
[0058]如果應用程序希望引入虛擬郵箱(S卩,對客戶端設備102可見但在消息服務器106上不存在的郵箱)或?qū)⑧]箱重命名(例如,以確保發(fā)送的消息被放置在消息服務器106上的指定發(fā)送項目文件夾中),則代理服務器104還攔截LIST、SELECT、EXAMINE、STATUS、CREATE、DELETE、RENAME、SUBSCRIBE、UNSUBSCRIBE 以及 LSUB 命令及其關聯(lián)響應。該虛擬或重命名郵箱名稱被插入包含郵箱名稱的列表的響應中,并且包括虛擬郵箱名稱的請求未被轉(zhuǎn)送到消息服務器106,或者在轉(zhuǎn)送到消息服務器106之前相反地重命名。在虛擬郵箱情形中,應用程序?qū)⑿枰_定用于COPY命令的適當語義和消息標志(例如,\看過和\刪除)的傳播。
[0059]APPEND命令最常與經(jīng)由SMTP來發(fā)送消息相結(jié)合地出現(xiàn),其在單獨的連接上發(fā)生。使用IMAP APPEND命令來將消息保存到用戶的“已發(fā)送郵件”文件夾。用戶期待其“已發(fā)送郵件”文件夾中的消息與其各接收者接收到的消息(添加在MTA (消息傳輸代理)中轉(zhuǎn)中的模數(shù)標題)相同,因此,由IMAP代理服務器以與下面討論的由SMTP代理來修改同一消息的相同方式來修改隨APPEND —起出現(xiàn)的消息。
[0060]Exchange ActiveSync 代理服務器
在Exchange ActiveSync中,用使用HTTP基本認證方案編碼的用戶名和口令對用戶進行認證。通常在由客戶端進行的所有POST請求上都包括授權標題,并且ExchangeActiveSync代理服務器可以簡單地將此標題傳遞至消息服務器1GtlExchange ActiveSync還使用HTTP OPT1NS請求,其通常不包括授權標題。然而,OPT1NS請求仍被ExchangeActiveSync代理服務器轉(zhuǎn)送到消息服務器106,以便檢測Exchange服務器版本及其他信息。因此如在IMAP代理服務器的情況下描述的那樣對用戶名中的消息服務器106名稱進行編碼是不夠的,因為Exchange ActiveSync代理服務器將不知道哪個消息服務器106將用于OPT1NS請求。替代地,所述系統(tǒng)和方法使用HTTP包括主機標題中的全主機名的事實。與通配符DNS記錄組合,可以對子域名中的任意信息進行編碼。例如,如果消息服務器106是“exchangeOl.upstream, com,,,則首先逸出周期,用“O-,,來替換“.”并用“00”來替換 “O-,,。如果用于 activesync.example, com” 的 DNS 決定 Exchange ActiveSync 代理的IP地址,則現(xiàn)在可以將客戶端設備102配置成連接到“exchange0010-upstream-0com.activesync.example, com”。周期的逸出是必需的,因為雖然DNS通配符覆蓋多個層級的子域,所以通配符SSL證書覆蓋單個層級的子域。通過對僅一個層級的子域的全上游服務器名進行編碼,用于