Пример #1
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
Пример #2
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