Пример #1
0
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("")
Пример #3
0
 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
Пример #4
0
    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
Пример #5
0
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
Пример #6
0
      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