{"id":1299,"date":"2008-12-28T15:53:50","date_gmt":"2008-12-28T22:53:50","guid":{"rendered":"http:\/\/kodegeek.com\/blog\/?p=1299"},"modified":"2008-12-28T15:53:50","modified_gmt":"2008-12-28T22:53:50","slug":"%c2%bfcomo-borrar-40000-correos-en-gmail-facil-usando-javamail-e-imap","status":"publish","type":"post","link":"http:\/\/kodegeek.com\/blog\/2008\/12\/28\/%c2%bfcomo-borrar-40000-correos-en-gmail-facil-usando-javamail-e-imap\/","title":{"rendered":"\u00bfComo borrar 40000 correos en Gmail? F\u00e1cil, usando Javamail e IMAP"},"content":{"rendered":"<p>Este fin de semana me decid\u00ed a poner un poco de orden en mis cuentas de correo; Una de las cosas que me oblig\u00f3 a ello es que mi cuenta paga de Yahoo expir\u00f3 y a\u00fan ando debatiendo si debo pagar $20 por una cuenta de correo que no ofrece nada por encima de Gmail. Al momento de revizar mi cuenta de Gmail me encuentro con que estoy usando por encima de 1 GB en correo con m\u00e1s de 40000 correos.<\/p>\n<p>Si, es incre\u00edble la cantidad de basura que se acumula en dos a\u00f1os \ud83d\ude42<\/p>\n<p>Definitivamente no estaba dispuesto a perder mi tiempo borrando tal cantidad de correos a mano, en vez de eso me decic\u00ed a automatizar la tarea usando Java y el hecho de que Gmail soporta POP \/ IMAP (<a href=\"http:\/\/java.sun.com\/products\/javamail\/javadocs\/index.html\">Javamail <\/a>cuenta con accesso a IMAP comp arte de su API). Una vez leido un poco abr\u00ed mi <a href=\"http:\/\/eclipse.org\">Eclipse<\/a> y el resultado es el c\u00f3digo que viene a continuaci\u00f3n:<\/p>\n<pre lang=\"java\" line=\"1\" file=\"ImapBulkEraser.java\" colla=\"+\">\r\npackage com.kodegeek.blog.mail;\r\nimport java.util.Properties;\r\nimport java.util.logging.Level;\r\nimport java.util.logging.Logger;\r\n\r\nimport javax.mail.Session;\r\nimport javax.mail.Flags.Flag;\r\nimport javax.mail.internet.MimeMessage;\r\nimport javax.mail.Message;\r\n\r\nimport javax.mail.Folder;\r\nimport javax.mail.MessagingException;\r\nimport javax.mail.Store;\r\n\r\nimport java.io.FileInputStream;\r\n\r\n\/**\r\n * I wrote this program to erase ALL the email on my GMAIL account. I have over 40,000 email so manually doing so was not an option :)\r\n * Please check the following resources:\r\n * <ul>\r\n * <li> http:\/\/java.sun.com\/products\/javamail\/javadocs\/index.html<\/li>\r\n * <li> http:\/\/java.sun.com\/developer\/onlineTraining\/JavaMail\/contents.html<\/li>\r\n * <li> http:\/\/java.sun.com\/products\/javamail\/javadocs\/com\/sun\/mail\/imap\/package-summary.html<\/li>\r\n * <li> http:\/\/java.sun.com\/products\/javamail\/downloads\/index.html<\/li>\r\n * <\/ul>\r\n * Also define a properties file with the following (adjust it to your configuration):\r\n * # As defined by the Javadoc\r\n * <ul>\r\n * <li> mail.user=name.lastname@gmail.com<\/li>\r\n * <li> mail.password=zzz<\/li>\r\n * <li> mail.store.host=pop.imap.gmail.com<\/li>\r\n * <li> mail.store.protocol=imap<\/li>\r\n * <li> mail.imap.port=993<\/li>\r\n * <li> mail.imap.socketFactory.port=993<\/li>\r\n * <li> mail.imap.socketFactory.class=javax.net.ssl.SSLSocketFactory<\/li>\r\n * <\/ul>\r\n * License: GPL\r\n * http:\/\/kodegeek.com\r\n * @author Jose Vicente Nunez Zuleta\r\n * @version 12\/28\/2008\r\n *\/\r\npublic final class ImapBulkEraser {\r\n\r\n\t\/**\r\n\t * Command line processing\r\n\t * @param args [0] Location of the properties configuration file, If not provided then will use system defaults (defined with -D)\r\n\t * @throws Exception\r\n\t * @since 0.1\r\n\t *\/\r\n\tpublic static void main(String [] args) throws Exception {\r\n\r\n\t\tLogger logger = Logger.getLogger(ImapBulkEraser.class.getName());\r\n\r\n\t\tProperties props = System.getProperties();\r\n\t\tif (args.length == 1) {\r\n\t\t\tprops.load(new FileInputStream(args[0]));\r\n\t\t}\r\n\t\tSession session = Session.getInstance(props, null);\r\n\t\tsession.setDebug(Boolean.parseBoolean(props.getProperty(\"debug\")));\r\n\t\tStore store = session.getStore(props.getProperty(\"mail.store.protocol\"));\r\n\t\tlogger.info(String.format(\"Connecting to: %s@%s:%s\", props.getProperty(\"mail.user\"), props.getProperty(\"mail.store.host\"), props.getProperty(\"mail.imap.port\")));\r\n\t\tstore.connect(props.getProperty(\"mail.store.host\"), props.getProperty(\"mail.user\"), props.getProperty(\"mail.password\"));\r\n\t\tFolder folder = store.getDefaultFolder();\r\n\t\tlogger.info(\"Got default folder. Erasing emails from ALL the folders\");\r\n\t\tFolder [] folders = folder.list();\r\n\t\tlong messgCnt = 0;\r\n\t\tfor(Folder currFolder: folders) {\r\n\r\n\t\t\ttry {\r\n\r\n\t\t\t\tif ((currFolder.getType() & Folder.HOLDS_MESSAGES) == 0) {\r\n\t\t\t\t\tcontinue; \/\/ Skip this folder type\r\n\t\t\t\t}\r\n\t\t\t\tlogger.info(String.format(\"Opening folder: %s, num messages; %d\", currFolder.getFullName(), currFolder.getMessageCount()));\r\n\t\t\t\tcurrFolder.open(Folder.READ_WRITE);\r\n\t\t\t\tMessage [] messages = currFolder.getMessages();\r\n\r\n\t\t\t\t\/\/ Mark all the messages for delete\r\n\t\t\t\tfor (Message message: messages) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tmessage.setFlag(Flag.DELETED, true);\r\n\t\t\t\t\t\tMimeMessage currMessage = (MimeMessage) message;\r\n\t\t\t\t\t\tlogger.info(String.format(\"Set delete flag for mail subject: '%s', folder: '%s'\", currMessage.getSubject(), currMessage.getFolder().getFullName()));\r\n\t\t\t\t\t\tmessages = currFolder.expunge(); \/\/ Confirm delete for all the messages on the current folder\r\n\t\t\t\t\t\tmessgCnt += messages.length;\r\n\t\t\t\t\t}  catch (MessagingException messgExp) {\r\n\t\t\t\t\t\tlogger.log(Level.WARNING, \"There was a problem erasing the message, ignoring\", messgExp);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlogger.info(String.format(\"Messages erased on folder %s: %d\", currFolder.getFullName(), messages.length));\r\n\t\t\t\tcurrFolder.close(true);\r\n\r\n\t\t\t} catch (MessagingException messgExp) {\r\n\t\t\t\tlogger.log(Level.WARNING, \"There was a problem, ignoring\", messgExp);\r\n\t\t\t}\r\n\r\n\t\t}\r\n\t\tlogger.info(String.format(\"Total number of erased messsages: %d\", messgCnt));\r\n\t\tstore.close();\r\n\t}\r\n\r\n}\r\n\r\n<\/pre>\n<p>Correr el c\u00f3digo es trivial, asegurese de tener el JAR de Javamail en el $CLASSPATH y haga algo como esto:<\/p>\n<p><code><br \/>\njava com.kodegeek.blog.mail.ImapBulkEraser -Dmail.user=name.lastname@gmail.com  -Dmail.password=XXXX -Dmail.store.host=imap.gmail.com -Dmail.store.protocol=imap -Dmail.store.folder=INBOX -Dmail.imap.port=993 -Dmail.imap.socketFactory.port=993 -Dmail.imap.socketFactory.class=javax.net.ssl.SSLSocketFactory<br \/>\n<\/code><\/p>\n<p>El programa no es perfecto, ya que de vez en cuando me consegu\u00ed con la siguiente error:<\/p>\n<p><code><br \/>\nNFO: Set delete flag for mail subject: 'Deploying webapps in embedded environment', folder: 'tomcat-user'<br \/>\nDec 28, 2008 5:40:18 PM com.kodegeek.blog.mail.ImapBulkEraser main<br \/>\nWARNING: There was a problem erasing the message, ignoring<br \/>\njavax.mail.MessagingException: Failed to load IMAP envelope<br \/>\n\tat com.sun.mail.imap.IMAPMessage.loadEnvelope(IMAPMessage.java:1069)<br \/>\n\tat com.sun.mail.imap.IMAPMessage.getSubject(IMAPMessage.java:256)<br \/>\n\tat com.kodegeek.blog.mail.ImapBulkEraser.main(ImapBulkEraser.java:83)<br \/>\nDec 28, 2008 5:40:18 PM com.kodegeek.blog.mail.ImapBulkEraser main<br \/>\n<\/code><\/p>\n<p>Sin embargo esos no son todos los correos \ud83d\ude42<\/p>\n<p>Como siempre el c\u00f3digo fuente de este programa es GPL y se puede bajar <a href=\"http:\/\/elangelnegro.cvs.sourceforge.net\/viewvc\/elangelnegro\/src\/java\/main\/com\/kodegeek\/blog\/mail\/ImapBulkEraser.java?view=markup\">desde CVS<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Este fin de semana me decid\u00ed a poner un poco de orden en mis cuentas de correo; Una de las cosas que me oblig\u00f3 a ello es que mi cuenta paga de Yahoo expir\u00f3 y a\u00fan ando debatiendo si debo pagar $20 por una cuenta de correo que no ofrece nada por encima de Gmail. <a class=\"read-more\" href=\"http:\/\/kodegeek.com\/blog\/2008\/12\/28\/%c2%bfcomo-borrar-40000-correos-en-gmail-facil-usando-javamail-e-imap\/\">[&hellip;]<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[9],"tags":[431,430,757,764,759],"_links":{"self":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts\/1299"}],"collection":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/comments?post=1299"}],"version-history":[{"count":28,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts\/1299\/revisions"}],"predecessor-version":[{"id":1327,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts\/1299\/revisions\/1327"}],"wp:attachment":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/media?parent=1299"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/categories?post=1299"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/tags?post=1299"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}