|
锁定老贴子 主题:javamail pop3 收信问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间:2006-12-28
业务需求:
1.收取邮件 2.每次只处理一封邮件,且这封邮件是未读过的 3.处理完邮件之后就给他设置一个SEEN的标志 环境: 1.mailserver 是qpopper4.0.9 ,据搭服务器的人说是标准pop3服务器 2.javamail 1.4 下面是我写的代码
public static void main(String args[]) {
try {
String host = "172.23.9.51";
String user = "askmail";
String password = "askmail2006";
Session session = Session.getDefaultInstance(
System.getProperties(), null);
Store store = session.getStore("pop3");
store.connect(host, -1, user, password);
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_WRITE);
int totalMessages = folder.getMessageCount();
if (totalMessages == 0) {
System.out.println("メールは0件です");
folder.close(true);
store.close();
return;
}
for(int i=1;i<=folder.getMessageCount();i++){
if(!folder.getMessage(i).getFlags().contains(Flags.Flag.SEEN)){
Message message = folder.getMessage(i);
dumpPart(message);
message.setFlag(Flags.Flag.SEEN, true);
}
}
}
public static void dumpPart(Part p) throws Exception {
String html = "";
boolean attachment = false;
if (p.isMimeType("text/plain")) {
System.out.println("内容:" + p.getContent());
} else if (p.isMimeType("multipart/*")) {
Multipart mp = (Multipart) p.getContent();
int count = mp.getCount();
for (int i = 0; i < count; i++) {
dumpPart(mp.getBodyPart(i));
}
} else if (p.isMimeType("message/rfc822")) {
dumpPart((Part) p.getContent());
} else if (p.isMimeType("text/html")) {
html = ".html";
attachment = true;
} else {
attachment = true;
}
if (attachment) {
String disp = p.getDisposition();
if (disp == null || disp.equalsIgnoreCase(Part.ATTACHMENT)
|| disp.equalsIgnoreCase(Part.INLINE)) {
String filename = p.getFileName();
if (filename != null) {
filename = MimeUtility.decodeText(filename);
try {
File f = new File(filename);
if (f.exists()) {
throw new IOException("same file exist");
}
OutputStream os = new BufferedOutputStream(
new FileOutputStream(f));
InputStream is = p.getInputStream();
int c;
while ((c = is.read()) != -1) {
os.write(c);
}
os.close();
} catch (IOException e) {
}
}
}
}
}
从网上查说pop3 mailserver 只支持delete 标签,用javamail实验Delete flag确实成功了.研究了一下javamail的javadoc,com.sun.mail.pop3 这个包下的类是为pop3 message store 提供的.所以想用他实现我的需求.但 if(pop3Folder.getMessage(i).getFlags().contains(Flags.Flag.SEEN)) 这句话运行的时候总过不去.没办法这时我只能把问题定位到pop3 mailserver.请教搭建mailserver 的人,他说象outlook这样的客户端是实现的基本pop3客户端,没有进行扩展,用他能实现的我的需求,说明mailserver没问题.是程序的问题. 请大家指教 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2006-12-28
现在大家都没有时间吗,心急如焚啊!帮自己顶一下
|
|
| 返回顶楼 | |
|
最后更新时间:2006-12-28
pop3协议只支持DELETED标记,SEEN等其他标记只有IMAP协议支持。
要判断邮件是否已读,只能在本地处理,如建一个已接收邮件SID库。 |
|
| 返回顶楼 | |
|
最后更新时间:2006-12-28
用com.sun.mail.pop3包下的类,程序也能运行了,可SEEN这个标志还是不起作用,看来真的是mail server的问题了.但outlook是怎么实现的呢?
|
|
| 返回顶楼 | |
|
最后更新时间:2006-12-28
zelsa 写道 pop3协议只支持DELETED标记,SEEN等其他标记只有IMAP协议支持。
要判断邮件是否已读,只能在本地处理,如建一个已接收邮件SID库。 SID库是什么意思? |
|
| 返回顶楼 | |
|
最后更新时间:2006-12-28
更多地被称为UID,能唯一标示一封邮件的代码,可以通过message.getMessageID()得到,可以建议张表专门存放UID,然后在收邮件前可以先根据UID判断邮件是否已经收过了。
|
|
| 返回顶楼 | |
|
最后更新时间:2006-12-28
哦明白了,多谢!顺便问一下outlook等软件用pop3协议连接mailserver时是不是也是采用类似的机制
|
|
| 返回顶楼 | |
|
最后更新时间:2006-12-29
zelsa 写道 更多地被称为UID,能唯一标示一封邮件的代码,可以通过message.getMessageID()得到,可以建议张表专门存放UID,然后在收邮件前可以先根据UID判断邮件是否已经收过了。
我在message下找不到这个方法啊! |
|
| 返回顶楼 | |
|
最后更新时间:2006-12-29
((MimeMessage)message).getMessageID()
|
|
| 返回顶楼 | |
|
最后更新时间:2006-12-29
zelsa 写道 ((MimeMessage)message).getMessageID()
哈哈,谢谢了,我还以为是我javamail的版本问题,正为上不去sun的网站着急呢!非常感谢 |
|
| 返回顶楼 | |





