def save(self, toJson=False, useFileName=False, raw=False, ContentId=False, customPath=None, customFilename=None): """ Saves the message body and attachments found in the message. Setting toJson to true will output the message body as JSON-formatted text. The body and attachments are stored in a folder. Setting useFileName to true will mean that the filename is used as the name of the folder; otherwise, the message's date and subject are used as the folder name. Here is the absolute order of prioity for the name of the folder: 1. customFilename 2. self.filename if useFileName 3. {date} {subject} """ if customFilename != None and customFilename != '': dirName = customFilename else: if useFileName: # strip out the extension if self.filename is not None: dirName = self.filename.split('/').pop().split('.')[0] else: ValueError( 'Filename must be specified, or path must have been an actual path, to save using filename' ) else: # Create a directory based on the date and subject of the message d = self.parsedDate if d is not None: dirName = '{0:02d}-{1:02d}-{2:02d}_{3:02d}{4:02d}'.format( *d) else: dirName = 'UnknownDate' if self.subject is None: subject = '[No subject]' else: subject = ''.join(i for i in self.subject if i not in r'\/:*?"<>|') dirName = dirName + ' ' + subject if customPath != None and customPath != '': if customPath[-1] != '/' or customPath[-1] != '\\': customPath += '/' dirName = customPath + dirName try: os.makedirs(dirName) except Exception: newDirName = addNumToDir(dirName) if newDirName is not None: dirName = newDirName else: raise Exception( "Failed to create directory '%s'. Does it already exist?" % dirName) oldDir = os.getcwdu() try: os.chdir(dirName) # Save the message body fext = 'json' if toJson else 'text' f = open('message.' + fext, 'w') # From, to , cc, subject, date attachmentNames = [] # Save the attachments for attachment in self.attachments: attachmentNames.append(attachment.save(ContentId, toJson)) if toJson: emailObj = { 'from': xstr(self.sender), 'to': xstr(self.to), 'cc': xstr(self.cc), 'subject': xstr(self.subject), 'date': xstr(self.date), 'attachments': attachmentNames, 'body': decode_utf7(self.body) } f.write(json.dumps(emailObj, ensure_ascii=True)) else: f.write('From: ' + xstr(self.sender) + self.__crlf) f.write('To: ' + xstr(self.to) + self.__crlf) f.write('CC: ' + xstr(self.cc) + self.__crlf) f.write('Subject: ' + xstr(self.subject) + self.__crlf) f.write('Date: ' + xstr(self.date) + self.__crlf) f.write('-----------------' + self.__crlf + self.__crlf) f.write(self.body) f.close() except Exception as e: self.saveRaw() raise finally: # Return to previous directory os.chdir(oldDir)
def save(self, toJson=False, useFileName=False, raw=False, ContentId=False, customPath=None, customFilename=None): """ Saves the message body and attachments found in the message. Setting toJson to true will output the message body as JSON-formatted text. The body and attachments are stored in a folder. Setting useFileName to true will mean that the filename is used as the name of the folder; otherwise, the message's date and subject are used as the folder name. Here is the absolute order of prioity for the name of the folder: 1. customFilename 2. self.filename if useFileName 3. {date} {subject} """ if customFilename != None and customFilename != '': dirName = customFilename else: if useFileName: # strip out the extension if self.filename is not None: dirName = self.filename.split('/').pop().split('.')[0] else: ValueError( 'Filename must be specified, or path must have been an actual path, to save using filename') else: # Create a directory based on the date and subject of the message d = self.parsedDate if d is not None: dirName = '{0:02d}-{1:02d}-{2:02d}_{3:02d}{4:02d}'.format(*d) else: dirName = 'UnknownDate' if self.subject is None: subject = '[No subject]' else: subject = ''.join(i for i in self.subject if i not in r'\/:*?"<>|') dirName = dirName + ' ' + subject if customPath != None and customPath != '': if customPath[-1] != '/' or customPath[-1] != '\\': customPath += '/' dirName = customPath + dirName try: os.makedirs(dirName) except Exception: newDirName = addNumToDir(dirName) if newDirName is not None: dirName = newDirName else: raise Exception( "Failed to create directory '%s'. Does it already exist?" % dirName ) oldDir = os.getcwdu() try: os.chdir(dirName) # Save the message body fext = 'json' if toJson else 'text' f = open('message.' + fext, 'w') # From, to , cc, subject, date attachmentNames = [] # Save the attachments for attachment in self.attachments: attachmentNames.append(attachment.save(ContentId, toJson)) if toJson: emailObj = {'from': xstr(self.sender), 'to': xstr(self.to), 'cc': xstr(self.cc), 'subject': xstr(self.subject), 'date': xstr(self.date), 'attachments': attachmentNames, 'body': decode_utf7(self.body)} f.write(json.dumps(emailObj, ensure_ascii=True)) else: f.write('From: ' + xstr(self.sender) + self.__crlf) f.write('To: ' + xstr(self.to) + self.__crlf) f.write('CC: ' + xstr(self.cc) + self.__crlf) f.write('Subject: ' + xstr(self.subject) + self.__crlf) f.write('Date: ' + xstr(self.date) + self.__crlf) f.write('-----------------' + self.__crlf + self.__crlf) f.write(self.body) f.close() except Exception as e: self.saveRaw() raise finally: # Return to previous directory os.chdir(oldDir)