Use python to handle email, translate , and publish to wordpress

This weekend I tried to refresh my python with one single idea in mind.

But now I don’t have time to explain it, so here comes the code:

#!/usr/bin/env python
#
#joanmarcrieraATgmail(dot)com

from GmailClass import GmailClass
import goslate
import datetime, xmlrpclib
import time

from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods.posts import NewPost
from datetime import datetime


gs=goslate.Goslate()

correo=GmailClass("jmraccount@gmail.com","Password","Foldera")
correo.connect()
correo.select_mailbox()
no_leidos=correo.get_unreaded_list()

wp_url = 'http://www.joanmarcriera.es/blog/xmlrpc.php'
wp_username = 'username'
wp_password = 'password'




for un_correo_no_leido in no_leidos[0].split():
      
    print "\nProcessing one unread..."
    msg=correo.get_a_mail(un_correo_no_leido)
    titulo_original=correo.get_the_subject(msg)
    print "\t " + titulo_original
    body_original=correo.get_the_body(msg)
    titulo_es=gs.translate(titulo_original,'es')
    body_es=gs.translate(body_original,'es')
      
    title=titulo_es
    content=body_es
    
    post = WordPressPost()
    post.title = title
    post.content = content
    post.date = datetime(2014, 8, 10, 12, 34, 2, 860000)
    post.post_status = 'draft'
    try:
        wp = Client(wp_url,wp_username,wp_password) 
        wp.call(NewPost(post))
    except  ServerConnectionError as e:
        #do something with e
        #or by now pass
        print "serverconnection error"
        pass
    except ProtocolError as e:
        #do something or pass
        print "protocol error"
        pass
    else:
        del post
        del wp
    
    print "\t Done."
    print "Now wait 10 seconds\n"
    time.sleep(10)
    
#!/usr/bin/env python
#
#joanmarcrieraATgmail(dot)com

import sys
import imaplib
#not needed #import getpass
import email
import email.header
import datetime

#class to manage gmail.
class GmailClass(object):
   
    #Basic initialize.
    #Here is were we need to declare which account and folder we would like to process
    #example a=GmailClass('jmr@gmail.com','superpass','kate')
    def __init__(self, account, pwsd, folder):
        self.folder = folder
        self.email_account = account
        self.email_password = pwsd

    #automatic for test 
    def prepare(self):
        self.connect()
        self.select_mailbox()
        
    
    #Connect to the mailbox.
    def connect(self):
        self.mailbox = imaplib.IMAP4_SSL('imap.gmail.com')
        try:
            rv, data = self.mailbox.login(self.email_account, self.email_password)
        except imaplib.IMAP4.error:
            print "LOGIN FAILED!!! "
            sys.exit(1)
        print rv, data
        print "You can now select a mailbox"
    
    #just if you want to know how many folders do you have    
    def list_mailboxes(self):
        #needs pretty print
        rv, mailboxes = self.mailbox.list()
        if rv == 'OK':
            print "Mailboxes:"
            print mailboxes
            print "Select one of them to be able to process it."
    
    #go into the folder
    def select_mailbox(self):
        rv, data = self.mailbox.select(self.folder)
        if rv == 'OK':
            print "You can now start processing mailbox...\n"
        else:
            print "ERROR: Unable to open mailbox ", rv    
            
    #which mails are still unread
    def get_unreaded_list(self):
        rv, data = self.mailbox.search(None, "UnSeen")
        if rv != 'OK':
            print "No messages found!"
            return
        else:
            print "Messages found "
            return data
    
    #return a mail object
    #the list from get_unreaded_list needs to be looped data[i]
    def get_a_mail(self,num):
        rv, data = self.mailbox.fetch(num, '(RFC822)')
        if rv != 'OK':
            print "ERROR getting message", num
            return
        else:
            msg = email.message_from_string(data[0][1])
            return msg

     
    #from a mail object get the subject   
    def get_the_subject(self,msg):
        decode = email.header.decode_header(msg['Subject'])[0]
        subject = unicode(decode[0])
        #print 'Message Subject: %s' % ( subject)
        return subject
    
    #from a mail object the date
    def get_the_date(self,msg):
        #print 'Raw Date:', msg['Date']
        return msg['Date']

        
    #from a mail object get the body    
    def get_the_body(self,msg):
        maintype = msg.get_content_maintype()
        if maintype == 'multipart':
            for part in msg.get_payload():
                if part.get_content_maintype() == 'text':
                    return part.get_payload()
        elif maintype == 'text':
            return msg.get_payload()


    #method to process mailbox    
    def process_mailbox(self):
        """
        Do something with emails messages in the folder.  
        For the sake of this example, print some headers.
        """
        rv, data = self.mailbox.search(None, "ALL")
        if rv != 'OK':
            print "No messages found!"
            return
    
        for num in data[0].split():
            rv, data = self.mailbox.fetch(num, '(RFC822)')
            if rv != 'OK':
                print "ERROR getting message", num
                return
    
            msg = email.message_from_string(data[0][1])
            decode = email.header.decode_header(msg['Subject'])[0]
            subject = unicode(decode[0])
            print 'Message %s: %s' % (num, subject)
            print 'Raw Date:', msg['Date']
            # Now convert to local date-time
            date_tuple = email.utils.parsedate_tz(msg['Date'])
            if date_tuple:
                local_date = datetime.datetime.fromtimestamp(
                    email.utils.mktime_tz(date_tuple))
                print "Local Date:", \
                    local_date.strftime("%a, %d %b %Y %H:%M:%S")
                
    #Close the sessions at the end
    def close(self):
        self.mailbox.close()
        self.mailbox.logout()
    

Author: Marc

https://www.linkedin.com/in/joanmarcriera/