JavaMail Pop获取邮件

 

主要步骤如下:

设置服务器,设置登录名,设置密码

获取连接

获取所有的信息Message

根据自己需要信息获取Email

 

工具类如下:

 

 

import com.sun.mail.pop3.POP3Folder;
import org.apache.commons.logging.Log;
 
import javax.mail.*;
import javax.mail.internet.*;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
 
public class ReceiveMail {
 
    final Log LOGGER = LoggerFactory.getLogger(getClass());
 
    private int mailCounter; //邮件计数
 
    private int mailIndex; //邮件编号,即邮件在messages数组中的位置
 
    private int mailDownErrorCounter; //正在下载邮件时,出错的计数器
 
    private boolean[] recordFailure; //记录下载出错的邮件的序号
 
    private int totalRetryTimes; //总共重试次数
 
    private int retryTimeCounter; //记下重试的次数
 
    private boolean otherError; //若是在邮件正式下载之前出错,则置该值为true
 
    private String extension = ".eml"; //文件扩展名
 
    private Store store;
 
    private Folder folder;
 
    private Message[] messages;
 
    private Message message;
 
    private Part part;
 
    private String emlName;
 
    private String attachName;
 
    private int allMessageCount;
 
    private int messageCount;
 
    private String dateformat; //默认的日前显示格式
 
    //  private String propFile = MailConstants.PROPS_FILE_NAME;//用这个接口类的好处是更改配置文件路径的时候不需要更改每个类
 
    private String protocol = "pop3"; //服务协议
 
    private String mailHost; //服务器地址
 
    private String userName; //用户名
 
    private String password; //密码
 
    private String saveAttachPath; //附件下载后的存放目录
 
    private String saveEmlPath = "D://tempEML//"; //保存eml文件的路径
 
    public ReceiveMail() throws IOException {
        /*   FileProperties fp = new FileProperties(propFile);
fp.load();
protocol = fp.getProperty(MailConstants.RECV_PROTO);
mailHost = fp.getProperty(MailConstants.RECV_HOST);
userName = fp.getProperty(MailConstants.RECV_USER);
password = fp.getProperty(MailConstants.RECV_PASS);
saveAttachPath = fp.getProperty(MailConstants.RECV_ATTACH);
saveEmlPath = fp.getProperty(MailConstants.RECV_ROOT);
dateformat = fp.getProperty("mail.receive.dtfmat");
extension = fp.getProperty("mail.receive.extension");
totalRetryTimes = Integer
        .parseInt(fp.getProperty("mail.receive.retry"));*/
    }
 
 
    /**
     * 获得发件人的地址和姓名
     *
     * @throws Exception
     */
    public String getFrom() throws Exception {
        return getFrom(this.message);
    }
 
    public String getFrom(Message mimeMessage) throws Exception {
        InternetAddress address[] = (InternetAddress[]) mimeMessage.getFrom();
        String from = address[0].getAddress();
        if (from == null)
            from = "";
        String personal = address[0].getPersonal();
        if (personal == null)
            personal = "";
        String fromaddr = personal + "<" + from + ">";
        return fromaddr;
    }
 
    /**
     * 获得邮件的收件人,抄送,和密送的地址和姓名,根据所传递的参数的不同 * "to"----收件人 "cc"---抄送人地址
     * "bcc"---密送人地址
     */
    public String getTOAddress() throws Exception {
        return getMailAddress("TO", this.message);
    }
 
    public String getCCAddress() throws Exception {
        return getMailAddress("CC", this.message);
    }
 
    public String getBCCAddress() throws Exception {
        return getMailAddress("BCC", this.message);
    }
 
    public String getTOAddress(Message mimeMessage) throws Exception {
        return getMailAddress("TO", mimeMessage);
    }
 
    public String getCCAddress(Message mimeMessage) throws Exception {
        return getMailAddress("CC", mimeMessage);
    }
 
    public String getBCCAddress(Message mimeMessage) throws Exception {
        return getMailAddress("BCC", mimeMessage);
    }
 
    public String getMailAddress(String type) throws Exception {
        return getMailAddress(type, this.message);
    }
 
    public String getMailAddress(String type, Message mimeMessage) throws Exception {
        String mailaddr = "";
        String addtype = type.toUpperCase();
        InternetAddress[] address = null;
        if (addtype.equals("TO") || addtype.equals("CC")
                || addtype.equals("BCC")) {
            if (addtype.equals("TO")) {
                address = (InternetAddress[]) mimeMessage
                        .getRecipients(Message.RecipientType.TO);
            } else if (addtype.equals("CC")) {
                address = (InternetAddress[]) mimeMessage
                        .getRecipients(Message.RecipientType.CC);
            } else {
                address = (InternetAddress[]) mimeMessage
                        .getRecipients(Message.RecipientType.BCC);
            }
            if (address != null) {
                for (int i = 0; i < address.length; i++) {
                    String email = address[i].getAddress();
                    if (email == null)
                        email = "";
                    else {
                        email = MimeUtility.decodeText(email);
                    }
                    String personal = address[i].getPersonal();
                    if (personal == null)
                        personal = "";
                    else {
                        personal = MimeUtility.decodeText(personal);
                    }
                    String compositeto = personal + "<" + email + ">";
                    mailaddr += "," + compositeto;
                }
                mailaddr = mailaddr.substring(1);
            }
        } else {
            throw new Exception("Error emailaddr type!");
        }
        return mailaddr;
    }
 
    /**
     * 获得邮件主题
     */
    public String getSubject() throws MessagingException {
        return getSubject(this.message);
    }
 
    public String getSubject(Message mimeMessage) throws MessagingException {
        String subject = "";
        try {
            subject = MimeUtility.decodeText(mimeMessage.getSubject());
            if (subject == null)
                subject = "";
        } catch (Exception exce) {
        }
        return subject;
    }
 
    /**
     * 获得邮件发送日期
     */
    public String getSentDate() throws Exception {
        return getSentDate(this.message);
    }
 
    public String getSentDate(Message mimeMessage) throws Exception {
        Date sentdate = mimeMessage.getSentDate();
        SimpleDateFormat format = new SimpleDateFormat(dateformat);
        return format.format(sentdate);
    }
 
    /**
     * 判断此邮件是否需要回执,如果需要回执返回"true",否则返回"false"
     */
    public boolean getReplySign() throws MessagingException {
        return getReplySign(this.message);
    }
 
    public boolean getReplySign(Message mimeMessage) throws MessagingException {
        boolean replysign = false;
        String needreply[] = mimeMessage
                .getHeader("Disposition-Notification-To");
        if (needreply != null) {
            replysign = true;
        }
        return replysign;
    }
 
    /**
     * 获得此邮件的Message-ID
     */
    public String getMessageId() throws MessagingException {
        return getMessageId(this.message);
    }
 
    public String getMessageId(Message mimeMessage) throws MessagingException {
        return ((MimeMessage) mimeMessage).getMessageID();
    }
 
    /**
     * 初始化出错邮件数组
     */
    private void setRecordFailure() {
        this.recordFailure = new boolean[getMessageCount()];
    }
 
    /**
     * 返回出错数组
     *
     * @return
     */
    public boolean[] getRecordFailure() {
        return this.recordFailure;
    }
 
    /**
     * 判断此邮件是否已读,如果未读返回返回false,反之返回true
     */
    public boolean isNew() throws MessagingException {
        return isNew(this.message);
    }
 
    /**
     * 判断此邮件是否已读,如果未读返回返回false,反之返回true
     */
    public boolean isNew(Message mimeMessage) throws MessagingException {
        boolean isnew = false;
        Flags flags = mimeMessage.getFlags();
        Flags.Flag[] flag = flags.getSystemFlags();
        for (int i = 0; i < flag.length; i++) {
            if (flag[i] == Flags.Flag.SEEN) {
                isnew = true;
                break;
            }
        }
        return isnew;
    }
 
    /**
     * 判断此邮件是否包含附件
     */
    public boolean isContainAttach() throws Exception {
        return isContainAttach(this.part);
    }
 
    /**
     * 判断此邮件是否包含附件
     */
    public boolean isContainAttach(Part part) throws Exception {
        boolean attachflag = false;
        String contentType = part.getContentType();
        if (part.isMimeType("multipart/*")) {
            Multipart mp = (Multipart) part.getContent();
            for (int i = 0; i < mp.getCount(); i++) {
                BodyPart mpart = mp.getBodyPart(i);
                String disposition = mpart.getDisposition();
                if ((disposition != null)
                        && ((disposition.equals(Part.ATTACHMENT)) || (disposition
                        .equals(Part.INLINE))))
                    attachflag = true;
                else if (mpart.isMimeType("multipart/*")) {
                    attachflag = isContainAttach((Part) mpart);
                } else {
                    String contype = mpart.getContentType();
                    if (contype.toLowerCase().indexOf("application") != -1)
                        attachflag = true;
                    if (contype.toLowerCase().indexOf("name") != -1)
                        attachflag = true;
                }
            }
        } else if (part.isMimeType("message/rfc822")) {
            attachflag = isContainAttach((Part) part.getContent());
        }
        return attachflag;
    }
 
    /**
     * 连到server,创建folder对象,创建message对象
     */
    public void getConn() {
        try {
            this.getStoreFromServer();
            this.getFolderFromStore();
        } catch (Exception e) {
            otherError = true;
            mailDownErrorCounter++;
            LOGGER.debug(e.getLocalizedMessage());
        }
    }
 
    /**
     * 建立Store连接
     */
    private Store getStoreFromServer() throws Exception {
        //创建session
        Session session = Session.getDefaultInstance(System.getProperties(),
                null);
        //session.setDebug(true);
 
        //创建store,建立连接
        Store store = session.getStore(protocol);
        LOGGER.debug("connecting");
        store.connect(mailHost, userName, password);
        LOGGER.debug("connected successfully");
        setStore(store);
        return store;
    }
 
    /**
     * 打开INBox文件夹
     */
    private Folder getFolderFromStore() {
        //打开邮件相应文件夹
        Folder getFolder;
        try {
            getFolder = store.getFolder("INBOX");
            getFolder.open(Folder.READ_ONLY);
            setFolder(getFolder);
            return getFolder;
        } catch (MessagingException e) {
            // TODO Auto-generated catch block
            System.err.println("获取Folder失败!");
            e.printStackTrace();
        }
        return null;
    }
 
    /**
     * 从folder中提取所有的messages
     *
     * @throws MessagingException
     */
    public void getAllMessages() throws MessagingException {
        //从邮件文件夹获取邮件信息
        Message[] messages = folder.getMessages();
        setMessages(messages);
        setRecordFailure(); //初始化出错数组
        //        setMessageCount();
    }
 
    /**
     * 获得messageNums数组指定的message
     *
     * @param messageNums
     * @throws MessagingException
     */
    public void getMessages(int[] messageNums) throws MessagingException {
        Message[] messages = folder.getMessages(messageNums);
        setMessages(messages);
        setRecordFailure(); //初始化出错数组
        //        setMessageCount();
    }
 
    /**
     * 获得start和end之间的message
     *
     * @param start
     * @param end
     * @throws MessagingException
     */
    public void getMessages(int start, int end) throws MessagingException {
        Message[] messages = folder.getMessages(start, end);
        setMessages(messages);
        setRecordFailure(); //初始化出错数组
        //        setMessageCount();
    }
 
    /**
     * 关闭连接
     */
    public void closeConnection() {
        try {
            messages = null;
            message = null;
            if (folder.isOpen())
                folder.close(true);
            store.close();
            LOGGER.debug("close");
        } catch (Exception e) {
            LOGGER.debug("关闭和邮件服务器之间连接时出错!");
            e.printStackTrace();
        }
    }
 
    /**
     * 获得当前邮件的基本方法 Pop3Bean内部应该调用这个方法 以便在调用函数中加入重试机制
     *
     * @throws MessagingException
     * @throws MessagingException
     */
    public void getMail() throws Throwable { //抛出异常,用以重掷
        try {
            saveMessageAs(message);         //保存消息
            parseMessage(message);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            System.err.println("保存邮件出错,检查保存路径");
            throw new IOException("保存邮件出错,检查保存路径");
        } catch (MessagingException e) {
            // TODO Auto-generated catch block
            System.err.println("邮件转换出错");
            throw new MessagingException("邮件转换出错");
        } catch (Exception e) {
            System.err.println("未知错误");
            otherError = true;
            e.printStackTrace();
            throw new Exception("未知错误");
        }
    }
 
    /**
     * 获得指定的邮件
     *
     * @param index
     */
    public void getMail(int index) {
        mailDownErrorCounter = 0; //邮件下载出错计数器置零
        try { //获取邮件下载之前的错误
            setMessage(messages[index]); //设置当前message
            LOGGER.debug("正在获取第" + index + "封邮件. . .");
            getMail(); //获取当前message
            LOGGER.debug("成功获取第" + index + "封邮件");
        } catch (Throwable e) { //获得重掷异常
            recordFailure[index] = true;
            mailDownErrorCounter++;
            System.err.println("下载第" + index + "封邮件时出错");
            retry();
        }
    }
 
    /**
     * 获取messages中的所有邮件
     */
    public void getAllMail() {
        int mailArrayLength; //将要下载的邮件的数量。若是重试时,则为还未下载的邮件数量
 
        mailArrayLength = getMessageCount();
 
        LOGGER.debug("一共有邮件" + mailArrayLength + "封");
 
        mailDownErrorCounter = 0; //邮件下载出错计数器置零
        mailCounter = 0;
        for (int index = 0; index < mailArrayLength; index++) {
            try {
                setMessage(messages[index]); //设置当前message
                LOGGER.debug("正在获取第" + index + "封邮件. . ." +
                        "/nsubject:" + getSubject() + "from:" + getFrom() + "toaddress:" + getTOAddress());
                getMail(); //获取当前message
                LOGGER.debug("成功获取第" + index + "封邮件");
                mailCounter++;
            } catch (Throwable e) {
                otherError = false;
                recordFailure[index] = true;
                mailDownErrorCounter++;
                System.err.println("下载第" + index + "封邮件时出错");
            }
        }
        LOGGER.debug("成功下载" + mailCounter + "封邮件");
        mailCounter = 0;
        if (mailDownErrorCounter != 0)
            retry();
    }
 
    /**
     * 获取messages中的系统退信
     */
    public void getReturnMessage(String[] Eamils, String[] Titles) {
        int mailArrayLength; //将要下载的邮件的数量。若是重试时,则为还未下载的邮件数量
        mailArrayLength = getMessageCount();
        if (mailArrayLength == 0) {//防止意外调用
            try {
                mailArrayLength = folder.getMessageCount();
                setMessages(folder.getMessages());
            } catch (MessagingException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
        }
        ArrayList<Message> _messages = new ArrayList<Message>();
        for (int index = 0; index < mailArrayLength; index++) {
            try {
                setMessage(messages[index]); //设置当前message
                LOGGER.debug("/nsubject:" + getSubject() + "from:" + getFrom() + "toaddress:" + getTOAddress() + "/nUid:" + ((POP3Folder) folder).getUID(messages[index]));
 
                //先判断 邮箱是不是,如果是就不再判断,否则,在判断标题是不是
                boolean isReturn = false;
                for (String email : Eamils) {
                    if (("<" + email + ">").equals(getFrom())) {
                        isReturn = true;
                    }
                }
                if (!isReturn) {
                    for (String title : Titles) {
                        if (title.equals(getSubject())) {
                            isReturn = true;
                        }
                    }
                }
                if (isReturn) {
                    _messages.add(messages[index]);
                }
 
            } catch (Exception e) {
                LOGGER.debug(e.getMessage());
            }
 
        }
        setMessages(_messages.toArray(new Message[_messages.size()]));
    }
 
 
    public String getMailUid(Message m) {
        String _uid = null;
        if (m != null)
            setMessage(m);
        try {
            _uid = ((POP3Folder) folder).getUID(m);
        } catch (MessagingException e) {
            throw new RuntimeException(e.getMessage());
        }
        return _uid;
    }
 
    /**
     * 保存邮件源文件
     */
 
    public void saveMessageAs(Message message) {
        String oriFileName;
        String fileExtend;
 
        try {
            oriFileName = getInfoBetweenBrackets(getMessageId(message)
                    .toString());
            //设置文件后缀名。若是附件则设法取得其文件后缀名作为将要保存文件的后缀名,若是正文部分则用.htm做后缀名
            String emlName = oriFileName;
            String fileNameWidthExtension = getEmlPath() + oriFileName
                    + getExtension();
            File storeFile = new File(fileNameWidthExtension);
            for (int i = 0; storeFile.exists(); i++) {
                emlName = oriFileName + i;
                fileNameWidthExtension = getEmlPath() + emlName
                        + getExtension();
                storeFile = new File(fileNameWidthExtension);
            }
            setEmlName(emlName);
            LOGGER.debug("storefile's path: " + fileNameWidthExtension);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            message.writeTo(baos);
            StringReader in = new StringReader(baos.toString());
            saveFile(fileNameWidthExtension, in);
        } catch (MessagingException e) {
            // TODO Auto-generated catch block
            throw new RuntimeException(e.getMessage());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            throw new RuntimeException(e.getMessage());
        }
    }
 
    /*
    * 解析邮件
    */
    public void parseMessage(Message message) throws IOException,
            MessagingException {
        Object content = message.getContent();
        if (content instanceof Multipart) {
            handleMultipart((Multipart) content);
        } else {
            handlePart(message);
        }
    }
 
    /*
    * 解析Multipart
    */
    public void handleMultipart(Multipart multipart) throws MessagingException,
            IOException {
        for (int i = 0, n = multipart.getCount(); i < n; i++) {
            handlePart(multipart.getBodyPart(i));
        }
    }
 
    /*
    * 解析指定part,从中提取文件
    */
    public void handlePart(Part part) throws MessagingException, IOException {
        String disposition = part.getDisposition(); // Find attachment
        String contentType = part.getContentType();
        String str;
        //测试先设置附件路径
        setAttachPath("d://test1//");
        InputStreamReader sbis = new InputStreamReader(part.getInputStream());
        if (disposition == null) { // When just body
            LOGGER.debug("Null: " + contentType);
            // Check if plain
            if ((contentType.length() >= 9)
                    && (contentType.toLowerCase().substring(0, 9)
                    .equals("text/plai"))) {
 
                LOGGER.debug(getAttachPath() + getEmlName() + ".txt");
                saveFile(getAttachPath() + getEmlName() + ".txt", sbis);
            } else if ((contentType.length() >= 8) // Check if html
                    && (contentType.toLowerCase().substring(0, 8)
                    .equals("text/htm"))) {
                saveFile(getAttachPath() + getEmlName() + ".html", sbis);
            } else if ((contentType.length() >= 9) // Check if html
                    && (contentType.toLowerCase().substring(0, 9)
                    .equals("image/gif"))) {
                saveFile(getAttachPath() + getEmlName() + ".gif", sbis);
            } else if ((contentType.length() >= 10)
                    && contentType.toLowerCase().substring(0, 10).equals(
                    "multipart/")) { // Check if multipart
                LOGGER.debug("multipart body: " + contentType);
                Multipart mp = (Multipart) (part.getContent());
                handleMultipart(mp);
            } else if ((contentType.length() >= 14)
                    && contentType.toLowerCase().substring(0, 14).equals(
                    "message/rfc822")) { // Check if multipart
                LOGGER.debug("Other body: " + contentType);
                saveFile(getAttachPath() + getEmlName() + ".eml", sbis);
                setAttachName(getEmlName() + ".eml");
            } else { // Unknown type
                LOGGER.debug("Other body: " + contentType);
                saveFile(getAttachPath() + getEmlName() + ".txt", sbis);
            }
        } else if (disposition.equalsIgnoreCase(Part.ATTACHMENT)) {
            LOGGER.debug("Attachment: " + part.getFileName() + " : "
                    + contentType);
            //outToFile.println("Attachment: " + part.getFileName() + " : "
            //        + contentType);
            saveFile(getAttachPath() + part.getFileName(), sbis);
        } else if (disposition.equalsIgnoreCase(Part.INLINE)) {
            LOGGER.debug("Inline: " + part.getFileName() + " : "
                    + contentType);
            //outToFile.println("Inline: " + part.getFileName() + " : "
            //        + contentType);
            saveFile(getAttachPath() + part.getFileName(), sbis);
        } else { // Should never happen
            LOGGER.debug("Other: " + disposition);
            //            outToFile.println("Other: " + disposition);
        }
    }
 
    public void saveFile(String fileName, Reader input) throws IOException {
        if (fileName == null) {
            fileName = File.createTempFile(getAttachPath() + "xx", ".out")
                    .getName();
        }
        // Do no overwrite existing file
        File file = new File(fileName);
        int lastDot = fileName.lastIndexOf(".");
        String extension = fileName.substring(lastDot);
        String fullFileName = fileName;
        fileName = fileName.substring(0, lastDot);
        for (int i = 0; file.exists(); i++) {
            file = new File(fileName + i + extension);
        }
        FileWriter fos = new FileWriter(file);
        BufferedWriter bos = new BufferedWriter(fos);
        BufferedReader bis = new BufferedReader(input);
        int aByte;
        while ((aByte = bis.read()) != -1) {
            bos.write(aByte);
        }
        bos.flush();
        bos.close();
        bis.close();
    }
 
    /**
     * 读取eml文件
     *
     * @param fileName
     * @throws MessagingException
     */
    public void readEmlFile(String fileName) throws MessagingException {
        try {
            //TODO readEmlFile
            InputStream fis = new FileInputStream(fileName);
            Object emlObj = (Object) fis;
            Session mailSession = Session.getDefaultInstance(System.getProperties(), null);
            MimeMessage msg = new MimeMessage(mailSession, fis);
            message = msg;
 
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            throw new RuntimeException(e.getMessage());
        }
    }
 
    /**
     * 用于标识字符串中的"<"和">"的位置
     *
     * @param str
     * @return
     * @throws Exception
     */
    public String getInfoBetweenBrackets(String str) throws Exception {
        int i, j; //用于标识字符串中的"<"和">"的位置
        if (str == null) {
            str = "error";
            return str;
        }
        i = str.lastIndexOf("<");
        j = str.lastIndexOf(">");
        if (i != -1 && j != -1)
            str = str.substring(i + 1, j);
        return str;
    }
 
    //当有邮件无法下载时进行重试
    private void retry() {
        mailCounter = 0;
        while (retryTimeCounter < totalRetryTimes && mailDownErrorCounter != 0) {
            if (!store.isConnected() || !folder.isOpen()) {
                System.err.println("与服务器连接断开,请重新连接");
                closeConnection();
                return;
            }
 
            LOGGER.debug("第" + (retryTimeCounter + 1) + "次重试");
 
            mailDownErrorCounter = 0; //邮件下载出错计数器置零
 
            for (int index = 0; index < getMessageCount(); index++) {
                if (recordFailure[index]) {
                    try {
                        setMessage(messages[index]); //设置当前message
                        LOGGER.debug("正在获取第" + index + "封邮件. . .");
                        getMail(); //获取当前message
                        LOGGER.debug("成功获取第" + index + "封邮件");
                        mailCounter++;
                        recordFailure[index] = false;
                    } catch (Throwable e) {
                        otherError = false;
                        recordFailure[index] = true;
                        mailDownErrorCounter++;
                        System.err.println("重新下载第" + index + "封邮件时出错");
                    }
                }
            }
            retryTimeCounter++;
        }
        LOGGER.debug("成功下载" + mailCounter + "封邮件");
        mailCounter = 0; //将邮件计数置零
        mailDownErrorCounter = 0; //下载错误数量归零
    }
 
 
    /**
     * 设置邮件主机
     */
    public void setMailHost(String mailHost) {
        this.mailHost = mailHost;
    }
 
    /**
     * 获取邮件主机
     */
    public String getMailHost() {
        return this.mailHost;
    }
 
    /**
     * 设置邮件帐号
     */
    public void setUserName(String userName) {
        this.userName = userName;
    }
 
    /**
     * 获取邮件帐号
     */
    public String getUserName() {
        return this.userName;
    }
 
    /**
     * 设置邮件密码
     */
    public void setPassword(String password) {
        this.password = password;
    }
 
    /**
     * 设置Store
     */
    public void setStore(Store store) {
        this.store = store;
    }
 
    /**
     * 设置邮箱文件夹
     */
    public void setFolder(Folder folder) {
        this.folder = folder;
    }
 
    /**
     * 设置messages数组
     */
    public void setMessages(Message[] messages) {
        this.messages = messages;
    }
 
    /**
     * 设置message
     */
    public void setMessage(Message message) {
        this.message = message;
    }
 
    public void setCurMessage(int i) {
        this.message = this.messages[i];
    }
 
    /**
     * 获取message
     */
    public Message getMessage() {
        return this.message;
    }
 
 
    /**
     * 获取folder中的message数量
     *
     * @throws MessagingException
     */
    public int getAllMessageCount() throws MessagingException {
        this.allMessageCount = folder.getMessageCount();
        return allMessageCount;
    }
 
    /**
     * 设置allMessageCount
     *
     * @throws MessagingException
     */
    private void setAllMessageCount() throws MessagingException {
        this.allMessageCount = this.folder.getMessageCount();
    }
 
    /**
     * 获取messages中message的数量
     *
     * @return
     */
    public int getMessageCount() {
        this.messageCount = this.messages.length;
        return messageCount;
    }
 
    /**
     * 获得folder中新邮件的数量
     *
     * @return
     * @throws MessagingException
     */
    public int getNewMessageCount() throws MessagingException {
        return this.folder.getNewMessageCount();
    }
 
    /**
     * 获得folder中未读邮件的数量
     *
     * @return
     * @throws MessagingException
     */
    public int getUnreadMessageCount() throws MessagingException {
        return this.folder.getUnreadMessageCount();
    }
 
    /**
     * 获取Part
     */
    public Part getPart() {
        return (Part) message;
    }
 
    /**
     * 设置Part
     */
    public void setPart(Part part) {
        this.part = part;
    }
 
    /**
     * 设置附件存放路径
     */
 
    public void setAttachPath(String attachPath) {
        this.saveAttachPath = attachPath;
    }
 
    /**
     * 获得附件存放路径
     */
 
    public String getAttachPath() {
        return saveAttachPath;
    }
 
    /**
     * 设置eml存放路径
     */
 
    public void setEmlPath(String emlPath) {
        this.saveEmlPath = emlPath;
    }
 
    /**
     * 获得eml存放路径
     */
 
    public String getEmlPath() {
        return saveEmlPath;
    }
 
    public void setEmlName(String emlName) {
        this.emlName = emlName;
    }
 
    public String getEmlName() {
        return emlName;
    }
 
    public void setAttachName(String attachName) {
        this.attachName = attachName;
    }
 
    public String getAttachName() {
        return attachName;
    }
 
    public void setExtension(String extension) {
        this.extension = extension;
    }
 
    public String getExtension() {
        return extension;
    }
 
    /**
     * 设置日期显示格式
     */
 
    public void setDateFormat(String format) throws Exception {
        this.dateformat = format;
    }
 
    /**
     * 获取日期显示格式
     */
    public String getDateFormat(String format) throws Exception {
        return this.dateformat;
    }
 

  } 

 

  测试方法如下: 

 

   public static void main(String[] args) throws Throwable { 
 
 
 

           try { 
 
 
 

               receiveMail mail; 
 
 
 

               mail = new receiveMail(); 
 
 
 

               mail.setUserName("abc"); 
 
 
 

               mail.setMailHost("pop3.sohu.com"); 
 
 
 

               mail.setPassword("***"); 
 
 
 

               mail.setAttachPath("e:/test/"); 
 
 
 

               mail.setExtension(".eml"); 
 
 
 

               mail.setDateFormat("yyyydddd"); 
 
 
 

               mail.getConn(); 
 
 
 

               LOGGER.debug("Count of messages in folder: " + mail.getAllMessageCount()); 
 
 
 

               LOGGER.debug("Count of new messages in folder: " + mail.getNewMessageCount()); 
 
 
 

               LOGGER.debug("Count of unread messages in folder: " + mail.getUnreadMessageCount()); 
 
 
 

               mail.getAllMessages(); 
 
 
 

               LOGGER.debug("Count of loaded messages: " + mail.getMessageCount()); 
 
 
 

               mail.getAllMail(); 
 
 
 

               mail.setCurMessage(0); 
 
 
 

               LOGGER.debug(mail.getSubject()); 
 
 
 

               mail.closeConnection(); 
 
 
 

               //   ReadEml mail = new ReadEml("H://My_Soft_Works//java//jteam//jmail//received//41C95D0F.008CD1.01099.eml"); 
 
 
 

           } catch (Exception e) { 
 
 
 

               LOGGER.debug("出现未预料的错误!"); 
 
 
 

               throw new RuntimeException(e.getMessage()); 
 
 
 

           } 
 
 
 

       } 
 
 

  这是在网上淘的: 

 

  我又添加了新的功能:根据邮箱地址和标题来获取某一封或部分邮件的功能 

 

  //emails:发件人的邮箱,titles:标题 

 

  getReturnMessage(String[] Eamils, String[] Titles);



直接用 (ReceiveMail )mail.getAllMail();来获取需要的邮件(之前必须要getAllMessge())


例子:


           


            

ReceiveMail mail = new ReceiveMail(); 

 
 
 
 

               mail.setMailHost("pop.163.com"); 
 
 
 

               mail.setPassword("you password"); 
 
 
 

               mail.setAttachPath("d://");// 
 
 
 

               mail.setEmlPath("d://eml"); 
 
 
 

               mail.setExtension(".eml"); 
 
 
 

               mail.setDateFormat("yyyydddd"); 
 
 
 

               mail.getConn(); 
 
 
 

               mail.getAllMessages();//获取所有邮件并设置到mail里面 
 
 
 

               mail.getReturnMessage(_eamils, _titles);     //这里过滤掉非系统退信 
 
 
 

               mail.getAllMail();


这时邮件已经下载到目录:d:/eml