home *** CD-ROM | disk | FTP | other *** search
/ com!online 2005 April / com_0405_1.iso / opensource / BTpp-0.5.4-bin.exe / $INSTDIR / BT++.exe / rfc822.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2003-04-19  |  23.7 KB  |  892 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.2)
  3.  
  4. import time
  5. __all__ = [
  6.     'Message',
  7.     'AddressList',
  8.     'parsedate',
  9.     'parsedate_tz',
  10.     'mktime_tz']
  11. _blanklines = ('\r\n', '\n')
  12.  
  13. class Message:
  14.     
  15.     def __init__(self, fp, seekable = 1):
  16.         if seekable == 1:
  17.             
  18.             try:
  19.                 fp.tell()
  20.             except (AttributeError, IOError):
  21.                 seekable = 0
  22.  
  23.             seekable = 1
  24.         
  25.         self.fp = fp
  26.         self.seekable = seekable
  27.         self.startofheaders = None
  28.         self.startofbody = None
  29.         if self.seekable:
  30.             
  31.             try:
  32.                 self.startofheaders = self.fp.tell()
  33.             except IOError:
  34.                 self.seekable = 0
  35.  
  36.         
  37.         self.readheaders()
  38.         if self.seekable:
  39.             
  40.             try:
  41.                 self.startofbody = self.fp.tell()
  42.             except IOError:
  43.                 self.seekable = 0
  44.  
  45.         
  46.  
  47.     
  48.     def rewindbody(self):
  49.         if not (self.seekable):
  50.             raise IOError, 'unseekable file'
  51.         
  52.         self.fp.seek(self.startofbody)
  53.  
  54.     
  55.     def readheaders(self):
  56.         self.dict = { }
  57.         self.unixfrom = ''
  58.         self.headers = list = []
  59.         self.status = ''
  60.         headerseen = ''
  61.         firstline = 1
  62.         startofline = unread = tell = None
  63.         if hasattr(self.fp, 'unread'):
  64.             unread = self.fp.unread
  65.         elif self.seekable:
  66.             tell = self.fp.tell
  67.         
  68.         while 1:
  69.             if tell:
  70.                 
  71.                 try:
  72.                     startofline = tell()
  73.                 except IOError:
  74.                     startofline = tell = None
  75.                     self.seekable = 0
  76.  
  77.             
  78.             line = self.fp.readline()
  79.             if not line:
  80.                 self.status = 'EOF in headers'
  81.                 break
  82.             
  83.             if firstline and line.startswith('From '):
  84.                 self.unixfrom = self.unixfrom + line
  85.                 continue
  86.             
  87.             firstline = 0
  88.             if headerseen and line[0] in ' \t':
  89.                 list.append(line)
  90.                 x = self.dict[headerseen] + '\n ' + line.strip()
  91.                 self.dict[headerseen] = x.strip()
  92.                 continue
  93.             elif self.iscomment(line):
  94.                 continue
  95.             elif self.islast(line):
  96.                 break
  97.             
  98.             headerseen = self.isheader(line)
  99.             if headerseen:
  100.                 list.append(line)
  101.                 self.dict[headerseen] = line[len(headerseen) + 1:].strip()
  102.                 continue
  103.             elif not (self.dict):
  104.                 self.status = 'No headers'
  105.             else:
  106.                 self.status = 'Non-header line where header expected'
  107.             if unread:
  108.                 unread(line)
  109.             elif tell:
  110.                 self.fp.seek(startofline)
  111.             else:
  112.                 self.status = self.status + '; bad seek'
  113.             break
  114.  
  115.     
  116.     def isheader(self, line):
  117.         i = line.find(':')
  118.         if i > 0:
  119.             return line[:i].lower()
  120.         else:
  121.             return None
  122.  
  123.     
  124.     def islast(self, line):
  125.         return line in _blanklines
  126.  
  127.     
  128.     def iscomment(self, line):
  129.         return None
  130.  
  131.     
  132.     def getallmatchingheaders(self, name):
  133.         name = name.lower() + ':'
  134.         n = len(name)
  135.         list = []
  136.         hit = 0
  137.         for line in self.headers:
  138.             if line[:n].lower() == name:
  139.                 hit = 1
  140.             elif not line[:1].isspace():
  141.                 hit = 0
  142.             
  143.             if hit:
  144.                 list.append(line)
  145.             
  146.         
  147.         return list
  148.  
  149.     
  150.     def getfirstmatchingheader(self, name):
  151.         name = name.lower() + ':'
  152.         n = len(name)
  153.         list = []
  154.         hit = 0
  155.         for line in self.headers:
  156.             if hit:
  157.                 if not line[:1].isspace():
  158.                     break
  159.                 
  160.             elif line[:n].lower() == name:
  161.                 hit = 1
  162.             
  163.             if hit:
  164.                 list.append(line)
  165.             
  166.         
  167.         return list
  168.  
  169.     
  170.     def getrawheader(self, name):
  171.         list = self.getfirstmatchingheader(name)
  172.         if not list:
  173.             return None
  174.         
  175.         list[0] = list[0][len(name) + 1:]
  176.         return ''.join(list)
  177.  
  178.     
  179.     def getheader(self, name, default = None):
  180.         
  181.         try:
  182.             return self.dict[name.lower()]
  183.         except KeyError:
  184.             return default
  185.  
  186.  
  187.     get = getheader
  188.     
  189.     def getheaders(self, name):
  190.         result = []
  191.         current = ''
  192.         have_header = 0
  193.         for s in self.getallmatchingheaders(name):
  194.             if s[0].isspace():
  195.                 if current:
  196.                     current = '%s\n %s' % (current, s.strip())
  197.                 else:
  198.                     current = s.strip()
  199.             elif have_header:
  200.                 result.append(current)
  201.             
  202.             current = s[s.find(':') + 1:].strip()
  203.             have_header = 1
  204.         
  205.         if have_header:
  206.             result.append(current)
  207.         
  208.         return result
  209.  
  210.     
  211.     def getaddr(self, name):
  212.         alist = self.getaddrlist(name)
  213.         if alist:
  214.             return alist[0]
  215.         else:
  216.             return (None, None)
  217.  
  218.     
  219.     def getaddrlist(self, name):
  220.         raw = []
  221.         for h in self.getallmatchingheaders(name):
  222.             if h[0] in ' \t':
  223.                 raw.append(h)
  224.             elif raw:
  225.                 raw.append(', ')
  226.             
  227.             i = h.find(':')
  228.             if i > 0:
  229.                 addr = h[i + 1:]
  230.             
  231.             raw.append(addr)
  232.         
  233.         alladdrs = ''.join(raw)
  234.         a = AddrlistClass(alladdrs)
  235.         return a.getaddrlist()
  236.  
  237.     
  238.     def getdate(self, name):
  239.         
  240.         try:
  241.             data = self[name]
  242.         except KeyError:
  243.             return None
  244.  
  245.         return parsedate(data)
  246.  
  247.     
  248.     def getdate_tz(self, name):
  249.         
  250.         try:
  251.             data = self[name]
  252.         except KeyError:
  253.             return None
  254.  
  255.         return parsedate_tz(data)
  256.  
  257.     
  258.     def __len__(self):
  259.         return len(self.dict)
  260.  
  261.     
  262.     def __getitem__(self, name):
  263.         return self.dict[name.lower()]
  264.  
  265.     
  266.     def __setitem__(self, name, value):
  267.         del self[name]
  268.         self.dict[name.lower()] = value
  269.         text = name + ': ' + value
  270.         lines = text.split('\n')
  271.         for line in lines:
  272.             self.headers.append(line + '\n')
  273.         
  274.  
  275.     
  276.     def __delitem__(self, name):
  277.         name = name.lower()
  278.         if not self.dict.has_key(name):
  279.             return None
  280.         
  281.         del self.dict[name]
  282.         name = name + ':'
  283.         n = len(name)
  284.         list = []
  285.         hit = 0
  286.         for i in range(len(self.headers)):
  287.             line = self.headers[i]
  288.             if line[:n].lower() == name:
  289.                 hit = 1
  290.             elif not line[:1].isspace():
  291.                 hit = 0
  292.             
  293.             if hit:
  294.                 list.append(i)
  295.             
  296.         
  297.         list.reverse()
  298.         for i in list:
  299.             del self.headers[i]
  300.         
  301.  
  302.     
  303.     def setdefault(self, name, default = ''):
  304.         lowername = name.lower()
  305.         if self.dict.has_key(lowername):
  306.             return self.dict[lowername]
  307.         else:
  308.             text = name + ': ' + default
  309.             lines = text.split('\n')
  310.             for line in lines:
  311.                 self.headers.append(line + '\n')
  312.             
  313.             self.dict[lowername] = default
  314.             return default
  315.  
  316.     
  317.     def has_key(self, name):
  318.         return self.dict.has_key(name.lower())
  319.  
  320.     
  321.     def keys(self):
  322.         return self.dict.keys()
  323.  
  324.     
  325.     def values(self):
  326.         return self.dict.values()
  327.  
  328.     
  329.     def items(self):
  330.         return self.dict.items()
  331.  
  332.     
  333.     def __str__(self):
  334.         str = ''
  335.         for hdr in self.headers:
  336.             str = str + hdr
  337.         
  338.         return str
  339.  
  340.  
  341.  
  342. def unquote(str):
  343.     if len(str) > 1:
  344.         if str[0] == '"' and str[-1:] == '"':
  345.             return str[1:-1]
  346.         
  347.         if str[0] == '<' and str[-1:] == '>':
  348.             return str[1:-1]
  349.         
  350.     
  351.     return str
  352.  
  353.  
  354. def quote(str):
  355.     return str.replace('\\', '\\\\').replace('"', '\\"')
  356.  
  357.  
  358. def parseaddr(address):
  359.     a = AddressList(address)
  360.     list = a.addresslist
  361.     if not list:
  362.         return (None, None)
  363.     else:
  364.         return list[0]
  365.  
  366.  
  367. class AddrlistClass:
  368.     
  369.     def __init__(self, field):
  370.         self.specials = '()<>@,:;."[]'
  371.         self.pos = 0
  372.         self.LWS = ' \t'
  373.         self.CR = '\r\n'
  374.         self.atomends = self.specials + self.LWS + self.CR
  375.         self.phraseends = self.atomends.replace('.', '')
  376.         self.field = field
  377.         self.commentlist = []
  378.  
  379.     
  380.     def gotonext(self):
  381.         while self.pos < len(self.field):
  382.             if self.field[self.pos] in self.LWS + '\n\r':
  383.                 self.pos = self.pos + 1
  384.             elif self.field[self.pos] == '(':
  385.                 self.commentlist.append(self.getcomment())
  386.             else:
  387.                 break
  388.  
  389.     
  390.     def getaddrlist(self):
  391.         result = []
  392.         while 1:
  393.             ad = self.getaddress()
  394.             if ad:
  395.                 result += ad
  396.             else:
  397.                 break
  398.         return result
  399.  
  400.     
  401.     def getaddress(self):
  402.         self.commentlist = []
  403.         self.gotonext()
  404.         oldpos = self.pos
  405.         oldcl = self.commentlist
  406.         plist = self.getphraselist()
  407.         self.gotonext()
  408.         returnlist = []
  409.         if self.pos >= len(self.field):
  410.             if plist:
  411.                 returnlist = [
  412.                     (' '.join(self.commentlist), plist[0])]
  413.             
  414.         elif self.field[self.pos] in '.@':
  415.             self.pos = oldpos
  416.             self.commentlist = oldcl
  417.             addrspec = self.getaddrspec()
  418.             returnlist = [
  419.                 (' '.join(self.commentlist), addrspec)]
  420.         elif self.field[self.pos] == ':':
  421.             returnlist = []
  422.             fieldlen = len(self.field)
  423.             self.pos = self.pos + 1
  424.             while self.pos < len(self.field):
  425.                 self.gotonext()
  426.                 if self.pos < fieldlen and self.field[self.pos] == ';':
  427.                     self.pos = self.pos + 1
  428.                     break
  429.                 
  430.                 returnlist = returnlist + self.getaddress()
  431.         elif self.field[self.pos] == '<':
  432.             routeaddr = self.getrouteaddr()
  433.             if self.commentlist:
  434.                 returnlist = [
  435.                     (' '.join(plist) + ' (' + ' '.join(self.commentlist) + ')', routeaddr)]
  436.             else:
  437.                 returnlist = [
  438.                     (' '.join(plist), routeaddr)]
  439.         elif plist:
  440.             returnlist = [
  441.                 (' '.join(self.commentlist), plist[0])]
  442.         elif self.field[self.pos] in self.specials:
  443.             self.pos = self.pos + 1
  444.         
  445.         self.gotonext()
  446.         if self.pos < len(self.field) and self.field[self.pos] == ',':
  447.             self.pos = self.pos + 1
  448.         
  449.         return returnlist
  450.  
  451.     
  452.     def getrouteaddr(self):
  453.         if self.field[self.pos] != '<':
  454.             return None
  455.         
  456.         expectroute = 0
  457.         self.pos = self.pos + 1
  458.         self.gotonext()
  459.         adlist = ''
  460.         while self.pos < len(self.field):
  461.             if expectroute:
  462.                 self.getdomain()
  463.                 expectroute = 0
  464.             elif self.field[self.pos] == '>':
  465.                 self.pos = self.pos + 1
  466.                 break
  467.             elif self.field[self.pos] == '@':
  468.                 self.pos = self.pos + 1
  469.                 expectroute = 1
  470.             elif self.field[self.pos] == ':':
  471.                 self.pos = self.pos + 1
  472.             else:
  473.                 adlist = self.getaddrspec()
  474.                 self.pos = self.pos + 1
  475.                 break
  476.             self.gotonext()
  477.         return adlist
  478.  
  479.     
  480.     def getaddrspec(self):
  481.         aslist = []
  482.         self.gotonext()
  483.         while self.pos < len(self.field):
  484.             if self.field[self.pos] == '.':
  485.                 aslist.append('.')
  486.                 self.pos = self.pos + 1
  487.             elif self.field[self.pos] == '"':
  488.                 aslist.append('"%s"' % self.getquote())
  489.             elif self.field[self.pos] in self.atomends:
  490.                 break
  491.             else:
  492.                 aslist.append(self.getatom())
  493.             self.gotonext()
  494.         if self.pos >= len(self.field) or self.field[self.pos] != '@':
  495.             return ''.join(aslist)
  496.         
  497.         aslist.append('@')
  498.         self.pos = self.pos + 1
  499.         self.gotonext()
  500.         return ''.join(aslist) + self.getdomain()
  501.  
  502.     
  503.     def getdomain(self):
  504.         sdlist = []
  505.         while self.pos < len(self.field):
  506.             if self.field[self.pos] in self.LWS:
  507.                 self.pos = self.pos + 1
  508.             elif self.field[self.pos] == '(':
  509.                 self.commentlist.append(self.getcomment())
  510.             elif self.field[self.pos] == '[':
  511.                 sdlist.append(self.getdomainliteral())
  512.             elif self.field[self.pos] == '.':
  513.                 self.pos = self.pos + 1
  514.                 sdlist.append('.')
  515.             elif self.field[self.pos] in self.atomends:
  516.                 break
  517.             else:
  518.                 sdlist.append(self.getatom())
  519.         return ''.join(sdlist)
  520.  
  521.     
  522.     def getdelimited(self, beginchar, endchars, allowcomments = 1):
  523.         if self.field[self.pos] != beginchar:
  524.             return ''
  525.         
  526.         slist = [
  527.             '']
  528.         quote = 0
  529.         self.pos = self.pos + 1
  530.         while self.pos < len(self.field):
  531.             if quote == 1:
  532.                 slist.append(self.field[self.pos])
  533.                 quote = 0
  534.             elif self.field[self.pos] in endchars:
  535.                 self.pos = self.pos + 1
  536.                 break
  537.             elif allowcomments and self.field[self.pos] == '(':
  538.                 slist.append(self.getcomment())
  539.             elif self.field[self.pos] == '\\':
  540.                 quote = 1
  541.             else:
  542.                 slist.append(self.field[self.pos])
  543.             self.pos = self.pos + 1
  544.         return ''.join(slist)
  545.  
  546.     
  547.     def getquote(self):
  548.         return self.getdelimited('"', '"\r', 0)
  549.  
  550.     
  551.     def getcomment(self):
  552.         return self.getdelimited('(', ')\r', 1)
  553.  
  554.     
  555.     def getdomainliteral(self):
  556.         return '[%s]' % self.getdelimited('[', ']\r', 0)
  557.  
  558.     
  559.     def getatom(self, atomends = None):
  560.         atomlist = [
  561.             '']
  562.         if atomends is None:
  563.             atomends = self.atomends
  564.         
  565.         while self.pos < len(self.field):
  566.             if self.field[self.pos] in atomends:
  567.                 break
  568.             else:
  569.                 atomlist.append(self.field[self.pos])
  570.             self.pos = self.pos + 1
  571.         return ''.join(atomlist)
  572.  
  573.     
  574.     def getphraselist(self):
  575.         plist = []
  576.         while self.pos < len(self.field):
  577.             if self.field[self.pos] in self.LWS:
  578.                 self.pos = self.pos + 1
  579.             elif self.field[self.pos] == '"':
  580.                 plist.append(self.getquote())
  581.             elif self.field[self.pos] == '(':
  582.                 self.commentlist.append(self.getcomment())
  583.             elif self.field[self.pos] in self.phraseends:
  584.                 break
  585.             else:
  586.                 plist.append(self.getatom(self.phraseends))
  587.         return plist
  588.  
  589.  
  590.  
  591. class AddressList(AddrlistClass):
  592.     
  593.     def __init__(self, field):
  594.         AddrlistClass.__init__(self, field)
  595.         if field:
  596.             self.addresslist = self.getaddrlist()
  597.         else:
  598.             self.addresslist = []
  599.  
  600.     
  601.     def __len__(self):
  602.         return len(self.addresslist)
  603.  
  604.     
  605.     def __str__(self):
  606.         return ', '.join(map(dump_address_pair, self.addresslist))
  607.  
  608.     
  609.     def __add__(self, other):
  610.         newaddr = AddressList(None)
  611.         newaddr.addresslist = self.addresslist[:]
  612.         for x in other.addresslist:
  613.             if not (x in self.addresslist):
  614.                 newaddr.addresslist.append(x)
  615.             
  616.         
  617.         return newaddr
  618.  
  619.     
  620.     def __iadd__(self, other):
  621.         for x in other.addresslist:
  622.             if not (x in self.addresslist):
  623.                 self.addresslist.append(x)
  624.             
  625.         
  626.         return self
  627.  
  628.     
  629.     def __sub__(self, other):
  630.         newaddr = AddressList(None)
  631.         for x in self.addresslist:
  632.             if not (x in other.addresslist):
  633.                 newaddr.addresslist.append(x)
  634.             
  635.         
  636.         return newaddr
  637.  
  638.     
  639.     def __isub__(self, other):
  640.         for x in other.addresslist:
  641.             if x in self.addresslist:
  642.                 self.addresslist.remove(x)
  643.             
  644.         
  645.         return self
  646.  
  647.     
  648.     def __getitem__(self, index):
  649.         return self.addresslist[index]
  650.  
  651.  
  652.  
  653. def dump_address_pair(pair):
  654.     if pair[0]:
  655.         return '"' + pair[0] + '" <' + pair[1] + '>'
  656.     else:
  657.         return pair[1]
  658.  
  659. _monthnames = [
  660.     'jan',
  661.     'feb',
  662.     'mar',
  663.     'apr',
  664.     'may',
  665.     'jun',
  666.     'jul',
  667.     'aug',
  668.     'sep',
  669.     'oct',
  670.     'nov',
  671.     'dec',
  672.     'january',
  673.     'february',
  674.     'march',
  675.     'april',
  676.     'may',
  677.     'june',
  678.     'july',
  679.     'august',
  680.     'september',
  681.     'october',
  682.     'november',
  683.     'december']
  684. _daynames = [
  685.     'mon',
  686.     'tue',
  687.     'wed',
  688.     'thu',
  689.     'fri',
  690.     'sat',
  691.     'sun']
  692. _timezones = {
  693.     'UT': 0,
  694.     'UTC': 0,
  695.     'GMT': 0,
  696.     'Z': 0,
  697.     'AST': -400,
  698.     'ADT': -300,
  699.     'EST': -500,
  700.     'EDT': -400,
  701.     'CST': -600,
  702.     'CDT': -500,
  703.     'MST': -700,
  704.     'MDT': -600,
  705.     'PST': -800,
  706.     'PDT': -700 }
  707.  
  708. def parsedate_tz(data):
  709.     if not data:
  710.         return None
  711.     
  712.     data = data.split()
  713.     if data[0][-1] in (',', '.') or data[0].lower() in _daynames:
  714.         del data[0]
  715.     
  716.     if len(data) == 3:
  717.         stuff = data[0].split('-')
  718.         if len(stuff) == 3:
  719.             data = stuff + data[1:]
  720.         
  721.     
  722.     if len(data) == 4:
  723.         s = data[3]
  724.         i = s.find('+')
  725.         if i > 0:
  726.             data[3:] = [
  727.                 s[:i],
  728.                 s[i + 1:]]
  729.         else:
  730.             data.append('')
  731.     
  732.     if len(data) < 5:
  733.         return None
  734.     
  735.     data = data[:5]
  736.     (dd, mm, yy, tm, tz) = data
  737.     mm = mm.lower()
  738.     if not (mm in _monthnames):
  739.         (dd, mm) = (mm, dd.lower())
  740.         if not (mm in _monthnames):
  741.             return None
  742.         
  743.     
  744.     mm = _monthnames.index(mm) + 1
  745.     if mm > 12:
  746.         mm = mm - 12
  747.     
  748.     if dd[-1] == ',':
  749.         dd = dd[:-1]
  750.     
  751.     i = yy.find(':')
  752.     if i > 0:
  753.         (yy, tm) = (tm, yy)
  754.     
  755.     if yy[-1] == ',':
  756.         yy = yy[:-1]
  757.     
  758.     if not yy[0].isdigit():
  759.         (yy, tz) = (tz, yy)
  760.     
  761.     if tm[-1] == ',':
  762.         tm = tm[:-1]
  763.     
  764.     tm = tm.split(':')
  765.     if len(tm) == 2:
  766.         (thh, tmm) = tm
  767.         tss = '0'
  768.     elif len(tm) == 3:
  769.         (thh, tmm, tss) = tm
  770.     else:
  771.         return None
  772.     
  773.     try:
  774.         yy = int(yy)
  775.         dd = int(dd)
  776.         thh = int(thh)
  777.         tmm = int(tmm)
  778.         tss = int(tss)
  779.     except ValueError:
  780.         return None
  781.  
  782.     tzoffset = None
  783.     tz = tz.upper()
  784.     if _timezones.has_key(tz):
  785.         tzoffset = _timezones[tz]
  786.     else:
  787.         
  788.         try:
  789.             tzoffset = int(tz)
  790.         except ValueError:
  791.             pass
  792.  
  793.     if tzoffset:
  794.         if tzoffset < 0:
  795.             tzsign = -1
  796.             tzoffset = -tzoffset
  797.         else:
  798.             tzsign = 1
  799.         tzoffset = tzsign * ((tzoffset // 100) * 3600 + (tzoffset % 100) * 60)
  800.     
  801.     tuple = (yy, mm, dd, thh, tmm, tss, 0, 0, 0, tzoffset)
  802.     return tuple
  803.  
  804.  
  805. def parsedate(data):
  806.     t = parsedate_tz(data)
  807.     if type(t) == type(()):
  808.         return t[:9]
  809.     else:
  810.         return t
  811.  
  812.  
  813. def mktime_tz(data):
  814.     if data[9] is None:
  815.         return time.mktime(data[:8] + (-1,))
  816.     else:
  817.         t = time.mktime(data[:8] + (0,))
  818.         return t - data[9] - time.timezone
  819.  
  820.  
  821. def formatdate(timeval = None):
  822.     if timeval is None:
  823.         timeval = time.time()
  824.     
  825.     timeval = time.gmtime(timeval)
  826.     return '%s, %02d %s %04d %02d:%02d:%02d GMT' % ([
  827.         'Mon',
  828.         'Tue',
  829.         'Wed',
  830.         'Thu',
  831.         'Fri',
  832.         'Sat',
  833.         'Sun'][timeval[6]], timeval[2], [
  834.         'Jan',
  835.         'Feb',
  836.         'Mar',
  837.         'Apr',
  838.         'May',
  839.         'Jun',
  840.         'Jul',
  841.         'Aug',
  842.         'Sep',
  843.         'Oct',
  844.         'Nov',
  845.         'Dec'][timeval[1] - 1], timeval[0], timeval[3], timeval[4], timeval[5])
  846.  
  847. if __name__ == '__main__':
  848.     import sys
  849.     import os
  850.     file = os.path.join(os.environ['HOME'], 'Mail/inbox/1')
  851.     if sys.argv[1:]:
  852.         file = sys.argv[1]
  853.     
  854.     f = open(file, 'r')
  855.     m = Message(f)
  856.     print 'From:', m.getaddr('from')
  857.     print 'To:', m.getaddrlist('to')
  858.     print 'Subject:', m.getheader('subject')
  859.     print 'Date:', m.getheader('date')
  860.     date = m.getdate_tz('date')
  861.     tz = date[-1]
  862.     date = time.localtime(mktime_tz(date))
  863.     if date:
  864.         print 'ParsedDate:', time.asctime(date),
  865.         hhmmss = tz
  866.         (hhmm, ss) = divmod(hhmmss, 60)
  867.         (hh, mm) = divmod(hhmm, 60)
  868.         print '%+03d%02d' % (hh, mm),
  869.         if ss:
  870.             print '.%02d' % ss,
  871.         
  872.         print 
  873.     else:
  874.         print 'ParsedDate:', None
  875.     m.rewindbody()
  876.     n = 0
  877.     while f.readline():
  878.         n = n + 1
  879.     print 'Lines:', n
  880.     print '-' * 70
  881.     print 'len =', len(m)
  882.     if m.has_key('Date'):
  883.         print 'Date =', m['Date']
  884.     
  885.     if m.has_key('X-Nonsense'):
  886.         pass
  887.     
  888.     print 'keys =', m.keys()
  889.     print 'values =', m.values()
  890.     print 'items =', m.items()
  891.  
  892.