def __init__(self, credentials, attachmentsDirectory, screenSize): self.screenSize = screenSize self.emailConnection = GmailConnection(credentials) self.lastUid = -1 self.attachmentsDirectory = attachmentsDirectory if not os.path.exists(attachmentsDirectory): os.mkdir(attachmentsDirectory) self.thread = Thread(target=self.run) self.event = Event() self.event.clear() self.done = False self.thread.start()
class AttachmentDownloader: LAST_UID_FILE = "meta.txt" def __init__(self, credentials, attachmentsDirectory, screenSize): self.screenSize = screenSize self.emailConnection = GmailConnection(credentials) self.lastUid = -1 self.attachmentsDirectory = attachmentsDirectory if not os.path.exists(attachmentsDirectory): os.mkdir(attachmentsDirectory) self.thread = Thread(target=self.run) self.event = Event() self.event.clear() self.done = False self.thread.start() def close(self): self.done = True self.event.set() def join(self): self.thread.join() def _ready(self, args): self.event.set() def run(self): try: while True: messageIds = [] try: messageIds = self.emailConnection.getMessagesSinceUID(self.getNextUid()) except Exception, e: print e for uid in messageIds: msgImgs = {} try: atts = self.emailConnection.getAttachmentsFromMessage(uid, ["png", "jpg", "jpeg", "gif"]) except Exception, e: print e continue for att in atts: try: fileName = att.get_filename() filePath = os.path.join(self.attachmentsDirectory, uid + "_" + fileName) img = Image.open(io.BytesIO(att.get_payload(decode=True))) tmpName = fileName.lower() if tmpName.endswith(('.jpg', '.jpeg')): exif = img._getexif() if exif: orientation = exif.get(274, 1) rotations = {1:0, 2:0, 3:180, 4:180, 5:270, 6:270, 7:90, 8:90} img = img.rotate(rotations[orientation], expand=True) else: print fileName + " has no exif" w, h = img.size scale = min(float(self.screenSize[0]) / w, float(self.screenSize[1])/h) img = img.resize((int(w*scale), int(h*scale)), Image.ANTIALIAS) msgImgs[filePath] = img except Exception, e: print e try: for filename in msgImgs: msgImgs[filename].save(filename) except Exception, e: print e self.setLastUid(uid)