Sunday, October 16, 2011

Download GMail email attachments by subject

I used to use my work scanner to scan all of my documents, photos, etc. So recently I needed to find something. However, since all of them are labeled as Document.pdf I had hard time finding what I was looking. My options were to download my mail using Thunderbird and then search for those emails or to download one attachment at the time. I did not like either. So, I wrote this simple groovy script that downloads attachments for a specific email subject.
import javax.mail.*
import java.util.Properties


def emailAddress = "you@gmail.com"
def password = "password"
def server = "imap.gmail.com"
def port = 993
def props = new Properties()

props.setProperty("mail.store.protocol", "imaps")
props.setProperty("mail.imaps.host", server)
props.setProperty("mail.imaps.port", port.toString())
//very important or you will get errors such as Exception in thread "main" com.sun.mail.util.DecodingException: BASE64Decoder: Error in encoded stream: needed 4 valid base64 characters but only got 1 before EOF, the 10 most recent characters were: "Q3w5ilxj2P"

props.setProperty("mail.imaps.partialfetch", "false");

def session = javax.mail.Session.getDefaultInstance(props, null)
def store = session.getStore("imaps")

store.connect(emailAddress, password)
println "connected to Gmail"

def inboxFolder = "INBOX"
def folder = store.getFolder(inboxFolder)
folder.open(Folder.READ_ONLY)


javax.mail.search.SearchTerm searchTerm = new javax.mail.search.AndTerm(
        new javax.mail.search.SubjectTerm("SUBJECT YOUR ARE SEARCHING FOR"),
)

def messages = folder.search(searchTerm)
messages.eachWithIndex {message, i ->

    def content = message.content
    if (content instanceof javax.mail.Multipart) {
        javax.mail.Multipart mp = (javax.mail.Multipart) content;

        for (int j = 0; j < mp.getCount(); j++) {
            javax.mail.Part part = mp.getBodyPart(j)
            String disposition = part.getDisposition()
            if (disposition != null && disposition.equalsIgnoreCase(javax.mail.Part.ATTACHMENT)) {
                saveFile(part.getFileName(), part.getInputStream())
            }
        }
    }

}

def saveFile(String fileName, InputStream inputStream) {
    println 'Saving file: ' + fileName

    def file = new File('/tmp/' + fileName)
    if (file.exists()) {
        for (int i = 0; file.exists(); i++) {
            file = new File('/tmp/' + i + '_' + fileName)
        }
    }
    file.append(inputStream)
    println 'File saved: ' + fileName


}

US States Enum

So you can use it in your gsp pages
enum State {
 Alabama("AL"),Montana("MT"),Alaska("AK"),Nebraska("NE"),
 Arizona("AZ"),Nevada("NV"),Arkansas("AR"),NewHampshire("NH"),
 California("CA"),NewJersey("NJ"),Colorado("CO"),NewMexico("NM"),
 Connecticut("CT"),NewYork("NY"),Delaware("DE"),NorthCarolina("NC"),
 Florida("FL"),NorthDakota("ND"),Georgia("GA"),Ohio("OH"),Hawaii("HI"),
 Oklahoma("OK"),Idaho("ID"),Oregon("OR"),Illinois("IL"),Pennsylvania("PA"),
 Indiana("IN"),RhodeIsland("RI"),Iowa("IA"),SouthCarolina("SC"),Kansas("KS"),
 SouthDakota("SD"),Kentucky("KY"),Tennessee("TN"),Louisiana("LA"),Texas("TX"),
 Maine("ME"),Utah("UT"),Maryland("MD"),Vermont("VT"),Massachusetts("MA"),
 Virginia("VA"),Michigan("MI"),Washington("WA"),Minnesota("MN"),
 WestVirginia("WV"),Mississippi("MS"),Wisconsin("WI"),Missouri("MO"),Wyoming("WY")

 final String value

 State(String value) {
  this.value = value
 }

 String toString() {
  value
 }
 String getKey() {
  name()
 }
}