在当今这个信息爆炸的时代,电子邮件服务已经成为日常工作和生活中不可或缺的一部分。Gmail作为谷歌推出的一款广受欢迎的电子邮件服务,以其简洁的界面和强大的功能赢得了用户的青睐。随着Gmail功能的不断更新和完善,开发者们也希望能够通过编程的方式更深入地利用Gmail的功能。本文将介绍一个基于.NET框架开发的开源Gmail API,以及一个基于该API构建的概念验证Windows应用程序,该程序提供了基础的远程Gmail功能。
开发这些工具的初衷是鼓励其他开发者创造有趣的Gmail服务。虽然这个项目可能不会长久,因为谷歌已经暗示可能会增加邮件转发和RSS支持等功能,更不用说Gmail最近列出的即将推出的功能了。通讯录导入目前被列为“不久的将来”,但实际上现在已经在联系人窗口中可用。正如Sergey所提到的,企业版的Gmail将会非常受欢迎,相信也会有一个与之配套的API(最近集成了一个Google Search Appliance,可以证明其可扩展性)。谷歌是否有兴趣为公众追求这些功能还有待观察。尽管如此,希望这个项目能够继续进行,并且不介意加入Gmail团队——有很多功能希望能够实现在Gmail中。
相信大多数人对applet更感兴趣,所以这里是它的一些特性:
系统要求:
这是一个概念验证应用程序,有很多特殊之处。它对来说工作得很好,但体验可能会有所不同。欢迎任何想要为这个应用程序的完善做出贡献的人。
API的目标是提供一个可扩展的基础,用于与Gmail接口。这个命名空间中的对象应该足够抽象,能够适应Gmail未来可能做出的任何更改。
阅读Gmail Agent API 0.5的文档,看看有什么可用的。这个类的主要工作是GmailAdapter。它负责与Gmail通信,并在应用程序的持续时间内维护登录和会话信息。GmailSession对象保存单个Gmail账户的所有状态信息,包括GmailThreadCollection的GmailThread对象。GmailContact对象代表单个Gmail地址簿条目。再次,GmailAdapter提供了填充GmailContact的方法,以从Gmail获取信息。
API的一个奇怪之处是它使用TLS而不是SSL作为加密层。出于未知原因,SSL提供者非常不稳定,经常无法建立安全链接,所以手动设置了ServicePointManager以使用TLS 1.0。这似乎是.NET开发者中的一个常见问题,如果有人有稳定的解决方案,会很乐意听到。
以下是如何使用API与Gmail建立连接的简单示例:
C#
//
init new adapter
GmailAdapter gmail = new GmailAdapter();
//
create new session and assign username and password
GmailSession myAccount = new GmailSession();
myAccount.Username = "googler";
myAccount.Password = "showmethemoney";
//
login and retrieve mailbox info
GmailAdapter.RequestResponseType loginResult = gmail.Refresh(myAccount);
//
display mailbox info
if (loginResult == GmailAdapter.RequestResponseType.Success) {
//
show new inbox count
Console.WriteLine("New Threads: " + myAccount.DefaultSearchCounts["Inbox"]);
//
if new threads exist, show the subject of the first one
if (myAccount.UnreadThreads.Count > 0) {
GmailThread newThread = (GmailThread)myAccount.UnreadThreads[0];
Console.WriteLine("Latest thread subject: " + newThread.SubjectHtml);
}
}
可能已经注意到,与Yahoo! Mail和Hotmail等其他基于Web的电子邮件系统相比,Gmail的界面非常快。这是因为Gmail将UI引擎放置在客户端作为JavaScript模块。每当登录Gmail时,UI引擎的副本就会加载到HTML页面框架中的一个,并在整个会话期间保留在那里(Oddpost是第一个完善这个想法的人)。随后,Gmail界面的操作通过浏览器中的Gmail UI引擎进行路由,该引擎反过来通过XmlHttpRequest对象向Gmail服务器发送HTTP请求,解释DataPack(稍后详细介绍),并动态更新UI。相比之下,Hotmail和Yahoo! Mail遵循传统的Web应用程序模型,在几乎每次操作后都会重新加载整个UI。
与这个项目最相关的项目是所称的“DataPack”,这是一个只包含JavaScript数组声明的基础HTML文件,UI引擎解析这些数组声明,然后决定更新什么。这样做的好处应该是显而易见的:减少了流量负载,并增加了功能——特别是对于不再需要使用粗糙的“屏幕抓取”技术来与Web应用程序接口的开发者来说。虽然外部开发者的理想情况是XML基础的DataPack,但JavaScript版本已经足够了(怀疑它也是出于性能原因被选择的)。
DataPack格式由单独的“DataItems”组成,或者是包裹在信封函数中的JavaScript数组。示例:
D(["ts",0,50,106,0,"Inbox","fd36721220",154]);
函数D()引用Gmail引擎中的运行时评估器,然后解释附加的数组参数。元素"ts"表示这是一个线程列表摘要项,随后的元素表示起始索引、每页线程数、估计总数、线程列表标题、线程列表时间戳和总线程数。这是通过DataPack发送的所有数组参数应用的相同格式:
[
所有DataItems的映射都可以在引擎代码源中找到(/gmail?view=page&name=js)。例如,qu包含配额信息,而ct包含类别(即标签)定义。如果真的想从Gmail中得到所有的东西,请阅读该文件。
确定检索DataPack的正确URL相当直接,因为大多数请求将返回相同的基本信息,如配额、类别计数和收件箱计数。主要变化的是线程列表摘要,这取决于正在查看的页面。所有主要文件夹——收件箱、星标、垃圾邮件、垃圾邮件等——实际上只是Gmail中预定义的搜索。例如,收件箱DataPack URL是:
/gmail?search=inbox&view=tl&start=0&init=1&zx=
所有未读线程的搜索查询是:
/gmail?search=query&q=is%3Aunread&view=tl&start=0&init=1&zx=
主要参数是search=和q=,它们定义了用户请求的线程集。zx=参数是一个代理缓存破坏者,在这里省略了,以简洁起见。有关更多信息,请参见GmailAdapter.MakeUniqueUrl()。