前言

  上一篇简单介绍了一些Thunderbird的常用知识和小技巧,但是Thunderbird可以把玩的东西远远不止这些,下面这篇文章将介绍另外3个Thunderbird可以玩的地方,分别是制作属于自己的附加组件,巧用SQLite管理邮件,邮件安全.

制作自己的附件组件

  将通过一个实际的案例讲述如何编写Thunderbird插件,在这个演示的demo中将会实现以下两个功能:

  • 在statusbar 添加了一个时间标签,每一分钟更新一次.
  • 每隔半小时弹窗一次,提醒用户注意休息,类似于小闹钟.

有几个名词需要首先解释以下:

  • xpi: mozilla系列应用程序(如Mozilla Firefox和Mozilla Thunderbird)扩展文件.
  • xul: 可扩展标记语言用户界面语言,是为了支持Mozilla系列的应用程序()而开发的使用者界面标示语言.
  • 扩展: 扩展可为应用程序新添功能.

具体操作过程分为如下几个部分.

创建需要的文件和文件夹.

├── chrome
│   ├── content
│   │   ├── chaubeau_demo.js
│   │   └── chaubeau_demo.xul
│   ├── locale
│   └── skin
├── chrome.manifest
├── defaults
│   └── preferences
└── install.rdf
  • 以上目录结构的:chrome,content文件夹的名字不可更改.
  • install.rdf名字不可更改,必须放在XPI文件根目录下,它定义了所要安装的安装信息.
  • chrome.manifest的名字和路径同install.rdf一样,也不可以更改.定义了应用程序窗口的内容区域之外的用户界面元素的集合.

编写install.rdf

示例代码如下:

<?xml version="1.0"?>        
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
     xmlns:em="http://www.mozilla.org/2004/em-rdf#">        
  <Description about="urn:mozilla:install-manifest">
    <em:id>chaubeau_demo@chaubeau.github.io</em:id>
    <em:name>Demo on Thunderbird</em:name>
    <em:version>0.1</em:version>
    <em:type>2</em:version>
    <em:creator>Chaubeau</em:creator>
    <em:homepageURL>https://github.com/chaubeau/Tool/tree/master/chaubeau_demo</em:homepageURL>
     <em:description>关于Thunderbird附件组件的演示,本组件实现了两个简单的演示功能:        
         1.在statusbar 添加了一个时间标签,每一分钟刷新一次.        
         2.每个半小时弹窗一次,提醒用户注意休息,类似于小闹钟.        
         本组件旨在演示Thunderbird附件组件的开发流程.</em:description>
    <em:targetApplication>
      <Description>
        <em:id>{3550f703-e582-4d05-9a08-453d09bdfdc6}</em:id>
        <em:minVersion>28.0</em:minVersion>
        <em:maxVersion>36.0.*</em:maxVersion>
      </Description>
    </em:targetApplication>        
  </Description>
</RDF>

下面对一些必要的属性做简单的介绍:

  • ID(<em:id>),一般ID是下面两个格式,其他的格式从火狐1.5之后就不予支持.
  • version(<em:version>),版本,一个标志当前扩展版本的字符串.
  • type(<em:type>),一个整数代表扩展的类型,’2’代表是扩展程序.
  • name(<em:name>),表示该扩展的名字.
  • targetApplication,表示该扩展是用于Mozilla哪一种应用程序的,用ID做区别.{3550f703-e582-4d05-9a08-453d09bdfdc6}代表Thunderbird.{ec8030f7-c20a-464f-9b0e-13a3a9e97384}代表Firefox.
  • minVersion:该扩展支持的最小版本.
    maxVersion:该扩展支持的最大版本.

以上是对示例代码的简单解释,详细的文档资料请参考Mozilla官方文档.

编写chrome.manifest文件

示例代码:

content     chaubeau_demo    chrome/content/
overlay chrome://messenger/content/messenger.xul chrome://chaubeau_demo/content/chaubeau_demo.xul

上面讲到,Chrome指的是应用程序窗口的内容区域之外的用户界面元素的集合,这些用户界面元素包括工具条,菜单,进度条和窗口的标题栏等.一般包括下面几种类型:

  • 内容(Content):通常是 XUL 文件。
  • 区域(Locale) :存放本地化信息。
  • 皮肤(Skin):描述 chrome 的外观。通常包含 CSS 和图像文件。
  • overlay: 定义了将自己的XUL文件与那个系统XUL文件合并.

Mozilla程序通过Chrome URIs来存取这些文件,比如在火狐浏览器里面访问:chrome://browser/content/browser.xul 就是是浏览器的主界面.

编写XUL文件

XUL示例代码如下:

<?xml version="1.0"?>
<overlay id="chaubeau" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/javascript" src="chrome://chaubeau_demo/content/chaubeau_demo.js"/>
 <statusbar id="status-bar">
     <statusbarpanel id="my-panel" label="Date"/>
 </statusbar>
</overlay>

  以上XUL代码会加载一个JS文件,然后在statusbar上定义了一个自己的panel,ID为”my-panel”,代码比较简单不做详细解释.

XUL代码里面加载的JS代码如下:
window.addEventListener(“load”, function(e) {
startup();
}, true);

window.setInterval(
    function() {
        startup();
    }, 6000); //update date every minute
window.setInterval(
    function()
    {
        window.alert("你应该休息一会了~");
    },18000);
function startup() {
    var myPanel = document.getElementById("my-panel");
    var date = new Date();
    var day = date.getDay();
    var dateString = date.getFullYear() + "年" + (date.getMonth()+1) + "月" + date.getDate()+"日";
    myPanel.label = "时间: " + dateString;

}

以上JS代码分别调用了window.addEventListener和window.setInterval两个系统函数.函数startup负责更新时间.

打包扩展文件.

  回到扩展文件根目录下,执行zip -r chaubeau_demo.xpi *命令,生成扩展文件.

安装扩展文件.

  打开Thunderbird的附件组件管理器,选择从文件安装附件组件.选择生成的chaubeau_demo.xpi文件安装,重启Thunderbird.

提交附件组件

  将你开发的附件组件,提交到Mozilla的展示库,提交是免费的(需要审核),要完成提交流程,需要附加组件包(*.xpi文件)和至少一幅该附加组件运行时的屏幕截图.提交地址,enjoy it;

其他

  如果不想自己编写install.rdf和chrome.manifest以及建文件夹,那么还有一个方法,附加组件封装工具,这个工具帮助你生成扩展组件的基础信息.

  以上是Thunderbird附件组件的一个简单的demo,实际上Mozilla支持多种方式:

  • 附加组件 SDK 扩展,使用一组高级别的 JavaScript APIs 开发无需重启的扩展。
  • 无须重启的扩展,手动创建无需重启的扩展。
  • 覆盖式扩展,使用 overly 的方式创建传统的扩展,也就是该demo示例的方式.

  如果可能,最明智的是采用 Add-on SDK 的方式,它采用了无需重启的扩展机制,可以简化某些任务并在卸载后自动清理。如果 Add-on SDK 无法满足你的需求,可采用手动创建无需重启扩展的方式.Mozilla不仅提供了附件的扩展接口,还提供了主题接口,所谓主题,就是用来自定义用户界面的附加组件.除此之外还有Search engine pluginsPlugins.可以参考Mozilla的官方文档.

以上代码下载地址:chaubeau-github

巧用SQLite管理邮件

  SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,进入$HOME/.thunderbird/*.default文件夹,会看到如下SQLite数据文件.

addons.sqlite               content-prefs.sqlite    extensions.sqlite         
permissions.sqlite          trackerbird.sqlite      places.sqlite
blist.sqlite                cookies.sqlite          formhistory.sqlite               
webappsstore.sqlite         chromeappsstore.sqlite  downloads.sqlite      
global-messages-db.sqlite   signons.sqlite

执行sqlite3 global-messages-db.sqlite 打开global-messages-db这个DB.

sqlite> .tables
attributeDefinitions          imConversations
contactAttributes             imConversationsText
contacts                      imConversationsText_content
conversations                 imConversationsText_segdir
conversationsText             imConversationsText_segments
conversationsText_content     messageAttributes
conversationsText_segdir      messages
conversationsText_segments    messagesText
ext_mimeTypes                 messagesText_content
folderLocations               messagesText_segdir
identities                    messagesText_segments
sqlite> .mode column
sqlite> .header on  
sqlite> select count(*) from  contacts;
count(*)
----------
6142

  这些sqlite库里面存了丰富的信息,可以去统计每天收发的邮件,可以去查看邮件索引信息,联系人等信息,具体怎么使用可以自由的发挥,当然也可以结合上面的demo开发相应的组件.

邮件安全

  Enigmail是Mozilla Thunderbird的附加组件,它可以有效保护您邮件通讯的隐私.Engimail基于公钥加密技术,要求每个用户都要生成自己的密钥对

  • 公钥:可以与您的联系人进行分享。一旦您知道某位联系人的公开密钥,您就可以给这个人发送加密的电子邮件.
  • 私钥:通过某个密码或者口令等实行保护,这个密码不能和其他人分享.

  Enigmail也可以给您的邮件附上数字签名。如果收信人有一份您的有效公开密钥,他就可以知道这封邮件的来源,并且其内容也不会在发送途中被篡改.Enigmail只是提供了一个平台,真正发挥作用的是Thunderbird中的GnuPG加密技术,因此需要安装GNUPG.因此,需要在电脑上安装GNUPG工具以及Thunderbird的Enigmail扩展.
enigmail文档GNUPG文档都非常的详细,具体的操作过程就不在此赘述.