一个点到点的邮件系统设计
EVD能做什么呢?与超级VCD|0"> 3 客户层的设计与实现
3.1 本地邮件的格式
本地邮件是指起草的、已发的或收到的存放在各信件箱中的邮件。
本地邮件可以有两种存放方式:
①按照MIME编码,把编码后的邮件放在邮箱中。
②按照邮件的组成部分存放在邮箱中。第①种方式的好处是,邮件在发送前和接收后不需要编码,另外也不需要备份附件文件,可以加快邮件发送和接收速度。但它有两个最大的缺点,一是因为附件都会编入邮件中,需要大量的存储空间;二是每次显示邮件时,都需要把邮件解码,保存时还要编码,需要大量的计算资源。这两点对于资源有限的嵌入式系统来说都是很大的问题。所以这里选择了第②种方式。
本地邮件是以文本方式存放在文件中的。本地邮件由发件人、收件人、抄送人、已发送人、时间、标题、正文、回复地址和附件九部分组成。在文件中,除正文外其余八部分都各占1行。其中,抄送人和已发送人可以有多个,之间用分号隔开,附件部分的每个附件都有附件名和实际文件名组成。这两个文件名间用斜杠隔开,而不同的附件用分号隔开。另外,正文放在邮件的最后,与上面八部分之间有一个空行格开,正文所占行数以正文内容而定。一个本地邮件如下所示:
Date:2004-08-14
To:67165848
From: 67165762
Cc:67161234;67164321
Sent:67165848;67161234
Subject:peer to peer mailer Test
InReplyTo:67165762
Attachments:logo.png/20040814085700;face.png/200408145701
This is a Tmailer Test!
Hello World!
3.2 邮件箱文件的组织形式
一共有四个邮件箱,它们分别是:
① 草稿箱(draftbox)--存放起草了但尚未准备发送的邮件。
② 发件箱(sendbox)--存放起草完成,可以发送的邮件。
③ 已发邮件箱(sentbox)--存放已发送出去的邮件。
④ 收件箱(inbox)--存放收到的邮件。
每个邮件箱由两个文件组成:邮件内容文件和邮件索引文件。如草稿箱就有草稿邮件内容文件draftbox和草稿邮件索引文件draftbox.index。
邮件内容文件存放的是该邮件箱中的所有邮件,格式如本地邮件所示。邮件索引文件存放的是每个邮件的基本信息(在显示邮件列表时要用的信息)及该邮件在内容文件中存放的信息。一个邮件的索引结构如下所示:
typedef struct {
chardate[40];// 起草、收到或发出的日期
charfrom[64];// 发件人或收件人
charsubject[140];// 标题
longsize;
// 邮件的大小(在内容文件中所占的字节数)
longposInFile;// 在内容文件中的偏移
intflag;// bit0 = 已读; bit1 = 是否有附件
}mail_summery_t;
由于索引文件较小,当显示某一邮箱的邮件列表时,可以一次性把整个索引文件内容装入索引数组中,因此邮件列表的显示可以不用读取邮件内容文件,完全取决于索引文件的内容。添加邮件时,在内容文件末尾添加邮件内容,在索引数组中添加一个索引记录;修改邮件时,不管原邮件在内容文件中的数据,在内容文件末尾添加邮件内容,修改该邮件索引记录;删除邮件时,只需删除索引记录即可。
索引文件的使用有两大好处:一是在显示邮件列表时不用从较大的内容文件中提取想要显示的信息;二是方便了邮件的访问。可以实现邮件的随机访问,如果没有索引文件,在每次修改和删除邮件时,都需要移动大量的数据。现在,虽然会造成存储空间的浪费,但这可以提高速度,对于资源有限的嵌入式系统很重要。此外,通过定时判断邮件内容文件的利用率可以压缩内容文件的大小,尽量减少空间的浪费。
3.3 附件的管理
在邮件中,附件较之邮件其他信息很大,所以邮件管理中附件的管理十分重要。
① 用户在起草邮件并粘贴附件时要把附件文件备份出来,否则如果用户不小心把附件文件删除后再发送邮件,就不能发送该附件了。所以要特别开辟出一个文件夹来存放备份的附件。
② 用户收到邮件并邮件解码后,把其所带的附件保存到特定的文件夹。
③ 用户在删除邮件时,也要删除备份的附件,否则浪费空间。
④ 由于附件文件名有可能相同,所以备份附件时要使用惟一文件名。产生惟一文件名的方法是取当前时间字符串加上一个随机值字符串。
3.4 邮件的抄送
本系统也实现了邮件的抄送功能,即一份邮件可以发给多个收信人。用户层程序把邮件内容及收信人列表(收件人+抄送人-已发送人)传送给服务层,服务层程序根据收信人列表逐个发送邮件,并记录发送成功的收信人。在给所有收信人都发送过后(当然不一定每个都成功发送),返回一个已发送成功的收件人列表给客户层,客户层把这个列表添加到本地邮件的sent字段中。当邮件的所有收信人,包括收件人和抄送人都收到邮件后,就认为该邮件发送完毕,把它移入已发送邮件箱。
3.5 界面的设计和实现
Tmailer主要有六个界面:
① 主菜单对话框。Tmailer运行后就是该界面。界面上有六个按钮,分别用于起草邮件,进入4个邮件箱和退出程序。
② 邮件编辑对话框。用于编辑邮件,主要有收件人、抄送人、标题和正文4个编辑框。
③ 邮件查看对话框。用于查看收到的邮件,不能编辑。这个对话框上有两个特殊按钮,"转发"按钮和"回复"按钮。当点击"回复"按钮时,Tmailer先会起草一篇新邮件,然后把当前邮件的InReplyTo填写到新邮件的收件人栏中,把当前的正文稍作修改填写到新邮件的正文中,然后就可以编辑和发送该新邮件了。当点击"转发"按钮时,Tmailer也会先起草一篇新邮件,把当前的正文稍作修改填写到新邮件的正文中,把当前附件粘贴到新邮件中,然后只要填上收件人就可以转发邮件了。
④ 邮件箱对话框。用于显示邮件列表和管理邮件。4个邮件箱共用该界面,不同的邮箱只是个别按钮有所不同。当选中邮件按下回车键后,程序会根据当前所在的邮件箱选择用邮件编辑对话框或邮件查看对话框显示选中邮件。对于有附件的邮件,在每个邮件前都有一个标记标识。在收件箱中,未打开邮件会以粗体显示,打开后就以正常字体显示。
⑤ 附件编辑对话框:用于编辑(粘贴和删除)附件,在邮件编辑对话框中点击"附件"按钮可以打开该对话框。
⑥ 附件查看对话框。用于查看和保存接收邮件的附件。如果查看的附件是图像文件,Tmailer会通过Qt/Embedded的程序间通信机制把图像信息传递给图像显示程序,让它来显示图像。
- 基于ARM的除法运算优化策略(01-14)
- 基于ARM的CAN总线智能节点的设计(01-24)
- ARM基础知识教程五 (02-08)
- ARM基础知识教程六(02-08)
- ARM基础知识教程七(02-08)
- ARM基础知识教程八(02-08)