Nov 09 2010

Java Mail 实现 POP3 收信 UIDL 命令

Category: 技术ssmax @ 17:18:33

今天有个项目要用到java mail 进行快速收信,但不删除邮件,所以需要用UIDL获取邮件唯一ID,上网找了一下java mail的实现,有一种改源代码提升效率的方法,不过改源代码比较难维护,所以我想java不至于连这个都没有实现吧,深入看了一下,发现java mail自带的方法就可以完成这个操作,在这里记录一下。

Session session = Session.getDefaultInstance(props, null);
session.setDebug(true);
//使用POP3会话机制,连接服务器
Store store = session.getStore(“pop3”);
store.connect(popServer, 110, popUser, popPassword);
POP3Folder folder = (POP3Folder)store.getFolder(“INBOX”);
//使用只读方式打开收件箱
folder.open(Folder.READ_ONLY);
//得到文件夹信息,获取邮件列表,此时列表中的对象是没有数据的初始化状态
Message[] msgs = folder.getMessages();
//执行UIDL指令,填入msgs对象中,只有POP3Message才有uid对象
FetchProfile fp = new FetchProfile();
fp.add(UIDFolder.FetchProfileItem.UID);
folder.fetch(msgs, fp);
//获取每个邮件的NUM 和 UID,默认就当你有一封信了,嘿嘿
System.out.println(msgs[0].getMessageNumber());
System.out.println(folder.getUID(msgs[0]));

set debug以后我们来看看输出:

DEBUG: setDebug: JavaMail version 1.4.3

DEBUG: getProvider() returning javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc]

DEBUG POP3: connecting to host “pop.126.com”, port 110, isSSL false

S: +OK Welcome to coremail Mail Pop3 Server (126coms[f7aa0ed0270c139a0807240dd700906bs])

C: CAPA

S: +OK Capability list follows

TOP

USER

PIPELINING

UIDL

.

DEBUG POP3: server doesn’t support TOP, disabling it

C: USER *******

S: +OK core mail

C: PASS *******

S: +OK 11 message(s) [766874 byte(s)]

C: STAT

S: +OK 11 766874

C: NOOP

S: +OK core mail

C: UIDL

S: +OK 11 766874

1 1tbirAJ99EX9fhakLwAAs8

2 1tbirAJ99EX9fhakLwABs9

3 1tbi5w1-9EzBsjIZ6AAAsd

4 1tbirAd-9EX9fibK1AAAse

5 1tbi3RR-9EsL9JOV8AAAsA

6 1tbiGAyA9El1nWUOqgAAsA

7 1tbirB+B9EX9fjVf8gAAsY

8 1tbi0hWC9EgYwFaoYwAAs8

9 1tbiBR2D9EkAFOKknwAAsr

10 1tbi0gGD9EgYwGOBNgAAsg

11 1tbi0gGD9EgYwGOBNgACsi

.

1                                                                   <————-System.out.println(msgs[0].getMessageNumber());

1tbirAJ99EX9fhakLwAAs8              <————-System.out.println(folder.getUID(msgs[0]));

C: QUIT

S: +OK core mail

3 Responses to “Java Mail 实现 POP3 收信 UIDL 命令”

  1. H.E. says:

    我提出修改JavaMail源代码的目的是为了能提高效率,而不是说JavaMail中不包含这个方法。因为无论通过JavaMail的api怎么获得UIDL ,都要先知道邮件的列表,例如:Message[] msgs = folder.getMessages();

    而我提出的方法是不需要知道文件夹中的邮件列表,发个命令给邮件服务器,直接获得UIDL。

    如果你的邮箱中1一个账户有10000封邮件,去比较新邮件的时候,显能知道差别了,就能明白我为什么这样做了。

    以上内容基本是我扯谈,有冒犯指出,多多包含。

  2. ssmax says:

    嗯嗯,pop3的效率的确不怎么样,以前我试过网易的邮箱到6-7万邮件的时候UIDL就会卡死,压根拿不出来,不过一个邮箱到这么多邮件还不删掉真是比较郁闷了。呵呵

  3. 移动破碎站 says:

    又一搞java mail的
    我原来用.Net实现这样的功能都很轻松的。

Leave a Reply