显示邮件控件详细设计
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
目录
一、 需求设计………………………..2 1、需求:…………………………….2 2、设计:…………………………….2 二、 分析发件人…………………….2 三、 分析收件人…………………….3 四、 分析日期………………………..3 五、 分析主题………………………..3 六、 分析附加………………………..3 七、 分析邮件内容…………………4 附1、Quoted-Printable解码…..5 一、需求设计 1、需求: 由于在内容恢复中的SMTP和POP3需要利用OUTLOOK打开查看邮件,导致每次都要弹出新的窗口。如果做成控件或者就是VB程序中的一部分,效果会很好。 2、设计: 根据邮件格式,进行分析,具体需要分析的内容有: (1).发件人; (2).收件人; (3).日期; (4).主题; (5).附加; (6).邮件内容。 由于是做界面效果,所以建议用VB制作,因为VC都需要自画,效果不如VB。可以做成控件,或者就是管理器的一部分代码也可以。如果是控件,则可以把一个MAIL文件给控件,控件负责分析,显示功能。 二、分析发件人 例如:From: =?gb2312?B?wO6+rc2o?= <lijt@neusoft.com> 首先是根据“From:”来找到发件人。 1.没有“From: ”,则显示“未指定发件人”。 2.例如:From: masterlee 直接显示“masterlee”。 3.例如:From: lijt@neusoft.com 直接显示“lijt@neusoft.com”。 4.例如:From: masterlee<lijt@neusoft.com> 直接显示“masterlee”。 5.例如:From: =?gb2312?B?wO6+rc2o?= <lijt@neusoft.com> 对于这种情况,前面的“?B?”表示是以BASE64编码,需要解码后显示“李经通”。 有的是“?Q?”表示是Quoted-Printable编码,和BASE64处理方法一样,解码后显示。不显示后面的具体邮件地址。 (附1:Quoted-Printable解码) 6.例如: From: =?gb2312?B?wO6+rc2o?= <lijt@neusoft.com> From: =?gb2312?B?wO6+rc2o?= <lijt@neusoft.com> 有多个“From: ”时,两个都显示“李经通;李经通”。中间用“;”号隔开。 7.第一行没有信息,而在下一行: From: =?gb2312?B?wO6+rc2o?= <lijt@neusoft.com> 第二行显示先是一个空格,后面是具体内容。分析同上(2-6) 8.多行情况: From: =?gb2312?B?wO6+rc2o?= <lijt@neusoft.com>, =?gb2312?B?wO6+rc2o?= <lijt@neusoft.com> =?gb2312?B?wO6+rc2o?= <lijt@neusoft.com> 从第二行开始,前面都有个空格。表示是属于“From”的内容。需要全部显示“李经通;李经通;李经通”。 9、 在VB中使用TEXTBOX控件。需要设置成多行。 注:参考RFC2045、RFC2047。 三、分析收件人 收件人是根据“T ”来判断的,如果没有“T ”,则显示“无”。 其他处理见收件人的2-9。 四、分析日期 1.日期是根据“Date: ”来判断的。如果没有“Data: ”,则显示本机日期。 显示格式“2002年4月14日 15:41” 2.例如“Date: Sun, 14 Apr 2002 12:59:10 +0800”需要转换成“2002年4月14日 12:59” 3.两行的情况 Date: Sun, 14 Apr 2002 12:59:10 +0800 第二行,先是一个空格。同2,分析后面的数据。 4.在VB中使用LABEL控件即可。 五、分析主题 1.主题是根据“Subject: ”来判断,如果没有,则显示“(无主题)”。 2.例如:“Subject: test”直接显示“test”。 3.带有编码的主题,需要解码后显示。有两种编码:BASE64和Quoted-Printable。 “Subject: =?gb2312?B?08q8/g==?=”解码后显示为“邮件”。 4.多行情况: 例如1: Subject: =?UNKNOWN?B?sb7VvszhuanX47LKyO28/sbGveK088irwbS902h0dHA6Ly9yZHp4LnhpbHViYnMuY29t?= 例如2: Subject: =?gb2312?B?MTAuMS4xLjIzNM/W1NrKx7fAu/DHvbLiytTX6dX91NrKudPDtcRJUCzH6w==?= =?gb2312?B?1bzTw7XEys23xdK7z8Iu?= 后面的行有一个空格,处理的时候,如果有编码就解码,没有就连在一起直接显示。 5.在VB中使用TEXTBOX控件。 六、分析附加 1. 判断附件: 如果在邮件里有这些信息,那么就可以判断是否有附件了。 格式一: Content-Type: text/plain Content-Disposition: inline(附件) Content-Description: text-part-1 Some text goes here 格式二: –outer Content-Type: multipart/mixed; boundary=inner(说明是有多部分组成) Content-Disposition: attachment(有附件) Content-Description: multipart-2(附件是多个) –inner Content-Type: text/plain Content-Disposition: inline(附件一) Content-Description: text-part-2 Some more text here. –inner Content-Type: image/jpeg Content-Disposition: attachment(附件二) Content-Description: jpeg-1 –inner– –outer– 这里需要进行字符串匹配。 附件的判断是根据: Content-Disposition: attachment; Content-Disposition: inline; 注:参考RFC1806、RFC2183。 2.处理方法: a) 确定编码格式(RFC1555) Content-transfer-encoding: BASE64 | Quoted-Printable b) 确定文件名 Content-Disposition: attachment;filename="example.txt" 或:(有的文件名进行了编码) Content-Disposition: attachment; filename="=?gb2312?B?TmV0RXllzfjC58q1yrG84L/Yz7XNszEuZXhl?=" 然后按照编码把附加的内容解码,并按照文件名保存在临时目录中。 3. 在VB中,可以使用FILELISTBOX控件或者是LISTVIEW控件。这里需要增加右键菜单功能,实现:打开、另存为、全部保存。如果没有附件,就不显示这个控件。 七、分析邮件内容 1、例如: From: Nathaniel Borenstein <nsb@bellcore.com> TNed Freed <ned@innosoft.com> Subject: Formatted text mail MIME-Version: 1.0 Content-Type: multipart/alternative; boundary=boundary42 –boundary42 Content-Type: text/plain; charset=us-ascii …plain text version of message goes here…. –boundary42 Content-Type: text/richtext …. richtext version of same message goes here … –boundary42 Content-Type: text/x-whatever …. fanciest formatted version of same message goes here … –boundary42– 处理方法: a) 编码方法 Content-Transfer-Encoding := "BASE64" / "QUOTED-PRINTABLE" b) 文件类型 Content-type: text/plain; charset=us-ascii Content-Type: text/richtext Content-Type: text/x-whatever Content-Type: text/html; 等等。 根据编码,先解码,然后保存成相应的文件,一般两种,*.txt和*.html。 c) 对于alternative,即相同的内容,不同的文件格式,如果有HTML,则以HTML显示,如果没有,则以TXT或其他显示。 2、邮件的内容格式是多样的,有的附件,有的没有。有的进行了编码,有的没有。有的邮件是简单的一快内容,有的是多个组合的。所以进行分析时要考虑到所有的情况。根据RFC文档进行详细分析。 3、VB中使用WebBrowser控件,把临时文件打开即刻。 附1、Quoted-Printable解码 int quoted_to_str(const char *src, char *target, int targsize) { int srclen; int i, j; char ch, ch1, ch2; unsigned char hz; srclen = strlen(src); for(i = 0, j = 0; i < srclen || j < targsize ; i++, j++) { ch = src; if (ch == ‘=’) {ch1 = src[++i]; ch2 = src[++i]; hz = (ch1>’9′?ch1-’A'+10:ch1-’0′)*16+(ch2>’9′?ch2-’A'+10:ch2-’0′); target[j] = hz;} else target[j] = ch; } return j; } 该文章在 2012/2/17 0:33:14 编辑过 |
关键字查询
相关文章
正在查询... |