get mail from gmail using javamail

javamail官方论坛中一个用pop协议从gmail中获取邮件的例子,需要在gmail中开启pop功能。

import java.util.Date;import java.util.Properties;import javax.mail.Address;import javax.mail.FetchProfile;import javax.mail.Folder;import javax.mail.Message;import javax.mail.MessagingException;import javax.mail.Part;import javax.mail.Session;import javax.mail.Store;import javax.mail.URLName;import javax.mail.internet.ContentType;import javax.mail.internet.ParseException;import com.sun.mail.pop3.POP3SSLStore;public class GmailUtilities {    private Session session = null;    private Store store = null;    private String username, password;    private Folder folder;    public GmailUtilities() {    }    public void setUserPass(String username, String password) {        this.username = username;        this.password = password;    }    public void connect() throws Exception {        String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";        Properties pop3Props = new Properties();        pop3Props.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY);        pop3Props.setProperty("mail.pop3.socketFactory.fallback", "false");        pop3Props.setProperty("mail.pop3.port", "995");        pop3Props.setProperty("mail.pop3.socketFactory.port", "995");        URLName url = new URLName("pop3", "pop.gmail.com", 995, "", username, password);        session = Session.getInstance(pop3Props, null);        store = new POP3SSLStore(session, url);        store.connect();    }    public void openFolder(String folderName) throws Exception {        // Open the Folder        folder = store.getDefaultFolder();        folder = folder.getFolder(folderName);        if (folder == null) {            throw new Exception("Invalid folder");        }        // try to open read/write and if that fails try read-only        try {            folder.open(Folder.READ_WRITE);        } catch (MessagingException ex) {            folder.open(Folder.READ_ONLY);        }    }    public void closeFolder() throws Exception {        folder.close(false);    }    public int getMessageCount() throws Exception {        return folder.getMessageCount();    }    public int getNewMessageCount() throws Exception {        return folder.getNewMessageCount();    }    public void disconnect() throws Exception {        store.close();    }    public void printMessage(int messageNo) throws Exception {        System.out.println("Getting message number: " + messageNo);        Message m = null;        try {            m = folder.getMessage(messageNo);            dumpPart(m);        } catch (IndexOutOfBoundsException iex) {            System.out.println("Message number out of range");        }    }    public void printAllMessageEnvelopes() throws Exception {        // Attributes & Flags for all messages ..        Message[] msgs = folder.getMessages();        // Use a suitable FetchProfile        FetchProfile fp = new FetchProfile();        fp.add(FetchProfile.Item.ENVELOPE);        folder.fetch(msgs, fp);        for (int i = 0; i < msgs.length; i++) {            System.out.println("--------------------------");            System.out.println("MESSAGE #" + (i + 1) + ":");            dumpEnvelope(msgs[i]);        }    }    public void printAllMessages() throws Exception {        // Attributes & Flags for all messages ..        Message[] msgs = folder.getMessages();        // Use a suitable FetchProfile        FetchProfile fp = new FetchProfile();        fp.add(FetchProfile.Item.ENVELOPE);        folder.fetch(msgs, fp);        for (int i = 0; i < msgs.length; i++) {            System.out.println("--------------------------");            System.out.println("MESSAGE #" + (i + 1) + ":");            dumpPart(msgs[i]);        }    }    public static void dumpPart(Part p) throws Exception {        if (p instanceof Message)            dumpEnvelope((Message) p);        String ct = p.getContentType();        try {            pr("CONTENT-TYPE: " + (new ContentType(ct)).toString());        } catch (ParseException pex) {            pr("BAD CONTENT-TYPE: " + ct);        }        /*         * Using isMimeType to determine the content type avoids fetching the         * actual content data until we need it.         */        if (p.isMimeType("text/plain")) {            pr("This is plain text");            pr("---------------------------");            System.out.println((String) p.getContent());        } else {            // just a separator            pr("---------------------------");        }    }    public static void dumpEnvelope(Message m) throws Exception {        pr(" ");        Address[] a;        // FROM        if ((a = m.getFrom()) != null) {            for (int j = 0; j < a.length; j++)                pr("FROM: " + a[j].toString());        }        // TO        if ((a = m.getRecipients(Message.RecipientType.TO)) != null) {            for (int j = 0; j < a.length; j++) {                pr("TO: " + a[j].toString());            }        }        // SUBJECT        pr("SUBJECT: " + m.getSubject());        // DATE        Date d = m.getSentDate();        pr("SendDate: " + (d != null ? d.toString() : "UNKNOWN"));    }    static String indentStr = "                                               ";    static int level = 0;    /**     * Print a, possibly indented, string.     */    public static void pr(String s) {        System.out.print(indentStr.substring(0, level * 2));        System.out.println(s);    }}

Usage

public class GmailPop {    public static void main(String[] args) {        try {            GmailUtilities gmail = new GmailUtilities();            gmail.setUserPass("test@gmail.com", "****password****");            gmail.connect();            gmail.openFolder("INBOX");            int i = 0;            int totalMessages = gmail.getMessageCount();            int newMessages = gmail.getNewMessageCount();            System.out.println("Total messages = " + totalMessages);            System.out.println("New messages = " + newMessages);            System.out.println("-------------------------------");            do {                i++;                gmail.printMessage(i);            } while (i < 10);            // Uncomment the below line to print the body of the message.            // Remember it will eat-up your bandwidth if you have 100's of            // messages.            // gmail.printAllMessageEnvelopes();            // gmail.printAllMessages();        } catch (Exception e) {            e.printStackTrace();            System.exit(-1);        }    }}