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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
javaMail的详细文档,都有以下多有类的详细信息: ACL Address AddressException AddressStringTerm AddressTerm AndTerm AuthenticationFailedException Authenticator BodyPart BodyTerm ByteArrayDataSource ComparisonTerm ConnectionAdapter ConnectionEvent ConnectionListener ContentDisposition ContentType DateTerm DeliveryStatus DispositionNotification FetchProfile FetchProfile.Item Flags Flags.Flag FlagTerm Folder FolderAdapter FolderClosedException FolderEvent FolderListener FolderNotFoundException FromStringTerm FromTerm Header HeaderTerm HeaderTokenizer HeaderTokenizer.Token IllegalWriteException IMAPFolder IMAPFolder.FetchProfileItem IMAPFolder.ProtocolCommand IMAPMessage IMAPSSLStore IMAPStore IntegerComparisonTerm InternetAddress InternetHeaders InternetHeaders.InternetHeader MailDateFormat MailEvent MailHandler MailSSLSocketFactory Message Message.RecipientType MessageAware MessageChangedEvent MessageChangedListener MessageContext MessageCountAdapter MessageCountEvent MessageCountListener MessageHeaders MessageIDTerm MessageNumberTerm MessageRemovedException MessagingException MethodNotSupportedException MimeBodyPart MimeMessage MimeMessage.RecipientType MimeMultipart MimePart MimePartDataSource MimeUtility Multipart MultipartDataSource MultipartReport NewsAddress NoSuchProviderException NotTerm OrTerm ParameterList ParseException Part PasswordAuthentication POP3Folder POP3Message POP3SSLStore POP3Store PreencodedMimeBodyPart Provider Provider.Type Quota Quota.Resource QuotaAwareStore ReadOnlyFolderException ReceivedDateTerm RecipientStringTerm RecipientTerm Report Rights Rights.Right SearchException SearchTerm SendFailedException SentDateTerm Service Session SharedByteArrayInputStream SharedFileInputStream SharedInputStream SizeTerm SMTPAddressFailedException SMTPAddressSucceededException SMTPMessage SMTPSendFailedException SMTPSSLTransport SMTPTransport Store StoreClosedException StoreEvent StoreListener StringTerm SubjectTerm Transport TransportAdapter TransportEvent TransportListener UIDFolder UIDFolder.FetchProfileItem URLName
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值