#!/usr/bin/env python
# pyfetchmail.py

import sys, os, errno, time, socket
import poplib

INTERVAL = 60

class MaildirWriter:
  idbase = 0

  def __init__(self, dirname):
    self.dirname = dirname
    os.chdir(self.dirname)
    self.id = "%s.%d_%d.%s" % (str(time.time()).replace(".","_"), os.getpid(),
                               MaildirWriter.idbase, socket.gethostname())
    MaildirWriter.idbase += 1
    for i in range(5):
      try:
        os.stat("tmp/"+self.id)
      except OSError, (n, s):
        if n == errno.ENOENT: break
        time.sleep(2)
    else:
      raise "busy"
    self.fd = os.open("tmp/"+self.id, os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0666)
    return

  def write(self, s):
    return os.write(self.fd, s)

  def close(self):
    os.fsync(self.fd)
    os.close(self.fd)
    os.link("tmp/"+self.id, "new/"+self.id)
    os.unlink("tmp/"+self.id)
    self.id = None
    return

#
def try_fetch(hostname, username, password, spooldir):
  p = poplib.POP3(hostname)
  p.user(username)
  p.pass_(password)
  new = len(p.list()[1])
  for i in range(new):
    fp = MaildirWriter(spooldir)
    for line in p.retr(i+1)[1]:
      fp.write(line+"\n")
    fp.close()
    p.dele(i+1)
  p.quit()
  all = len(os.listdir(spooldir+"/new"))
  print >>sys.stderr, "%d mail(s) fetched. total: %d" % (new, all)
  sys.stderr.flush()
  return (new, all)

# main
if __name__ == "__main__":
  (x, hostname, username, passfile, spooldir) = sys.argv
  password = file(passfile).readline().strip()
  while 1:
    try_fetch(hostname, username, password, spooldir)
    time.sleep(INTERVAL)
