论坛首页 Java版 企业应用

javamail pop3 收信问题

浏览 2969 次
精华帖 (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没问题.是程序的问题.
请大家指教
   
最后更新时间:2006-12-28
现在大家都没有时间吗,心急如焚啊!帮自己顶一下
   
0 请登录后投票
最后更新时间:2006-12-28
pop3协议只支持DELETED标记,SEEN等其他标记只有IMAP协议支持。
要判断邮件是否已读,只能在本地处理,如建一个已接收邮件SID库。
   
0 请登录后投票
最后更新时间:2006-12-28
用com.sun.mail.pop3包下的类,程序也能运行了,可SEEN这个标志还是不起作用,看来真的是mail server的问题了.但outlook是怎么实现的呢?
   
0 请登录后投票
最后更新时间:2006-12-28
zelsa 写道
pop3协议只支持DELETED标记,SEEN等其他标记只有IMAP协议支持。
要判断邮件是否已读,只能在本地处理,如建一个已接收邮件SID库。

SID库是什么意思?
   
0 请登录后投票
最后更新时间:2006-12-28
更多地被称为UID,能唯一标示一封邮件的代码,可以通过message.getMessageID()得到,可以建议张表专门存放UID,然后在收邮件前可以先根据UID判断邮件是否已经收过了。
   
0 请登录后投票
最后更新时间:2006-12-28
哦明白了,多谢!顺便问一下outlook等软件用pop3协议连接mailserver时是不是也是采用类似的机制
   
0 请登录后投票
最后更新时间:2006-12-29
zelsa 写道
更多地被称为UID,能唯一标示一封邮件的代码,可以通过message.getMessageID()得到,可以建议张表专门存放UID,然后在收邮件前可以先根据UID判断邮件是否已经收过了。


我在message下找不到这个方法啊!
   
0 请登录后投票
最后更新时间:2006-12-29
((MimeMessage)message).getMessageID()
   
0 请登录后投票
最后更新时间:2006-12-29
zelsa 写道
((MimeMessage)message).getMessageID()

哈哈,谢谢了,我还以为是我javamail的版本问题,正为上不去sun的网站着急呢!非常感谢
   
0 请登录后投票
论坛首页 Java版 企业应用

跳转论坛:
JavaEye推荐