mailbox.py :  » Mobile » Python-for-PalmOS » Python-1.5.2+reduced-1.0 » Lib » Python Open Source

Home
Python Open Source
1.3.1.2 Python
2.Ajax
3.Aspect Oriented
4.Blog
5.Build
6.Business Application
7.Chart Report
8.Content Management Systems
9.Cryptographic
10.Database
11.Development
12.Editor
13.Email
14.ERP
15.Game 2D 3D
16.GIS
17.GUI
18.IDE
19.Installer
20.IRC
21.Issue Tracker
22.Language Interface
23.Log
24.Math
25.Media Sound Audio
26.Mobile
27.Network
28.Parser
29.PDF
30.Project Management
31.RSS
32.Search
33.Security
34.Template Engines
35.Test
36.UML
37.USB Serial
38.Web Frameworks
39.Web Server
40.Web Services
41.Web Unit
42.Wiki
43.Windows
44.XML
Python Open Source » Mobile » Python for PalmOS 
Python for PalmOS » Python 1.5.2 reduced 1.0 » Lib » mailbox.py
#! /usr/bin/env python

"""Classes to handle Unix style, MMDF style, and MH style mailboxes."""


import rfc822
import os

class _Mailbox:

        def __init__(self, fp):
                self.fp = fp
                self.seekp = 0

        def seek(self, pos, whence=0):
                if whence==1:           # Relative to current position
                        self.pos = self.pos + pos
                if whence==2:           # Relative to file's end
                        self.pos = self.stop + pos
                else:                   # Default - absolute position
                        self.pos = self.start + pos

        def next(self):
                while 1:
                        self.fp.seek(self.seekp)
                        try:
                                self._search_start()
                        except EOFError:
                                self.seekp = self.fp.tell()
                                return None
                        start = self.fp.tell()
                        self._search_end()
                        self.seekp = stop = self.fp.tell()
                        if start <> stop:
                                break
                return rfc822.Message(_Subfile(self.fp, start, stop))

class _Subfile:

        def __init__(self, fp, start, stop):
                self.fp = fp
                self.start = start
                self.stop = stop
                self.pos = self.start

        def read(self, length = None):
                if self.pos >= self.stop:
                        return ''
                remaining = self.stop - self.pos
                if length is None or length < 0:
                        length = remaining
                elif length > remaining:
                        length = remaining
                self.fp.seek(self.pos)
                data = self.fp.read(length)
                self.pos = self.fp.tell()
                return data

        def readline(self, length = None):
                if self.pos >= self.stop:
                        return ''
                if length is None:
                        length = self.stop - self.pos
                self.fp.seek(self.pos)
                data = self.fp.readline(length)
                self.pos = self.fp.tell()
                return data

        def readlines(self, sizehint = -1):
                lines = []
                while 1:
                        line = self.readline()
                        if not line:
                                break
                        lines.append(line)
                        if sizehint >= 0:
                                sizehint = sizehint - len(line)
                                if sizehint <= 0:
                                        break
                return lines

        def tell(self):
                return self.pos - self.start

        def seek(self, pos, whence=0):
                if whence == 0:
                        self.pos = self.start + pos
                elif whence == 1:
                        self.pos = self.pos + pos
                elif whence == 2:
                        self.pos = self.stop + pos

        def close(self):
                del self.fp

class UnixMailbox(_Mailbox):

        def _search_start(self):
                while 1:
                        line = self.fp.readline()
                        if not line:
                                raise EOFError
                        if line[:5] == 'From ' and self._isrealfromline(line):
                                return

        def _search_end(self):
                while 1:
                        pos = self.fp.tell()
                        line = self.fp.readline()
                        if not line:
                                return
                        if line[:5] == 'From ' and self._isrealfromline(line):
                                self.fp.seek(pos)
                                return

        # An overridable mechanism to test for From-line-ness.
        # You can either specify a different regular expression
        # or define a whole new _isrealfromline() method.
        # Note that this only gets called for lines starting with
        # the 5 characters "From ".

        _fromlinepattern = r"From \s*[^\s]+\s+\w\w\w\s+\w\w\w\s+\d?\d\s+" \
                           r"\d?\d:\d\d(:\d\d)?(\s+[^\s]+)?\s+\d\d\d\d\s*$"
        _regexp = None

        def _isrealfromline(self, line):
                if not self._regexp:
                        import re
                        self._regexp = re.compile(self._fromlinepattern)
                return self._regexp.match(line)

class MmdfMailbox(_Mailbox):

        def _search_start(self):
                while 1:
                        line = self.fp.readline()
                        if not line:
                                raise EOFError
                        if line[:5] == '\001\001\001\001\n':
                                return

        def _search_end(self):
                while 1:
                        pos = self.fp.tell()
                        line = self.fp.readline()
                        if not line:
                                return
                        if line == '\001\001\001\001\n':
                                self.fp.seek(pos)
                                return

class MHMailbox:

        def __init__(self, dirname):
                import re
                pat = re.compile('^[0-9][0-9]*$')
                self.dirname = dirname
                files = os.listdir(self.dirname)
                self.boxes = []
                for f in files:
                        if pat.match(f):
                                self.boxes.append(f)

        def next(self):
                if not self.boxes:
                        return None
                fn = self.boxes[0]
                del self.boxes[0]
                fp = open(os.path.join(self.dirname, fn))
                return rfc822.Message(fp)

class Maildir:

        # Qmail directory mailbox

        def __init__(self, dirname):
                import string
                self.dirname = dirname
                self.boxes = []

                # check for new mail
                newdir = os.path.join(self.dirname, 'new')
                for file in os.listdir(newdir):
                        if len(string.split(file, '.')) > 2:
                                self.boxes.append(os.path.join(newdir, file))

                # Now check for current mail in this maildir
                curdir = os.path.join(self.dirname, 'cur')
                for file in os.listdir(curdir):
                        if len(string.split(file, '.')) > 2:
                                self.boxes.append(os.path.join(curdir, file))

        def next(self):
                if not self.boxes:
                        return None
                fn = self.boxes[0]
                del self.boxes[0]
                fp = open(os.path.join(self.dirname, fn))
                return rfc822.Message(fp)

class BabylMailbox(_Mailbox):

        def _search_start(self):
                while 1:
                        line = self.fp.readline()
                        if not line:
                                raise EOFError
                        if line == '*** EOOH ***\n':
                                return

        def _search_end(self):
                while 1:
                        pos = self.fp.tell()
                        line = self.fp.readline()
                        if not line:
                                return
                        if line == '\037\014\n':
                                self.fp.seek(pos)
                                return


def _test():
        import time
        import sys
        import string
        import os

        args = sys.argv[1:]
        if not args:
                for key in 'MAILDIR', 'MAIL', 'LOGNAME', 'USER':
                        if os.environ.has_key(key):
                                mbox = os.environ[key]
                                break
                else:
                        print "$MAIL, $LOGNAME nor $USER set -- who are you?"
                        return
        else:
                mbox = args[0]
        if mbox[:1] == '+':
                mbox = os.environ['HOME'] + '/Mail/' + mbox[1:]
        elif not '/' in mbox:
                mbox = '/usr/mail/' + mbox
        if os.path.isdir(mbox):
                if os.path.isdir(os.path.join(mbox, 'cur')):
                        mb = Maildir(mbox)
                else:
                        mb = MHMailbox(mbox)
        else:
                fp = open(mbox, 'r')
                mb = UnixMailbox(fp)
        
        msgs = []
        while 1:
                msg = mb.next()
                if msg is None:
                        break
                msgs.append(msg)
                if len(args) <= 1:
                        msg.fp = None
        if len(args) > 1:
                num = string.atoi(args[1])
                print 'Message %d body:'%num
                msg = msgs[num-1]
                msg.rewindbody()
                sys.stdout.write(msg.fp.read())
        else:
                print 'Mailbox',mbox,'has',len(msgs),'messages:'
                for msg in msgs:
                        f = msg.getheader('from') or ""
                        s = msg.getheader('subject') or ""
                        d = msg.getheader('date') or ""
                        print '%20.20s   %18.18s   %-30.30s'%(f, d[5:], s)


if __name__ == '__main__':
        _test()
www.java2java.com | Contact Us
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.