Guest User

Untitled

a guest
May 1st, 2018
513
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.66 KB | None | 0 0
  1. ########################################
  2. # ShakeTastic order monitoring script
  3. # Author: denisogun@xnapp.co.uk
  4. # Copyright: xnApp 2010
  5. ########################################
  6.  
  7. import os, sys, time, random
  8. import imaplib
  9. import email, email.Errors, email.Header, email.Message, email.Utils
  10. from time import strftime
  11. from xml.etree import ElementTree as et
  12.  
  13. AttachDir = '.' # Attachment Directory Path
  14. SaveAttachments = 1 # Save all attachments found
  15. User = 'shaketastic1231A3@gmail.com' # IMAP4 user
  16. Password = 'w8/W!U~^z.s78M1' # User password
  17. Frequency = 30 # Mail server download frequency
  18. Server = 'imap.gmail.com' # Mail Server address
  19. Port = 993 # Mail server port
  20. exists = 0
  21. name = 0
  22. filename_saved = None
  23. filename_path = None
  24.  
  25. def parse_xml(xmlfile):
  26. tree = et.parse(xmlfile)
  27. root_node = tree.getroot()
  28.  
  29. #Order details
  30. name = root_node.findtext("details/name")
  31. name = '"%s" ' % name
  32. houseNumber = root_node.findtext("details/houseNumber")
  33. houseNumber = '"%s" ' % houseNumber
  34. addressOne = root_node.findtext("details/addressOne")
  35. addressOne = '"%s" ' % addressOne
  36. addressTwo = root_node.findtext("details/addressTwo")
  37. addressTwo = '"%s" ' % addressTwo
  38. postcode = root_node.findtext("details/postcode")
  39. postcode = '"%s" ' % postcode
  40. phone = root_node.findtext("details/phone")
  41. phone = '"%s" ' % phone
  42.  
  43. #Ingredients
  44. size = root_node.findtext("item/size")
  45. size = '"%s" ' % size
  46. ingredient_one = root_node.findtext("item/ingredient-1")
  47. ingredient_one = '"%s" ' % ingredient_one
  48. ingredient_two = root_node.findtext("item/ingredient-2")
  49. ingredient_two = '"%s" ' % ingredient_two
  50. ingredient_three = root_node.findtext("item/ingredient-3")
  51. ingredient_three = '"%s" ' % ingredient_three
  52. ingredient_four = root_node.findtext("item/ingredient-4")
  53. ingredient_four = '"%s" ' % ingredient_four
  54. ingredient_five = root_node.findtext("item/ingredient-5")
  55. ingredient_five = '"%s" ' % ingredient_five
  56.  
  57. 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'))
  58.  
  59. def write_file(filename, data):
  60. fd = open(filename, "wb")
  61. fd.write(data)
  62. fd.close()
  63.  
  64. def gen_filename(name, mtyp, date, n):
  65.  
  66. timepart = strftime("%d_%b_%Y %H_%M_%S_")
  67. file = email.Header.decode_header(name)[0][0]
  68. file = os.path.basename(file)
  69. pre, ext = os.path.splitext(file)
  70. random_int = random.randint(1,50)
  71. path = '%s%i%s' % (os.path.join(AttachDir, timepart), random_int, ext)
  72. return path
  73.  
  74. def error(reason):
  75. sys.stderr.write('%s\n' % reason)
  76.  
  77. def walk_parts(msg, date, count, msgnum):
  78. for part in msg.walk():
  79. if part.is_multipart():
  80. continue
  81. dtypes = part.get_params(None, 'Content-Disposition')
  82. if not dtypes:
  83. if part.get_content_type() == 'text/plain':
  84. continue
  85. ctypes = part.get_params()
  86. if not ctypes:
  87. continue
  88. for key,val in ctypes:
  89. if key.lower() == 'name':
  90. filename = gen_filename(val, part.get_content_type(), date, count)
  91. break
  92. else:
  93. continue
  94. else:
  95. attachment,filename = None,None
  96. for key,val in dtypes:
  97. key = key.lower()
  98. if key == 'filename':
  99. filename = val
  100. if key == 'attachment':
  101. attachment = 1
  102. if not attachment:
  103. continue
  104. filename = gen_filename(filename, part.get_content_type(), date, count)
  105.  
  106. try:
  107. data = part.get_payload(decode=1)
  108. except:
  109. typ, val = sys.exc_info()[:2]
  110. warn("Message %s attachment decode error: %s for %s ``%s''"
  111. % (msgnum, str(val), part.get_content_type(), filename))
  112. continue
  113.  
  114. if not data:
  115. warn("Could not decode attachment %s for %s"
  116. % (part.get_content_type(), filename))
  117. continue
  118.  
  119. if type(data) is type(msg):
  120. count = walk_parts(data, date, count, msgnum)
  121. continue
  122.  
  123. if SaveAttachments:
  124. exists = "0"
  125. try:
  126. curdir= sys.path[0]
  127. list = os.listdir(curdir)
  128. for name in list:
  129. if name == "Orders":
  130. exists = "1"
  131. break
  132. if exists == "1":
  133. os.chdir(curdir + "/Orders")
  134. else:
  135. os.mkdir(curdir + "/Orders")
  136. os.chdir(curdir + "/Orders")
  137. write_file(filename, data)
  138. global filename_saved
  139. global filename_path
  140. filename_path = (curdir + "/Orders")
  141. filename_saved = filename
  142. os.chdir(curdir)
  143. except IOError, val:
  144. error('Could not create "%s": %s' % (filename, str(val)))
  145.  
  146. count += 1
  147.  
  148. return count
  149.  
  150.  
  151. def process_message(text, msgnum):
  152.  
  153. try:
  154. msg = email.message_from_string(text)
  155. except email.Errors.MessageError, val:
  156. warn("Message %s parse error: %s" % (msgnum, str(val)))
  157. return text
  158.  
  159. date = msg['Date'] or 'Thu, 18 Sep 2006 12:02:27 +1000'
  160. date = time.strftime('%Y_%m_%d', email.Utils.parsedate(date))
  161.  
  162. attachments_found = walk_parts(msg, date, 0, msgnum)
  163. if attachments_found:
  164. parse_xml(filename_path + filename_saved.replace('.', '', 1))
  165. return ''
  166. else:
  167. return None
  168.  
  169. def process_server():
  170.  
  171. try:
  172. mbox = imaplib.IMAP4_SSL(Server, Port)
  173. except:
  174. typ,val = sys.exc_info()[:2]
  175. error('Could not connect to IMAP server "%s": %s'
  176. % (Server, str(val)))
  177.  
  178. try:
  179. typ,dat = mbox.login(User, Password)
  180. except:
  181. typ,dat = sys.exc_info()[:2]
  182.  
  183. if typ != 'OK':
  184. error('Could not open INBOX for "%s" on "%s": %s'
  185. % (user, Server, str(dat)))
  186.  
  187. mbox.select('Inbox')
  188. status, response = mbox.status('INBOX', "(UNSEEN)")
  189. number_of_emails = int(response[0].split()[2].strip(').,]'))
  190.  
  191. if (number_of_emails > 0):
  192. print '%i new orders, processing order now' % number_of_emails
  193. typ, dat = mbox.search(None, '(UNSEEN)')
  194. for e_id in dat[0].split():
  195. typ, dat = mbox.fetch(e_id, '(RFC822)')
  196. if typ != 'OK':
  197. error(dat[-1])
  198. message = dat[0][1]
  199. if process_message(message, e_id) != '':
  200. print 'Email has no order file attached - Ignoring'
  201.  
  202. mbox.expunge()
  203. mbox.close()
  204. mbox.logout()
  205.  
  206. def main():
  207.  
  208. print "# ShakeTastic Order System Starting #"
  209. print "# Monitoring the Mail server for new orders #"
  210. count = 0
  211. while 1==1:
  212. if (count > 10):
  213. print 'System running okay'
  214. count = 0
  215. process_server()
  216. count += 1
  217. time.sleep(Frequency)
  218.  
  219. if __name__ == '__main__':
  220. try:
  221. main()
  222. except KeyboardInterrupt:
  223. pass
Add Comment
Please, Sign In to add comment