论坛首页 Java企业应用论坛

JavaMail判断新邮件

浏览 13709 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-04-19  
楼主太搞了,基于pop3的协议不采用uid来获取邮件,还能用啥?1000来封邮件将UID序列化到本地硬盘,占得了多少地方?在这个问题上我花了些时间研读些开源工具都是在UID上做文章的!
0 请登录后投票
   发表时间:2010-04-19  
passyt 写道
提供一个思路:
(1)可以从POP3Message的Head中取得Date,分析Date可以拿到ReceivedDate
(2)扩展javax.mail.search.SearchTerm,实现一个Pop3ReceivedDateTerm
public class Pop3ReceivedDateTerm extends SearchTerm {

	private static final long serialVersionUID = 4363009965326553239L;

	private int comparison;

	private Date date;

	public Pop3ReceivedDateTerm(int comparison, Date date) {
		this.comparison = comparison;
		this.date = date;
	}

	@Override
	public boolean match(Message message) {
		if ((message instanceof POP3Message) == false) {
			throw new IllegalStateException("The message is not POP3Message!");
		}
		if (this.date == null) {
			throw new IllegalArgumentException("The receivedDate could not be null!");
		}

		Date receivedDate = MailUtil.getPop3ReceivedDate((POP3Message) message);
		if (receivedDate == null) {
			return false;
		} else if (ComparisonTerm.EQ == this.comparison) {
			return this.date.equals(receivedDate);
		} else if (ComparisonTerm.GE == this.comparison) {
			return this.date.before(receivedDate) || this.date.equals(receivedDate);
		} else if (ComparisonTerm.GT == this.comparison) {
			return this.date.before(receivedDate);
		} else if (ComparisonTerm.LE == this.comparison) {
			return this.date.after(receivedDate) || this.date.equals(receivedDate);
		} else if (ComparisonTerm.LT == this.comparison) {
			return this.date.after(receivedDate);
		} else if (ComparisonTerm.NE == this.comparison) {
			return !this.date.equals(receivedDate);
		}
		return false;
	}

}

public static Date getPop3ReceivedDate(POP3Message message){
		try {
			String[] strs = message.getHeader("Date");			
			if(strs==null || strs.length != 1){
				return null;
			}
			
			String date = strs[0];
			DateFormat dateFormat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z",Locale.US);
			return dateFormat.parse(date);
		} catch (Exception e) {
			return null;
		}
	}

(3)利用folder.search(searchTerm)取得新邮件



这位大哥说得很好道理,我现在也是想通过解析邮件头信息,保存接收时间,下次从接收时间开始读..再判断接收时间,读接收时间以后的邮件。。
0 请登录后投票
   发表时间:2010-04-19  
他的这种实现方式也蛮好,继续关注此贴。。。。。。
0 请登录后投票
   发表时间:2010-04-20  
jiangshulin013 写道
他的这种实现方式也蛮好,继续关注此贴。。。。。。


这种好?

你为了一点存储空间 去解析邮件头?

如果全解析也就算了...你还是必须持久化一点数据...

基本无差别啊...
0 请登录后投票
   发表时间:2010-04-20  
我存的时间会更新的嘛,因为后收到的邮件的接收时间不可能还在上一封邮件到达的时间的前面嘛

0 请登录后投票
   发表时间:2010-04-20  
jiangshulin013 写道
我存的时间会更新的嘛,因为后收到的邮件的接收时间不可能还在上一封邮件到达的时间的前面嘛



非也
根据smtp协议 你发送邮件时可以设置很多信息 举个经典的例子
from是可以设定的 完全可以与你发邮件的邮箱不同
也就是说 我可以使用我的邮箱发出from写着楼主邮箱的 邮件
(当然 查看邮件头会发现是用我的邮箱发的...但是from可以设置..)
最初设定的原因是因为要模拟现实生活中的邮局..
(楼主写一封信,完全可以让朋友帮忙去邮局邮了..对吧?)


同样可以设定的内容很多..
其中就包括sendDate
记得很久以前 发简历 还专门把这个设置一下  这样hr收下来邮件 我就在最前....

当然,现在又一些邮件服务器加入了验证 比如163就不能随意设定from了
但是不是绝对的 对吧~


所以 如果你这么查看邮件 也许会悲剧...

当初pop3协议就没有考虑新邮件问题
因为模拟邮局吗...收了信邮局就没有信了...
所有pop3作为临时存贮用的...收了就删,当然不会出现问题...只是后来人们不想收了就删而已...


所以你这种走个性路线的办法 结果就算能实现 也不全面...

0 请登录后投票
   发表时间:2010-04-20  
我这个功能基本上实现了,就两个方法,我的文本文件里,不管接收多少封邮件,奴始终只保存着最后一封的时间,如果真的像你说的那样head信息里面的邮件到达时间可以自己设定的话,那我真的要重考虑这个问题,我刚刚开始接触公司里的企业邮箱产品的开发,不能有马虎,万一客户投诉了老板要扣我们的工钱。。哈哈
0 请登录后投票
   发表时间:2010-04-21   最后修改:2010-04-21
提供一个思路:
(1)可以从POP3Message的Head中取得Date,分析Date可以拿到ReceivedDate
(2)扩展javax.mail.search.SearchTerm,实现一个Pop3ReceivedDateTerm

这种思路当然不好!跟UID比差太大,不要以为只是取个head信息,其实还是需要把整个邮件的信息读到。这个方案我尝试过,效率跟UID去取新邮件,差得太大!(UID信息,不属于邮件内部的信息,相当于邮件存放文件夹的信息,类似与邮件的索引)
0 请登录后投票
   发表时间:2010-04-21  
huzhenyu 写道
提供一个思路:
(1)可以从POP3Message的Head中取得Date,分析Date可以拿到ReceivedDate
(2)扩展javax.mail.search.SearchTerm,实现一个Pop3ReceivedDateTerm

这种思路当然不好!跟UID比差太大,不要以为只是取个head信息,其实还是需要把整个邮件的信息读到。这个方案我尝试过,效率跟UID去取新邮件,差得太大!(UID信息,不属于邮件内部的信息,相当于邮件存放文件夹的信息,类似与邮件的索引)


当时我就由此疑问 你为了一点存储空间 去解析邮件头?
得到的结果就是 持久化一条日期数据
然后每次花费时间去解析邮件头 然后还会有设置特殊sendData收不到邮件的情况

存储uidlist  =  与持久层建立连接 拿到uidlist  + pop3取得uidllist + 对比uidlist
存储最后日期 = 与持久层建立连接 拿到日期 + pop3取得邮件的信头 + 解析信头 + 对比日期

典型的时间换空间...
在一个空间换时间的年代...这么做确实比较个性

而且还有我说的隐患...所谓得不偿失就是这样吧?
0 请登录后投票
   发表时间:2010-04-21  
是的吧,服务器上的邮件时间有些乱,你可以看看outlook里面邮件列表栏里面的接受时间,跟你打开邮件之后看到的发送时间,有些是对不上的,很乱。用时间去做判断就会存在漏收邮件的问题。
我也没找到什么好的办法去判断新邮件。

如果记住每封邮件的id,那么每次去收邮件是不是每次都遍历邮箱中的所有邮件?而且还得解析出来邮件的id,这样才能判断该邮件是不是已经收取过。如果是这样的话,我试过的,遍历起来太慢了。收邮件的时间会很长,尤其是当邮箱里面的邮件非常多的时候,更加慢的不行。

不知道outlook是怎么搞的。


期待好的方法
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics