user2013207
user2013207

Reputation: 3

Query regarding how to delete emails from gmail account using javamail using pop3

We are getting correct number of mails which are deleted.But from the gmail account the mails are not deleted. The expunge() method doesn't work for pop3. Is there any similar method for pop3 to permanently delete the emails? We also set folder.close(true)

The code is as follows-

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("[email protected]","password"); 
            gmail.connect(); 
            gmail.openFolder("INBOX"); 

            int totalMessages = gmail.getMessageCount(); 

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

            gmail.printAllMessages(); 

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

    } 

}

Upvotes: 0

Views: 1266

Answers (2)

dnault
dnault

Reputation: 8909

Gmail doesn't let you delete messages via the POP3 protocol.

Deleting messages in Gmail after POP downloads

GMail - Behavior Explained

Upvotes: 0

Bill Shannon
Bill Shannon

Reputation: 29971

Probably not related to your problem, but you might want to read this list of common JavaMail mistakes.

As for why the messages aren't being deleted, I don't know. Make sure you're really opening the folder read/write. The protocol trace might provide some clues as to what's really going on.

Upvotes: 1

Related Questions