def read(self, item: Item, box: mailbox.Mailbox) -> bool: fs_info = Path(item.data.filename) item.size = fs_info.stat().st_size mbx = mailbox.mbox(item.data.filename) mbx.lock() max_count = len(mbx) progress = pmlib.log.progress(max_count) count = "{0:d}".format(max_count).rjust(6, " ") size = convert_bytes(item.size) pmlib.log.inform( item.parent.name, "{0:s} mails for {1:s} ({2:s})".format(count, item.name, size)) n = 0 for msg in mbx: try: box.add(msg) except UnicodeEncodeError as e: text = self._store_fault(item, n, msg) item.add_error(n, text, e) item.report.failure += 1 else: item.report.success += 1 box.flush() progress.inc() n += 1 item.report.count = n pmlib.log.clear() for _error in item.report.error: pmlib.log.error(_error.text) mbx.unlock() return True
def read(self, item: Item, box: mailbox.Mailbox) -> bool: try: f = open(item.data.filename, mode='rb') except OSError as e: pmlib.log.exception(e) return False f.seek(128) # move to first mail n = 0 count = 1 stream = f.read(-1) item.size = len(stream) positions: List[Position] = [] start = 0 for byte in stream: if byte == 0x1a: # 1A seperates the mails pos = Position(start=start, end=n) positions.append(pos) count += 1 start = n + 1 n += 1 max_count = len(positions) count = "{0:d}".format(max_count).rjust(6, " ") size = convert_bytes(item.size) pmlib.log.inform( item.parent.name, "{0:s} mails for {1:s} ({2:s})".format(count, item.name, size)) progress = pmlib.log.progress(max_count) n = 0 for _pos in positions: value = stream[_pos.start:_pos.end] msg = email.message_from_bytes(value) try: box.add(msg) except UnicodeEncodeError as e: text = self._store_fault(item, n, value) item.add_error(n, text, e) item.report.failure += 1 else: item.report.success += 1 box.flush() progress.inc() n += 1 item.report.count = n pmlib.log.clear() for _error in item.report.error: pmlib.log.error(_error.text) f.close() return True