如何判断一封邮件是否新邮件?(50分)

  • 主题发起人 MicroZeng
  • 开始时间
看样子问题分数可能太少了 :cool:
 
请问各位老兄:
用DELPHI4的NMPOP3接受邮件时, 如何判断是否是新邮件?
 
Hi,MicroZeng
判断新邮件的问题是这样的,在接受的EMAIL 头文件里存放着来信人的地址
发信服务器和发信日期
您可以注意到头文件里的每一条信息都表示着不同的含义
判断是否是一封新邮件的关键是 发信人地址,发信时间序号这两项就可以了
至于如何判断区分是否是新信息的话
还要您在本地EMAIL 里做一个小的数据库程序来搜索
FOXMAIL就是这么做的(FOXMAIL使用的是DELPHI2写成),还有著名的离线
NEWS浏览器FORE AGENT也是这个原理,他们在本地都放有已收到过的EMAIL
的索引文件,连接到EMAIL SERVER后, 取下头来和本地EMAIL 列表的索引
文件做比较,看是否已经下载过此邮件,如果未下载过,当然就是新邮件了

你可以这样比较一下就知道了,把邮件程序的收到邮件后删除邮件选项去掉
先用第一个EMAIL 软件下载下来邮件,然后再启动第2个试验一下
那封邮件还会被下载,就说明了,每种EMAIL软件都是有自己的客户端的
认证机制。这与 SERVER是无关的

至于具体如何判断,在DELPHI3的DEMOS例子里有这样的一个例子程序
客户端收到EMAIL后,它的头文件如下,

Received: from public.fhnet.cn.net (ns.fhnet.cn.net [202.99.8.1])
for <hehe@tonghua.com.cn>; Sun, 8 Nov 1998 02: 38:09 +0800 (CST)
Received: from wanghs ([202.99.34.78])
for <hehe@tonghua.com.cn>; Sun, 8 Nov 1998 02: 30:19 +0800 (CST)
Message-Id: <199811071830.CAA09283@public.fhnet.cn.net>
//注意上面这一行,邮件发出日期,发出的邮件在发信服务器里的序列号码
//您可以根据上面的这段字符串在数据库里搜索,看是否有匹配记录
//如果已经存在了就是旧邮件了
Date: Sun, 8 Nov 1998 2:32:14 +0800
From: wang han song <wanghs@nease.net>
Reply-To: hehe@tonghua.com.cn
To: "hehe@tonghua.com.cn" <hehe@tonghua.com.cn>
Subject: hi
Organization: Dayu tech company
X-mailer: FoxMail 2.1 [cn]
Mime-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
X-UIDL: 3d12d3000acc380ec97e8ffb8b2fc119


 
刚才又看了DELPHI4里的NMPOP31,发现NMPOP31可以直接得到
EMAIL 头的
var S:String;
begin
S := NMPOP31.MailMessage.MessageID;
MessageId是这样的一个字串
<199811071830.CAA09283@public.fhnet.cn.net>
您可以参照我答的如何取的邮件头里的时间那问题
结合数据库做这个工作很好判断的
建一个小数据库,或自己的索引文件格式, 用SERVER名字
和SERVER端的发信时间做复合索引 每次新邮件
下载下来后,把MESSAGE ID保存就可以了
因为对于发信服务器来说,发信详细时间是唯一的
这样就可以区分是否此邮件已经DOWN过了

end;
 
王寒松,您好!您说的这种方法我考虑到了.
但是对于
1、同一个办公室里的人都用同一个信箱,且有多台计算机;
2、重新格式化硬盘后,数据库信息丢失,无法判断;
3、数据库损坏后,无法判断;
等几种情况就无能为力了。
我以前做过一个铁道部SprintMail网的电子邮件,
SprintMail网有简单的方法来区别邮件是否下在过
("scan" 和 "scan !",后者表示列出新邮件)。
不知Internet有没有类是的方法?
 
MicroZeng老兄,
1. 对于您的第一个问题,我想您可以采用这样的方法来做
其实和FoxMail作者张小龙的做法差不多,那就是对每一个人都
动态的创建一个信箱数据库,如果您用过张小龙的FOXMAIL
可以注意到他有个mail目录,里面有好多文件,那就是一个信箱帐号对应
一个数据库和一个索引文件.
实际上,在您办公室里的人公用一个信箱的时候,
您根本无法使用计算机来判断一封信是发给谁的,您说是吧。
(人要处理这步任务,要打开信,看看是给谁的)
好的办法就是允许支持多信箱, 然后为每个人申请一个邮件地址


2和3的理由稍有些牵强了,任何数据库都有可能崩溃的,任何硬盘都有可能
随时被格式化,要看维护和使用的好坏了


SprintMail网的MAIL SERVER上一定有一个标志表示此邮件是否被下载过
所以客户端的程序可以直接取标志。 但是按我上面第一帖的试验方法
可以看出来,INTERNET的EMAIL SERVER似乎没有此标记。否则第2次
用另一个EMAIL CLIENT程序下载时就不会出现和第一个重复的信件
您自己可以试验一下看看。

关于如何判断新邮件这个问题,我认为就只能答到这里了。
 
王寒松,您好!
如果一个人在不同的机器上,使用相同的帐号,
如何判断新邮件?
 
我认为正确的说法应该是客户端和服务器端都有此功能,
不同平台上的实现方式可能不同,但MailServer肯定是有
新/旧邮件的标志的.

然而大部分邮件客户软件都没有(或难以)利用服务端的标志,
而是自己采用匹配的方式来判断新旧邮件.如果要在客户端
完全毁坏的情况下仍然能判断新旧邮件,就必须去研究Server
端的处理了.
 
接受答案了.
 
顶部