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