首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

一个点到点的邮件系统设计(2)

一个点到点的邮件系统设计(2)

一共有五种类型的数据包:
① 邮件内容包。包类型为0x00,数据是编码的邮件片断。
② 邮件信息包。包类型为0x81,数据是编成BCD码的发送方电话号码和邮件长度。
③ 邮件结束确认包。包类型为0x82,无数据。
④ 应答包。包类型为0x83,无数据。
⑤ 重发包。包类型为0x84,数据是编成BCD码的新包号和重发起始位置。
2.4 包的发送和接收
  包的发送和接收就是按照包的格式定义读写串口。邮件的收发过程就是依照TMP协议收发包的过程。
2.5邮件的编码和解码
  本系统要求发送的邮件是可以带附件的。在初始化串口时使用的是7位数据,而附件内容可能是二进制数据,这和普通电子邮件碰到的问题一样,要涉及到对邮件的编码问题。在设计该系统前,已经实现了普通电子邮件的客户端软件,所以就把普通电子邮件的编码方法应用到这里,也就是点到点邮件也用MIME格式来编码[6]。
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的程序间通信机制把图像信息传递给图像显示程序,让它来显示图像。
结语
  本文介绍了一个在嵌入式系统上点到点邮件系统的设计和实现,重点讲述了如何在计算、存储资源有限的特殊环境下,来设计一个点到点通信软件;如何运用AT指令操作Modem;对具体的应用如何来有效地设计串口的通信协议和如何对邮件进行合理有效的管理。本系统已经成功地运行在一款多功能电话上,将来通过扩展还可以增强群发、定时发送等功能。
继承事业,薪火相传
返回列表