做了几天都没有解决的问题,求邮件收到的问题! ( 积分: 5 )

  • 主题发起人 主题发起人 zpselect
  • 开始时间 开始时间
Z

zpselect

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在在做一个邮件收发的程序,但是遇到一个问题,如果只下载新的邮件,我想这个问题很多人都在烦恼着,不知道你将此问题解决了没有?
我想了一个死方法,但这个方不理想!

1:首先第一次收发时是将邮件所有的邮件都下载本地表中,
2:第二次收发时,取得本地表最大的邮件日期,循环所有的POP邮件个数,如果IdMessage.Date>MaxDate(本地表最大的日期)那么将该条邮件记录插入到本地表中,以此类推!

这个方法我已经成功实现收到邮件内容到本地表中的功能
但是有一点不知道你注意到了没有?每一次点击收到时POP都会循环其所有的邮件个数,如果邮箱中的箱件个数非常大的话,会花费很长的时间(如果,实际上邮件中只有一封新邮件),可否有办法在POP就筛选了邮件的个数,如:将POP中日期>MaxDate,筛选出来,再循环(即只有新的邮件了)!不知道你没有这样的主法?

for i := 1 to POP.CheckMessages do (在此之前筛选日期> MaxDate)
begin
IdMessage.Clear;
POP.Retrieve(i, IdMessage);
if IdMessage.Date > MaxDate then
table.append;
..........
end;
 
如果我没理解错,这个程序 意义不大。 建议你了解下 IMAP协议。。
支持 IMAP协议的客户端就可以实现你的需求。
 
晕死,意义不大的话老板也不会叫我做了!
 
用日期比较是不对的,还是先看看协议吧,pop3协议有uidl
 
UIDL这一个值我取到了,但是这个ID又能起着什么作用呢?与表中的的UIDL一个一个比吗?如果是那样的话,比起比较日期来说又有什么区别呢?如果邮件里其实只有1封新邮件,而邮箱总共有1000封邮件,那么POP同样要循环1000次,我的意思,如果有其它什么方法能够使POP只循环一次!如果没有新邮件,那么POP同样也会循环1000次,你说呢?
for i := 1 to POP.CheckMessages do (1000次)
begin
.....
end;
 
参考一下FOXMAIL的远程管理, POP3协议有可以取邮件头, 再与本地比较, 这样会快一点.
 
取邮件头???是MessageID吗?
可否给点源码?
 
肯定是对MESSAGEID来操作,你那边比较日期,太麻烦了,可以看看我以前的贴子或留言
 
TO:ProLove
你比较MessageID,还不是一样的,一个一个的与本地表的数据进行比较!
 
UIDL 这个命令可一次性取得所有邮件的UID值及对应的邮件编号,你可以比较一下UID值在本地是否存在(当然首先你每收一封邮件就要保存该邮件的UID),然后根据邮件编号来取这个邮件就可以啦.
 
我每一次下载时都将UIDL保存到本地表里面,我知道你的意思,你是比较UIDL,但是
for i := 1 to POP.CheckMessages 这个瓶口怎么突破?
如果POP所连接的邮箱里1万封邮件
那么i要循环1万次,后怎么比较有什么关系?而想要减少循环的次数是减少i的循环次数!!!!打比方,邮箱里原有1万毕邮件,现在别人发了一封新邮件过来,我想做到的是i
只循环一次,而不是10001次,至于后面怎么毕业那是次要的!
我的那种比较日期的方法比你用UIDL来进行比较还要快,因为我只要取一次最大的日期就以了,而你用UIDL来比较的话,你每循环一次i,就要遍历本地表中的所有记录!
你明白不?
 
后退
顶部