JavaMail POP3 client

//Modified by zealvampire 2007-4-4  
类似foxmail那样,一个不好做的是怎样使本地邮件的拷贝和服务器上的同步,有些邮件没有时间戳,没有message-id,而且有些服务器邮件默认时间排序有些是升有些是降序。或者参考下开源的邮件客户端要好些。

import java.util.Date;
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.MimeMessage;
import javax.mail.search.*;

public class popMail
{

    
public popMail()
    
{
        protocol 
= "pop3";
        pageCount 
= 5;
        mailNum 
= 0;
    }


    
public void setUser(String user)
    
{
        
this.user = user;
    }


    
public void setPassword(String password)
    
{
        
this.password = password;
    }


    
public void setPopDns(String popDns)
    
{
        
this.popDns = popDns;
    }


    
public void setAddress(String address)
    
{
        
this.address = address;
    }


    
public void setProtocol(String protocol)
    
{
        
this.protocol = protocol;
    }


    
public int getMailNum()
    
{
        
return mailNum;
    }


    
public void connect()
    
{
        Properties p 
= new Properties();
        p.put(
"mail.host", popDns);
        session 
= Session.getInstance(p, new MailAuthenticator(user, password));
        
try
        
{
            store 
= session.getStore(protocol);
            store.connect();
            folder 
= store.getFolder("INBOX");
            folder.open(
2);
            mesg 
= folder.getMessages();
            mailNum 
= mesg.length;
        }

        
catch(NoSuchProviderException e)
        
{
            e.printStackTrace();
        }

        
catch(MessagingException e1)
        
{
            e1.printStackTrace();
        }

    }


    
public Message[] searchByID(String mesgID[])
    
{
        OrTerm orTerm;
        MessageIDTerm mesgIDTerm[] 
= new MessageIDTerm[mesgID.length];
        
for(int i = 0; i < mesgID.length; i++)
            mesgIDTerm[i] 
= new MessageIDTerm(mesgID[i]);

        orTerm 
= new OrTerm(mesgIDTerm);
        
if(folder == null)
            connect();
        Message mesgDone[] 
= folder.search(orTerm, mesg);
        
return mesgDone;
        Exception e;
        e;
        e.printStackTrace();
        
return null;
    }


    
public Message[] searchByFrom(String from[])
    
{
        OrTerm orTerm;
        FromStringTerm fromStringTerm[] 
= new FromStringTerm[from.length];
        
for(int i = 0; i < from.length; i++)
            fromStringTerm[i] 
= new FromStringTerm(from[i]);

        orTerm 
= new OrTerm(fromStringTerm);
        
if(folder == null)
            connect();
        Message mesgDone[] 
= folder.search(orTerm, mesg);
        
return mesgDone;
        Exception e;
        e;
        e.printStackTrace();
        
return null;
    }


    
public Message[] searchByDate(int comparision, Date date, boolean sentDateTermFlag)
    
{
        javax.mail.search.DateTerm dateTerm;
        
if(sentDateTermFlag)
            dateTerm 
= new SentDateTerm(comparision, date);
        
else
            dateTerm 
= new ReceivedDateTerm(comparision, date);
        
if(folder == null)
            connect();
        Message mesgDone[] 
= folder.search(dateTerm, mesg);
        
return mesgDone;
        Exception e;
        e;
        e.printStackTrace();
        
return null;
    }


    
public String delMails(int index[], mailHeaderData headerData[])
    
{
        
if(mesg == null)
            connect();
        StringBuffer buf 
= new StringBuffer();
        
for(int i = 0; i < index.length; i++)
        
{
            MimeMesgWrap mesgWrap 
= new MimeMesgWrap((MimeMessage)mesg[index[i]], index[i]);
            
if(mesgWrap.getMesgID().compareTo(headerData[i].getMesgid()) == 0)
                buf.append(mesgWrap.delMesg());
            
else
                buf.append(
"index=").append(index[i]).append("为垃圾邮件.");
        }


        
try
        
{
            closeAll();
        }

        
catch(Exception e)
        
{
            e.printStackTrace();
        }

        
return buf.toString();
    }


    
public String delAllGarbage()
    
{
        StringBuffer buf;
        
if(mesg == null)
            connect();
        
if(mesg == null)
            
return "mesg null error";
        String tmpId 
= "";
        buf 
= new StringBuffer();
        
for(int i = 0; i < mesg.length; i++)
        
{
            MimeMesgWrap mesgWrap 
= new MimeMesgWrap((MimeMessage)mesg[i], i);
            tmpId 
= mesgWrap.getMesgID();
            
if(tmpId.startsWith("garbage"))
                buf.append(mesgWrap.delMesg());
        }


        closeAll();
        
return buf.toString();
        Exception e;
        e;
        e.printStackTrace();
        
return e.getMessage();
    }


    
public String delAll()
    
{
        
if(mesg == null)
            connect();
        
if(mesg == null)
            
return "ERROR=FOLDER MESSAGE[] NULL";
        
int count = mesg.length;
        StringBuffer buf 
= new StringBuffer();
        
for(int i = 0; i < count; i++)
        
{
            MimeMesgWrap mesgWrap 
= new MimeMesgWrap((MimeMessage)mesg[i], i);
            buf.append(mesgWrap.delMesg());
        }


        
try
        
{
            closeAll();
        }

        
catch(Exception e)
        
{
            String str 
= "del all mails error=" + e;
            
return str;
        }

        
return buf.toString();
    }


    
public String[][] listMails(int page)
    
{
        String array[][];
        
if(mesg == null)
            connect();
        array 
= new String[pageCount][6];
        
int tmp = page * pageCount;
        
for(int i = page * pageCount; i < pageCount * (page + 1&& i < mesg.length; i++)
        
{
            MimeMesgWrap mesgWrap 
= new MimeMesgWrap((MimeMessage)mesg[i], i);
            
try
            
{
                array[i 
- tmp][0= mesgWrap.getMesgID();
                array[i 
- tmp][1= mesgWrap.getFrom();
                array[i 
- tmp][2= mesgWrap.getSentDate();
                array[i 
- tmp][3= mesgWrap.getSubject();
                array[i 
- tmp][4= String.valueOf(mesgWrap.getSize());
                array[i 
- tmp][5= mesgWrap.getIndex();
            }

            
catch(Exception e)
            
{
                e.printStackTrace();
            }

        }


        closeAll();
        
return array;
        Exception ex;
        ex;
        ex.printStackTrace();
        
return null;
    }


    
public Object[] getMailContentByIndexId(int index, mailHeaderData headerData, boolean downFlag, String filename, String savePath)
    
{
        Object array[] 
= new Object[3];
        
if(mesg == null)
            connect();
        
if(index > mesg.length)
            
return null;
        MimeMesgWrap mesgWrap 
= new MimeMesgWrap((MimeMessage)mesg[index], index);
        
if(mesgWrap.getMesgID().compareTo(headerData.getMesgid()) == 0)
        
{
            array[
0= "byIndex";
            
try
            
{
                mesgWrap.processMailContent(mesgWrap.getMimeMesg(), downFlag, filename, savePath);
                
if(!downFlag)
                
{
                    array[
1= mesgWrap.getContent();
                    array[
2= mesgWrap.getList();
                }

            }

            
catch(Exception e)
            
{
                e.printStackTrace();
                array[
0= "error";
            }

        }
 else
        
{
            array[
0= "byId";
            String tmp[] 
= {
                headerData.getMesgid()
            }
;
            Message tmpMesg 
= searchByID(tmp)[0];
            mesgWrap 
= new MimeMesgWrap((MimeMessage)tmpMesg, -1);
            
try
            
{
                mesgWrap.processMailContent(mesgWrap.getMimeMesg(), downFlag, filename, savePath);
                
if(!downFlag)
                
{
                    headerData.setFrom(mesgWrap.getFrom());
                    headerData.setIndex(mesgWrap.getIndex());
                    headerData.setMesgid(mesgWrap.getMesgID());
                    headerData.setSentDate(mesgWrap.getSentDate());
                    headerData.setSize(String.valueOf(mesgWrap.getSize()));
                    headerData.setSubject(mesgWrap.getSubject());
                    array[
1= mesgWrap.getContent();
                    array[
2= mesgWrap.getList();
                }

            }

            
catch(Exception ex)
            
{
                ex.printStackTrace();
                array[
0= "error";
            }

        }

        
try
        
{
            closeAll();
        }

        
catch(Exception e)
        
{
            e.printStackTrace();
        }

        
return array;
    }


    
public void closeAll()
        
throws Exception
    
{
        mesg 
= null;
        
if(folder != null)
        
{
            folder.close(
true);
            folder 
= null;
        }

        
if(store != null)
        
{
            store.close();
            store 
= null;
        }

        
if(session != null)
            session 
= null;
    }


    
public static void main(String argv[])
        
throws Exception
    
{
        popMail m 
= new popMail();
        m.setUser(
"zealvampire");
        m.setPassword(
"8779255");
        m.setPopDns(
"pop.21cn.com");
        m.setProtocol(
"pop3");
        m.listMails(
0);
    }


    
private String user;
    
private String password;
    
private String popDns;
    
private String address;
    
private String protocol;
    
private Session session;
    
private Store store;
    
private Folder folder;
    
private Message mesg[];
    
private int pageCount;
    
private int mailNum;
}


// Decompiled by DJ v2.9.9.60 Copyright 2000 Atanas Neshkov  Date: 2005-12-22 14:25:13
// Home Page : http://members.fortunecity.com/neshkov/dj.html  - Check often for new version!
// Decompiler options: packimports(3)
// Source File Name:   mailHeaderData.java

package com.zeal.mail;


public class mailHeaderData
{

    
public mailHeaderData()
    
{
        from 
= "";
        sentDate 
= "";
        subject 
= "";
        size 
= "";
        mesgid 
= "";
        index 
= "0";
    }


    
public void setFrom(String from)
    
{
        
this.from = from;
    }


    
public void setSentDate(String sentDate)
    
{
        
this.sentDate = sentDate;
    }


    
public void setSubject(String subject)
    
{
        
this.subject = subject;
    }


    
public void setSize(String size)
    
{
        
this.size = size;
    }


    
public void setMesgid(String mesgid)
    
{
        
this.mesgid = mesgid;
    }


    
public void setIndex(String index)
    
{
        
this.index = index;
    }


    
public String getFrom()
    
{
        
return from;
    }


    
public String getSentDate()
    
{
        
return sentDate;
    }


    
public String getSubject()
    
{
        
return subject;
    }


    
public String getSize()
    
{
        
return size;
    }


    
public String getMesgid()
    
{
        
return mesgid;
    }


    
public int getIndex()
    
{
        
int tmp = 0;
        tmp 
= Integer.parseInt(index);
        
return tmp;
        Exception e;
        e;
        e.printStackTrace();
        tmp 
= 0;
        
return tmp;
    }


    
private String from;
    
private String sentDate;
    
private String subject;
    
private String size;
    
private String mesgid;
    
private String index;
}


--------------------

// Decompiled by DJ v2.9.9.60 Copyright 2000 Atanas Neshkov  Date: 2005-12-22 14:25:42
// Home Page : http://members.fortunecity.com/neshkov/dj.html  - Check often for new version!
// Decompiler options: packimports(3)
// Source File Name:   MailAuthenticator.java

package com.zeal.mail;

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

public class MailAuthenticator extends Authenticator
{

    
public MailAuthenticator()
    
{
        user 
= "";
        password 
= "";
    }


    
public MailAuthenticator(String user, String password)
    
{
        
this.user = user;
        
this.password = password;
    }


    
public MailAuthenticator(String user)
    
{
        
this.user = user;
        password 
= "";
    }


    
public PasswordAuthentication getPasswordAuthentication()
    
{
        
return new PasswordAuthentication(user, password);
    }


    
private String user;
    
private String password;
}


-------------------

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import javax.mail.*;
import javax.mail.internet.*;

class MimeMesgWrap
{

    
public MimeMesgWrap(MimeMessage mesg, int index)
    
{
        content 
= new StringBuffer();
        
this.mesg = mesg;
        
this.index = index;
    }


    
public MimeMesgWrap(MimeMessage mesg)
    
{
        content 
= new StringBuffer();
        
this.mesg = mesg;
    }


    
public MimeMessage getMimeMesg()
    
{
        
return mesg;
    }


    
public String getIndex()
    
{
        
return String.valueOf(index);
    }


    
public String getFrom()
        
throws Exception
    
{
        InternetAddress address[] 
= (InternetAddress[])mesg.getFrom();
        fromAddress 
= address[0].toUnicodeString();
        
if(fromAddress == null || fromAddress.equals(""))
            fromAddress 
= "NULL";
        String tmp 
= mesg.getHeader("From")[0];
        System.out.println(
"From0=" + tmp + " fromAddress=" + fromAddress);
        
if(tmp.indexOf("=?"== -1)
            fromAddress 
= new String(tmp.getBytes("8859_1"), "GB2312");
        
return fromAddress;
    }


    
public String getSubject()
    
{
        
try
        
{
            subject 
= mesg.getSubject();
            
if(subject == null || subject.equals(""))
                subject 
= "NULL";
            String tmp 
= mesg.getHeader("Subject")[0];
            
if(tmp.indexOf("=?"== -1)
                subject 
= new String(tmp.getBytes("8859_1"), "GB2312");
        }

        
catch(Exception e)
        
{
            e.printStackTrace();
            subject 
= "NULL";
        }

        
return subject;
    }


    
public String getSentDate()
    
{
        java.util.Date date 
= mesg.getSentDate();
        
if(date == null)
            
return "unknown date";
        
try
        
{
            SimpleDateFormat format 
= new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
            sentDate 
= format.format(date);
        }

        
catch(Exception e)
        
{
            e.printStackTrace();
            
return "unknown date";
        }

        
return sentDate;
    }


    
public void processMailContent(Part part, boolean downFlag, String filename, String savePath)
        
throws Exception
    
{
        Object o 
= part.getContent();
        
if(o == null)
            content.append(o.toString() 
+ ":content null. ");
        
if(part.isMimeType("text/*"))
        
{
            
if(!downFlag)
            
{
                String tmp 
= o.toString();
                String contentType 
= mesg.getContentType().toLowerCase();
                
if(contentType.indexOf("charset"== -1)
                    tmp 
= new String(tmp.getBytes("8859_1"), "GB2312");
                content.append(tmp).append(
" ");
            }

        }
 else
        
if(part.isMimeType("multipart/*"))
        
{
            MimeMultipart parts 
= (MimeMultipart)o;
            processMultipart(parts, downFlag, filename, savePath);
        }
 else
        
if(mesg.isMimeType("message/rfc822"))
            processMailContent((Part)o, downFlag, filename, savePath);
        
else
            content.append(o.toString() 
+ ":Unknown mime type. ");
    }


    
public void processMultipart(MimeMultipart parts, boolean downFlag, String filename, String savePath)
    
{
        
try
        
{
            
int count = parts.getCount();
            alist 
= new ArrayList();
            
for(int i = 0; i < count; i++)
            
{
                BodyPart bodyPart 
= parts.getBodyPart(i);
                String disposition 
= bodyPart.getDisposition();
                
if(disposition == null)
                    disposition 
= "";
                
if(disposition.equals("attachment"|| disposition.equals("inline"))
                
{
                    String aFileName 
= bodyPart.getFileName();
                    
if(aFileName == null)
                        aFileName 
= "";
                    
if(aFileName.toUpperCase().indexOf("?="== -1)
                        aFileName 
= new String(aFileName.getBytes("8859_1"), "GB2312");
                    
else
                        aFileName 
= MimeUtility.decodeText(aFileName);
                    System.out.println(
"aFileName2=" + aFileName);
                    alist.add(aFileName);
                    
if(!downFlag || filename.compareTo(aFileName) != 0)
                        
continue;
                    
try
                    
{
                        InputStream is 
= bodyPart.getInputStream();
                        String leg 
= String.valueOf(is.available());
                        System.err.println(aFileName 
+ "附件长度是:" + leg);
                        BufferedInputStream bis 
= null;
                        BufferedOutputStream bos 
= null;
                        
byte buff[] = new byte[512];
                        bis 
= new BufferedInputStream(is);
                        System.out.println(
"savePath=" + savePath);
                        FileOutputStream fos 
= new FileOutputStream(savePath + aFileName);
                        bos 
= new BufferedOutputStream(fos);
                        
int j;
                        
while((j = bis.read(buff, 0, buff.length)) != -1)
                        
{
                            bos.write(buff, 
0, j);
                            bos.flush();
                        }

                        fos.close();
                        bis.close();
                        bos.close();
                    }

                    
catch(Exception e)
                    
{
                        e.printStackTrace();
                    }

                    
break;
                }

                Object tmp 
= bodyPart.getContent();
                System.out.println(
"type=" + bodyPart.getContentType());
                
if(tmp != null)
                    
if(bodyPart.isMimeType("multipart/*"))
                        processMultipart((MimeMultipart)tmp, downFlag, filename, savePath);
                    
else
                    
if(!downFlag)
                        content.append(tmp.toString()).append(
" ");
            }


        }

        
catch(Exception e)
        
{
            e.printStackTrace();
        }

    }


    
public String delMesg()
    
{
        String str;
        
try
        
{
            mesg.setFlag(javax.mail.Flags.Flag.DELETED, 
true);
        }

        
catch(Exception e)
        
{
            e.printStackTrace();
            str 
= "set del flag error,index=" + index + " ";
            
return str;
        }

        str 
= "del flag success,index=" + index + " ";
        
return str;
    }


    
public ArrayList getList()
    
{
        
return alist;
    }


    
public int getSize()
    
{
        
try
        
{
            size 
= mesg.getSize();
        }

        
catch(Exception e)
        
{
            e.printStackTrace();
            size 
= 0;
        }

        
return size;
    }


    
public String getContent()
    
{
        
return content.toString();
    }


    
public String getMesgID()
    
{
        StringBuffer buf 
= new StringBuffer();
        String id 
= mesg.getMessageID();
        
if(id == null)
            buf.append(
"garbage-mail<").append(getEmailAddress()).append(">");
        
else
            buf.append(id);
        
return buf.toString();
        Exception e;
        e;
        e.printStackTrace();
        buf.append(
"garbage-mail<").append(getEmailAddress()).append(">");
        
return buf.toString();
        Exception ex;
        ex;
        ex.printStackTrace();
        
return "error";
    }


    
public String getEmailAddress()
        
throws Exception
    
{
        String str 
= "";
        InternetAddress address[] 
= (InternetAddress[])mesg.getFrom();
        str 
= address[0].getAddress();
        
return str;
    }


    
private MimeMessage mesg;
    
private int index;
    
private String subject;
    
private StringBuffer content;
    
private String fromAddress;
    
private String sentDate;
    
private ArrayList alist;
    
private int size;
}
阅读更多

没有更多推荐了,返回首页