客户端邮件收发软件是如何知道知道邮件服务器上哪些邮件是已经收下来过了?(50分)

  • 主题发起人 主题发起人 Boblee
  • 开始时间 开始时间
B

Boblee

Unregistered / Unconfirmed
GUEST, unregistred user!
象outlook那样,如果信已收过后,它就不会再把它从上面收下来。我想知道的是,它是如何
做到的。因为我现在做一个mail控件,用它在ASP页面中收,它总是不管3721每次总是把服务
器上的邮件都收下来而不管这个邮件是否已收下来过。
这个问题我该怎么解决?
 
你查一下POP3协议中的的get命令,看有没有什么参数控制,实在不行就在程序中记录,如果收过
就不再接收.
 
程序中记录是不行,因为现在我就是这样做的,收下来的信存在DB中,每次收信时就先
检查一下将要收的信是否已存在DB中。但如果用户把旧信全清后再收时,
所有的信就又会被收来。哪里可得到POP3的详细协议?
 
可以把收了的信的记录保存下来,内容可以删了,这不就行了![:)]
 
这是没有办法的办法,肯这会造成DB严重的垃圾,因为用系统的人很多(有好几千)。这不是
办法。
 
看看这个有用:
转载
POP3协议命令原始码及工作原理
2001-10-23 07:56
发布者:netbull
一 简介:
1. POP适用于C/S结构的脱机模型的电子邮件协议,目前已发展
到第三版,称POP3。脱机 模型即不能在线操作,不像IMAP4
(netscape支持IMAP4)
2. 当客户机与服务器连接并查询新电子邮件时,被该客户机指
定的所有将被下载的邮件 都将被程序下载到客户机,下载后,
电子邮件客户机就可以删除或修改任意邮件,而无需与电子邮件
服务器进一步交互。
3. POP3客户向POP3服务器发送命令并等待响应,POP3命令采用
命令行形式,用ASCII码 表示。
服务器响应是由一个单独的命令行组成,或多个命令行组成,响
应第一行以ASCII文本+ OK或-ERR指出相应 的操作状态是成功还
是失败
4. 在POP3协议中有三种状态,认可状态,处理状态,和更新状态。
当客户机与服务器建立联系时,一旦客户机提供了自己身份并成
功确认,即由认可状态转入处理状态, 在完成相应的操作后客
户机发出quit命令,则进入更新状态,更新之后最后重返认可
状态。如下图
等待连接 身份确认 quit命令
—— |认可|————— |处理|——————|更新|
|__________________________________|
重返认可状态
5. 认可状态的命令语句
一般情况下,大多数现有的POP3客户与服务器执行采用ASCII明
文发送用户名和口令,在 认可状态等
待客户连接的情况下,客户发出连接,并由命令user/pass对在网络上发送明文用户名和 口令给服务器
进行身份确认。一旦确认成功,便转入处理状态。
为了避免发送明文口令的问题,有一种新的认证方法,命令为
APOP,使用APOP,口令在 传输之前被加密。
当第一次与服务器连接时,POP3服务器向客户机发送一个ASCII
码问候,这个问候由一串字符组成对每个客户机是唯一的,与当
时的时间有关,然后,客户机把它的纯文本口令附加到从服务器接
收到的字符串之后,然后计算出结果字符串的MD5单出函数消息
摘要,客户机把用户名与MD5消息摘要作为APOP命令的参数一起
发送出去。
目前,大多数windows上的邮件客户软件不支持APOP命令,qpopper支持。
6. POP3命令码如下:
命令 参数 状态 描述
------------------------------------------
USER username 认可 此命令与下面的pass命令若成功,将导致状态转换
PASS password 认可
APOP Name,Digest 认可 Digest是MD5消息摘要
------------------------------------------
STAT None 处理 请求服务器发回关于邮箱的统计资料,如邮件总数和总字节数
UIDL [Msg#] 处理 返回邮件的唯一标识符,POP3会话的每个标识符都将是唯一的
LIST [Msg#] 处理 返回邮件数量和每个邮件的大小
RETR [Msg#] 处理 返回由参数标识的邮件的全部文本
DELE [Msg#] 处理 服务器将由参数标识的邮件标记为删除,由quit命令执行
RSET None 处理 服务器将重置所有标记为删除的邮件,用于撤消DELE命令
TOP [Msg#] 处理 服务器将返回由参数标识的邮件前n行内容,n必须是正整数
NOOP None 处理 服务器返回一个肯定的响应
------------------------------------------
QUIT None 更新
a.客户机希望结束这次会话
b.如果服务器处于‘处理’状态,那么将进入‘更新’状态以删除任何标记为删除的邮

c.导致由处理状态到更新状态,又重返认可状态的转变
d.如果这个命令发出时服务器处于‘认可’状态,则结束会话,不进行‘更新’状态。

7. POP3协议在TCP/110端口上等待客户连接请求。
8. 若密码为明文,我如何监听?
下面的命令在服务器运行后在屏幕上显示POP3连接及命令发送的过程:
#sniffit -a -A. -p 110 -b -s 192.169.11.12
note: 192.168.11.12是客户机IP地址
你需要事先安装sniffit这个端口监听程序
9. 考虑这种情况,若客户在收取邮件时,假定为15封信等待接收,但由于线路问题,收
到第10封时断线了,
为什么下次收时仍然从第一封开始,也即为什么前10封没有被从服务器上删除掉?
任何邮件的删除都必须在quit命令发出后对已标记为删除的邮件执行删除操作,由于中
途断线,仍处于
处理状态,没有机会执行quit命令以进行状态转换。
10. pop3 session is locked by another session, please wait 10 minutes then t
ry again.
由于非正常操作引起POP3程序内部机制锁住该次会话。
11. Foxmail与OE(outlook express)的处理机制的不同。
a. 假定服务器上有三封邮件等待客户机接收。用foxmail与OE的不同之处在于
foxmail每收一封标记删除一封,而OE则等全部接收完后再全部标记为删除最后执行qui
t命令。
Foxmail OE
-------------------------------
retr 1 retr 1
dele 1 retr 2
retr 2 retr 3
dele 2 dele 1
retr 3 dele 2
dele 3 dele 3
quit quit
b. Foxmail的远程邮件管理是非常优秀的管理工具,假定服务器上有三封信,对第一封
,我们不想接收
想从服务器直接删除;对第二封,想接收但不删除,对第三封,这一次不想接收,分别
标记后
最后foxmail发出的命令是
dele 1
retr 2
quit
c. 若没有foxmail,正好有几封很大的信堵住了,我不想接收,想直接删除它,或者想
查看这两封是谁发的?
直接在windows的DOS窗口下用命令行操作,如:
# telnet my.isp.net 110
user username
pass password
list

dele 3
dele 5
quit
--


 
在现在的pop3服务器中一般都支持一个非标准的命令:
last
使用它可以只返回邮箱中未读的邮件,方法如下:
当接收完邮件后,如果不想删除服务器上的邮件,就只使用一下rset命令,这样下次使用last时
这次的所有邮件就不再返回了.要想返回所有的就再用list.
 
To windbell
我想知道的是,你第二个帖子中提到的删除(dele )是真正的把邮件从服务器上删除
还是不是。用outlook,我选的是保存服务器上的邮件(outlook缺省设置也是不删的),
那它在收信时是怎么处理的?看你的二帖,如果OE也是dele(只不过是在收信最后),那这
个dele就不是真正的删除,而可以理解为只把邮件标识为已读。而如果是这样,那OE等又是
如何判断哪些是已读而不收呢?是用你第三帖中提到的last命令吗?
 
dele是真正的把邮件从服务器上删除,但你在退出前如果使用了rset命令或不正常退出时,就不会删除了.
我最近又验证了一遍,同一个邮箱.分别使用foxmail和OE进行接收:
在OE中设置为服务器上保留副本并接收后,FOXMAIL不受影响,仍然将所有邮件都收下了,反之同样.
但其自已却能记住是否已经接收,所以我想它们还是在内部记录下的,而不是在服务器中有什么标记或
命令.你可以用telnet命令连接到一个pop3服务器上,使用上面的命令试验,每一个邮件都有一个
唯一的message-id,它是服务器生成的,可能就是在内部数据文件中记录了该信息,从而达到有选择的接收.
 
感激windbell兄---没叫错吧:) 的试验和分析。我想也是OE等软件自己在内部维护了一个类
似DB一样的东西来记录所有曾收过的信的message-id.每一次收信时每收一封就到这个DB中去
比较看存不存在,存在就略过。现在的问题是我如何得到这个message-id?
还有我用的是win 2000,如何telnet.我的操作如下,但不知如何继续。
我用的是win 2000
我telnet 到我的邮件服务器:
telnet mail.myweb.com.cn 110
出来:
+ok Hello There
我该怎么输入用户名和密码?
 
服务器上如果有数据库来保存某邮件是否被删除或者接收过的话,那一定是服务器自己用的,
比如你从Browser中收邮件,下次你打开web后会发现这封邮件已经标记为已读,但是这时如果
你用OE和FoxMail去接收,仍然把它收下来,因为对于OE和Foxmail,并不能取服务器的标记数据.
再作一个试验,你在Foxmail中再建一个张号,它的用户名密码以及服务器等等都设为原来
那个张号,然后试着接收服务器的邮件,结果发现所有的邮件无论以前有没有接收过,都会接收
下来.

windbell兄说的下面的东东:
Foxmail OE
-------------------------------
retr 1 retr 1
dele 1 retr 2
retr 2 retr 3
dele 2 dele 1
retr 3 dele 2
dele 3 dele 3
quit quit

是指在服务器上不保留备份的情况,
如果客户端设置在服务器保留备份,则两个软件的执行过程应该是一样的.
Foxmail OE
-------------------------------
retr 1 retr 1
retr 2 retr 2
retr 3 retr 3
quit quit

在服务器中每个邮件都有一个唯一的标识符,UIDL可以返回指定邮件的唯一标识符,当客户端
接收邮件后,在客户端数据库中保存这个唯一标识符,下次接收这个邮件时如果发现数据库中
已经存在这个标识符,则不用再去接收了.
而且这个标识符数据库存在于每一个账号中,所以当你新建账号来接收邮件时,这个数据是空的,
所以会接收下所有的邮件,无论以前是否已经接收.
 
在上面已经列出了命令:
USER username 认可 此命令与下面的pass命令若成功,将导致状态转换
PASS password 认可
APOP Name,Digest 认可 Digest是MD5消息摘要 //一般可以不用,只有在保密很高时使用
------------------------------------------
STAT None 处理 请求服务器发回关于邮箱的统计资料,如邮件总数和总字节数
UIDL [Msg#] 处理 返回邮件的唯一标识符,POP3会话的每个标识符都将是唯一的
LIST [Msg#] 处理 返回邮件数量和每个邮件的大小
RETR [Msg#] 处理 返回由参数标识的邮件的全部文本
DELE [Msg#] 处理 服务器将由参数标识的邮件标记为删除,由quit命令执行
RSET None 处理 服务器将重置所有标记为删除的邮件,用于撤消DELE命令
TOP [Msg#] 处理 服务器将返回由参数标识的邮件前n行内容,n必须是正整数
NOOP None 处理 服务器返回一个肯定的响应
------------------------------------------
QUIT None 更新

//比如你的用户名是abc密码是123则当telnet登录进入后,出现
+ok Hello There //这时处于[red]认可[/red]状态,就是用户论证状态
//+ok相当dos的提示符,一般命令正确执行后出现,如果不正确出现-error提示
user abc //应当出现+ok,否则下一步pass命令不能进行
pass 123 //出现+ok,此后进入[red]处理[/red]状态.
然后使用上面的命令进行处理就可以了.


 
我理解了,谢谢各位。
给分喽。
 
后退
顶部