class moveMail: def __init__(self, oldBoxDir, newBoxDir, daystoremove): from sys import stdout from mailbox import Maildir, MaildirMessage, NoSuchMailboxError from os.path import expanduser from time import time, strftime, gmtime self.logfile = strftime( expanduser("~/") + "mail-remove-log-%Y%m%d%H%M", gmtime()) # DeltaT is epoch now - 60(s)*m*d*nm where n is number of months - here set for 4 months self.deltaT = int(round(time() - (60 * 60 * 24 * int(daystoremove)))) self.newBox = Maildir(newBoxDir, create=True, factory=MaildirMessage) try: self.oldBox = Maildir(oldBoxDir, create=False, factory=MaildirMessage) except NoSuchMailboxError: print("[E] Invalid mail dir. Aborting") return (1) def moveByLabel(self): from email.utils import parsedate_tz, mktime_tz from mailbox import NoSuchMailboxError for folder in self.oldBox.list_folders(): _c_moved = 0 _c_rej = 0 _c_total = self.oldBox.get_folder(folder).__len__() print("\n[I] Folder " + folder + "", end="") for key, msg in self.oldBox.get_folder(folder).iteritems(): _date = msg['Date'] if _date: if (mktime_tz(parsedate_tz(_date)) - self.deltaT) < 0: if _c_moved == 0: #To detect if no thing is moved, so this can be a new folder try: self.newBox.get_folder(folder) except NoSuchMailboxError: print("[I]\tCreating in new: %s" % folder) self.newBox.add_folder(folder) # Mooooooooooooo'ving! self.newBox.get_folder(folder).add(msg) self.oldBox.get_folder(folder).remove(key) _c_moved += 1 print( "\r[I]\tStats: Not moved (Bad Mail): %d/%d // Moved: %d/%d" % (_c_rej, _c_total, _c_moved, _c_total), end="") else: _c_rej += 1 if _c_moved >= _c_total: print("\n[W]\tRemoving folder %s" % folder, end="") print("")
class moveMail: def __init__(self, oldBoxDir, newBoxDir, daystoremove): from sys import stdout from mailbox import Maildir,MaildirMessage,NoSuchMailboxError from os.path import expanduser from time import time, strftime, gmtime self.logfile=strftime(expanduser("~/")+"mail-remove-log-%Y%m%d%H%M", gmtime()) # DeltaT is epoch now - 60(s)*m*d*nm where n is number of months - here set for 4 months self.deltaT=int(round(time()-(60*60*24*int(daystoremove)))) self.newBox = Maildir(newBoxDir, create=True, factory=MaildirMessage) try: self.oldBox = Maildir(oldBoxDir, create=False, factory=MaildirMessage) except NoSuchMailboxError: print ("[E] Invalid mail dir. Aborting") return(1) def moveByLabel (self): from email.utils import parsedate_tz,mktime_tz from mailbox import NoSuchMailboxError for folder in self.oldBox.list_folders(): _c_moved=0 _c_rej=0 _c_total=self.oldBox.get_folder(folder).__len__() print("\n[I] Folder " + folder + "", end="") for key, msg in self.oldBox.get_folder(folder).iteritems(): _date=msg['Date'] if _date: if (mktime_tz(parsedate_tz(_date)) - self.deltaT) < 0: if _c_moved == 0: #To detect if no thing is moved, so this can be a new folder try: self.newBox.get_folder(folder) except NoSuchMailboxError: print("[I]\tCreating in new: %s" % folder) self.newBox.add_folder(folder) # Mooooooooooooo'ving! self.newBox.get_folder(folder).add(msg) self.oldBox.get_folder(folder).remove(key) _c_moved += 1 print("\r[I]\tStats: Not moved (Bad Mail): %d/%d // Moved: %d/%d" % (_c_rej,_c_total,_c_moved,_c_total), end="") else: _c_rej += 1 if _c_moved >= _c_total: print("\n[W]\tRemoving folder %s" % folder, end="") print("")
def create(self, path, mails, compression='xz', server=None): path = Path.cwd() / path with TemporaryDirectory(prefix="mailarchive-") as tmpdir: with tmp_chdir(tmpdir), tmp_umask(0o077): basedir = Path(path.name.split('.')[0]) maildir = Maildir(basedir, create=True) self.mailindex = MailIndex(server=server) last_folder = None for folder, msgbytes in mails: if folder != last_folder: mailfolder = maildir.add_folder(folder) last_folder = folder sha256 = hashlib.sha256(msgbytes).hexdigest() key = mailfolder.add(msgbytes) msg = mailfolder.get_message(key) idx_item = { "Date": msg.get("Date"), "From": msg.get("From"), "MessageId": msg.get("Message-Id"), "Subject": msg.get("Subject"), "To": msg.get("To"), "checksum": { "sha256": sha256 }, "folder": folder, "key": key, } self.mailindex.append(idx_item) with TemporaryFile(dir=tmpdir) as tmpf: self.mailindex.write(tmpf) tmpf.seek(0) self.add_metadata(".mailindex.yaml", tmpf) super().create(path, compression, [basedir]) return self
def _convert(self, item: Item, maildir: mailbox.Maildir) -> bool: if item.type is Entry.folder: newmaildir = maildir.add_folder(item.name) newmaildir.lock() source = pmlib.manager.get_source(item.data.type) if source is None: pmlib.log.warn( item.name, "Mailbox format is not yet implemented: {0:s}".format( item.data.type.name)) newmaildir.unlock() return True item.report.target_format = self.target check = source.read(item, newmaildir) newmaildir.flush() newmaildir.unlock() return check else: pmlib.log.inform("TRAY", item.full_name) newmaildir = maildir.add_folder(item.name) newmaildir.lock() # first convert folder for _item in sorted(item.children, key=sort_items): if _item.type is Entry.folder: check = self._convert(_item, newmaildir) if check is False: return False # then trays for _item in sorted(item.children, key=sort_items): if _item.type is not Entry.folder: check = self._convert(_item, newmaildir) if check is False: return False newmaildir.flush() newmaildir.unlock() maildir.flush() return True
class BitMessageMailDir: bmAddress: str = None folderInbox: Maildir = None folderSent: Maildir = None folderTrash: Maildir = None def __init__(self, bmAddr: str, mailDirPath: Path): self.bmAddress = bmAddr self.path = mailDirPath self.maildir = Maildir(str(self.path)) self.sNewMessage = AsyncSignal(str, EmailMessage) async def setup(self): self.path.mkdir(parents=True, exist_ok=True) self.folderInbox = self.maildir.add_folder('Inbox') self.folderSent = self.maildir.add_folder('Sent') self.folderTrash = self.maildir.add_folder('Trash') async def emitNewMessage(self, key, msg): await self.sNewMessage.emit(key, msg) async def storeWelcome(self): contact = await database.bmContactByNameFirst('galacteek-support') if not contact: # not found return body = cParentGet('messages.welcome.body') subject = cParentGet('messages.welcome.subject') msg = EmailMessage() msg['From'] = f'{contact.bmAddress}@bitmessage' msg['To'] = f'{self.bmAddress}@bitmessage' msg['Subject'] = subject msg.set_payload(body.format(bmAddress=self.bmAddress)) await self.store(msg) async def yieldNewMessages(self): for key in self.folderInbox.iterkeys(): msg = await self.getMessageByKey(key) if msg: yield key, msg async def store(self, message): raise Exception('Not implemented') async def storeSent(self, message): raise Exception('Not implemented') def msgRemoveInbox(self, messageId): try: self.folderInbox.remove(messageId) self.maildir.flush() return True except Exception as err: log.debug(f'Could not remove inbox message {messageId}: {err}') return False def updateMessage(self, mKey, msg): try: self.folderInbox[mKey] = msg return True except Exception as err: log.debug(f'updateMessage failed: {err}') return False
sys.exit(ret) continue try: change_to_user(user) maildir_path = path + "/.maildir/" if not os.path.exists(maildir_path): log.warn("%s doesn't have a maildir" % user) sys.exit(0) maildir = Maildir(maildir_path, factory=None) spam_open = maildir.add_folder('SA.Spam.' + FOLDER_OPEN) spam_learend = maildir.add_folder('SA.Spam.' + FOLDER_LEARNED) ham_open = maildir.add_folder('SA.Ham.' + FOLDER_OPEN) ham_learned = maildir.add_folder('SA.Ham.' + FOLDER_LEARNED) jobs = ( ('spam', ('spamassassin', '-r', '-D' ), spam_open, spam_learend), ('ham', ('sa-learn', '--ham', '-D' ), ham_open, ham_learned) ) for desc, cmd, mbox_todo, mbox_done in jobs: log.info ("User %s: processing %s" % (user, desc)) for key, msg in mbox_todo.items(): # store mail in a temporary file