#!/usr/bin/python3
 
import os,sys,time
import email
from email.utils import parsedate
 
def fl_loadbya(filnam):   # Read file of bytes
      f1 = open(filnam, 'rb')
      dta = f1.read()
      del f1
      return dta


def fl_writebya(filnam, data): # Write file of 8 bit bytes
    fo = open(filnam, 'wb')
    fo.write(data)
    fo.close()

def strtobya(st):
  res=bytearray()
  for  c in st:
    res.append(ord(c))
  return res 

etxt=strtobya('From ')
crlf=bytearray([0xd,0xa]) 
etxtb=bytearray([0xa])+etxt
setxt=len(etxt)
setxtb=len(etxtb)

def main(*p):
  global indx
  if len(sys.argv)==3:
    fn,resdir=sys.argv[1:3]
  else:
    print("Written and published by G.P. Eckersley")
    print("No warranties or restrictions of any sort!")
    print("Splits mailbox into separate files")
    print('usage: mboxsplit mailbox_file result_directory')
    print('Generates individual files withe names epoch-1970_sequence no,')
    print('Dependencies: Python3')
    sys.exit()  
  f=fl_loadbya(fn)
  flen=len(f)
  ptr=0
  indx=0
  from email import parser
  bytpse=parser.BytesParser()
  bhp2=email.parser.BytesHeaderParser()
  def pfil(strt,ende):
    global indx
    dgts=7
    nn=indx
    num=str(indx)
    while len(num)<dgts:
      num='0'+num 
    try:
      msg=bytpse.parsebytes(f[strt:ende-1],headersonly=True)
      rxtime=msg['Date']
      caltime=parsedate(rxtime)
      epochtime=time.mktime(caltime)
      epochsecs=str(int(epochtime))
    except:
      try:
        mr=msg['Received']
        dl=mr.split(chr(0xa))[-1]
        caltime=parsedate(dl)
        epochtime=time.mktime(caltime)
        epochsecs=str(int(epochtime))
      except:  
        epochsecs='unavailable'
    fl_writebya(resdir+os.sep+epochsecs+'_'+num,f[strt:ende-1]+crlf)
    indx+=1  


  def tsts():
    if f[ptr:ptr+setxt]==etxt:
      return True
    return False  
  def tstsa():
    if f[ptr:ptr+setxtb]==etxtb:
      return True
    return False  
  
  if tsts(): #should always be true here
    st=0
    sptr=ptr-1
  while ptr<flen:
    if tstsa():
      pfil(sptr+1,ptr-2)
      sptr=ptr
    ptr+=1 
  pfil(sptr+1,ptr-1)

main() 


 
 
 
