Beispiel #1
0
    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
Beispiel #2
0
    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