有关如何使用pop3使用javamail从gmail帐户删除电子邮件的查询

时间:2013-01-28 12:19:45

标签: java javamail

我们正在获取正确删除的邮件数量。但是从Gmail帐户中不会删除邮件。 expunge()方法不适用于pop3。 pop3是否有类似的方法来永久删除电子邮件? 我们还设置了 folder.close(true)

代码如下 -

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.imap.protocol.FLAGS;
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();   //uses session properties

    } 

    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 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]); 
msgs[i].setFlag(FLAGS.Flag.DELETED, true);

System.out.println("Message " +(i+1)+" is deleted");
        } 
folder.close(true);          
    } 


    public static void dumpPart(Part p) throws Exception { 
        if (p instanceof Message) 
            dumpEnvelope((Message)p); 
       Object content = p.getContent(); 
      System.out.println(content); 
        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); 
    } 

    public static void main(String[] args) { 

        try { 

            GmailUtilities gmail = new GmailUtilities(); 
            gmail.setUserPass("abc@gmail.com","password"); 
            gmail.connect(); 
            gmail.openFolder("INBOX"); 

            int totalMessages = gmail.getMessageCount(); 

            System.out.println("Total messages = " + totalMessages); 

            gmail.printAllMessages(); 

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

    } 

}

2 个答案:

答案 0 :(得分:1)

可能与您的问题无关,但您可能需要阅读此common JavaMail mistakes列表。

至于为什么邮件没有被删除,我不知道。确保你真正打开文件夹读/写。 protocol trace可能会提供一些关于实际情况的线索。

答案 1 :(得分:0)

Gmail不允许您通过POP3协议删除邮件。

Deleting messages in Gmail after POP downloads

GMail - Behavior Explained