Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ########################################
- # ShakeTastic order monitoring script
- # Author: denisogun@xnapp.co.uk
- # Copyright: xnApp 2010
- ########################################
- import os, sys, time, random
- import imaplib
- import email, email.Errors, email.Header, email.Message, email.Utils
- from time import strftime
- from xml.etree import ElementTree as et
- AttachDir = '.' # Attachment Directory Path
- SaveAttachments = 1 # Save all attachments found
- User = 'shaketastic1231A3@gmail.com' # IMAP4 user
- Password = 'w8/W!U~^z.s78M1' # User password
- Frequency = 30 # Mail server download frequency
- Server = 'imap.gmail.com' # Mail Server address
- Port = 993 # Mail server port
- exists = 0
- name = 0
- filename_saved = None
- filename_path = None
- def parse_xml(xmlfile):
- tree = et.parse(xmlfile)
- root_node = tree.getroot()
- #Order details
- name = root_node.findtext("details/name")
- name = '"%s" ' % name
- houseNumber = root_node.findtext("details/houseNumber")
- houseNumber = '"%s" ' % houseNumber
- addressOne = root_node.findtext("details/addressOne")
- addressOne = '"%s" ' % addressOne
- addressTwo = root_node.findtext("details/addressTwo")
- addressTwo = '"%s" ' % addressTwo
- postcode = root_node.findtext("details/postcode")
- postcode = '"%s" ' % postcode
- phone = root_node.findtext("details/phone")
- phone = '"%s" ' % phone
- #Ingredients
- size = root_node.findtext("item/size")
- size = '"%s" ' % size
- ingredient_one = root_node.findtext("item/ingredient-1")
- ingredient_one = '"%s" ' % ingredient_one
- ingredient_two = root_node.findtext("item/ingredient-2")
- ingredient_two = '"%s" ' % ingredient_two
- ingredient_three = root_node.findtext("item/ingredient-3")
- ingredient_three = '"%s" ' % ingredient_three
- ingredient_four = root_node.findtext("item/ingredient-4")
- ingredient_four = '"%s" ' % ingredient_four
- ingredient_five = root_node.findtext("item/ingredient-5")
- ingredient_five = '"%s" ' % ingredient_five
- os.system('wscript.exe "C:\Program Files\Brother bPAC3 SDK\Samples\VBS\NamePrn.vbs" ' + name + addressOne + postcode + phone + size + ingredient_one.encode('ascii', 'ignore') + ingredient_two.encode('ascii', 'ignore') + ingredient_three.encode('ascii', 'ignore') + ingredient_four.encode('ascii', 'ignore') + ingredient_five.encode('ascii', 'ignore'))
- def write_file(filename, data):
- fd = open(filename, "wb")
- fd.write(data)
- fd.close()
- def gen_filename(name, mtyp, date, n):
- timepart = strftime("%d_%b_%Y %H_%M_%S_")
- file = email.Header.decode_header(name)[0][0]
- file = os.path.basename(file)
- pre, ext = os.path.splitext(file)
- random_int = random.randint(1,50)
- path = '%s%i%s' % (os.path.join(AttachDir, timepart), random_int, ext)
- return path
- def error(reason):
- sys.stderr.write('%s\n' % reason)
- def walk_parts(msg, date, count, msgnum):
- for part in msg.walk():
- if part.is_multipart():
- continue
- dtypes = part.get_params(None, 'Content-Disposition')
- if not dtypes:
- if part.get_content_type() == 'text/plain':
- continue
- ctypes = part.get_params()
- if not ctypes:
- continue
- for key,val in ctypes:
- if key.lower() == 'name':
- filename = gen_filename(val, part.get_content_type(), date, count)
- break
- else:
- continue
- else:
- attachment,filename = None,None
- for key,val in dtypes:
- key = key.lower()
- if key == 'filename':
- filename = val
- if key == 'attachment':
- attachment = 1
- if not attachment:
- continue
- filename = gen_filename(filename, part.get_content_type(), date, count)
- try:
- data = part.get_payload(decode=1)
- except:
- typ, val = sys.exc_info()[:2]
- warn("Message %s attachment decode error: %s for %s ``%s''"
- % (msgnum, str(val), part.get_content_type(), filename))
- continue
- if not data:
- warn("Could not decode attachment %s for %s"
- % (part.get_content_type(), filename))
- continue
- if type(data) is type(msg):
- count = walk_parts(data, date, count, msgnum)
- continue
- if SaveAttachments:
- exists = "0"
- try:
- curdir= sys.path[0]
- list = os.listdir(curdir)
- for name in list:
- if name == "Orders":
- exists = "1"
- break
- if exists == "1":
- os.chdir(curdir + "/Orders")
- else:
- os.mkdir(curdir + "/Orders")
- os.chdir(curdir + "/Orders")
- write_file(filename, data)
- global filename_saved
- global filename_path
- filename_path = (curdir + "/Orders")
- filename_saved = filename
- os.chdir(curdir)
- except IOError, val:
- error('Could not create "%s": %s' % (filename, str(val)))
- count += 1
- return count
- def process_message(text, msgnum):
- try:
- msg = email.message_from_string(text)
- except email.Errors.MessageError, val:
- warn("Message %s parse error: %s" % (msgnum, str(val)))
- return text
- date = msg['Date'] or 'Thu, 18 Sep 2006 12:02:27 +1000'
- date = time.strftime('%Y_%m_%d', email.Utils.parsedate(date))
- attachments_found = walk_parts(msg, date, 0, msgnum)
- if attachments_found:
- parse_xml(filename_path + filename_saved.replace('.', '', 1))
- return ''
- else:
- return None
- def process_server():
- try:
- mbox = imaplib.IMAP4_SSL(Server, Port)
- except:
- typ,val = sys.exc_info()[:2]
- error('Could not connect to IMAP server "%s": %s'
- % (Server, str(val)))
- try:
- typ,dat = mbox.login(User, Password)
- except:
- typ,dat = sys.exc_info()[:2]
- if typ != 'OK':
- error('Could not open INBOX for "%s" on "%s": %s'
- % (user, Server, str(dat)))
- mbox.select('Inbox')
- status, response = mbox.status('INBOX', "(UNSEEN)")
- number_of_emails = int(response[0].split()[2].strip(').,]'))
- if (number_of_emails > 0):
- print '%i new orders, processing order now' % number_of_emails
- typ, dat = mbox.search(None, '(UNSEEN)')
- for e_id in dat[0].split():
- typ, dat = mbox.fetch(e_id, '(RFC822)')
- if typ != 'OK':
- error(dat[-1])
- message = dat[0][1]
- if process_message(message, e_id) != '':
- print 'Email has no order file attached - Ignoring'
- mbox.expunge()
- mbox.close()
- mbox.logout()
- def main():
- print "# ShakeTastic Order System Starting #"
- print "# Monitoring the Mail server for new orders #"
- count = 0
- while 1==1:
- if (count > 10):
- print 'System running okay'
- count = 0
- process_server()
- count += 1
- time.sleep(Frequency)
- if __name__ == '__main__':
- try:
- main()
- except KeyboardInterrupt:
- pass
Add Comment
Please, Sign In to add comment