#! /usr/bin/python
# knockmail 1.0
# Copyright (c) 2008 MJY http://p.mjy.name/


import sys

def proc_opts():
    from optparse import OptionParser
    parser = OptionParser()
    parser.add_option("-H", "--host")
    parser.add_option("-P", "--port", default=110,
                      help="(default=110)")
    parser.add_option("-u", "--user")
    parser.add_option("-p", "--passwd", metavar="PASS")
    parser.add_option("-a", "--apop", action="store_true",
                      default=False)

    parser.add_option("-d", "--delete",
                      action="store_const", const="d", dest="act",
                      help="action: !! DELETE MAILS !!",
                      default="s")
    parser.add_option("-l", "--list",
                      action="store_const", const="l", dest="act",
                      help="action: print 'mesg_num octets' lines")
    parser.add_option("--state",
                      action="store_const", const="s", dest="act",
                      help="action: print 'count size' (default)")

    (options, args) = parser.parse_args()
    return options


def check_opts(opts):
    def need(opt, s):
        if not opt:
            sys.stderr.write(
                "Please give '%s'.\nThe -h, --help option can be used.\n"
                % s)
            sys.exit(1)

    need(opts.host, "host name")
    need(opts.user, "user name")
    need(opts.passwd, "password")


def proc_pop3(opts):
    import poplib
    pop = poplib.POP3(opts.host, opts.port)

    # login
    if opts.apop:
        pop.apop(opts.user, opts.passwd)
    else:
        pop.user(opts.user)
        pop.pass_(opts.passwd)

    # action
    if opts.act == "s":
        sys.stdout.write("%d %d\n" % pop.stat())
    elif opts.act == "l":
        (nonuse, list, nonuse) = pop.list()
        for num_oct in list:
            sys.stdout.write("%s\n" % num_oct)
    elif opts.act == "d":
        (nonuse, list, nonuse) = pop.list()
        for num_oct in list:
            (num, nonuse) = num_oct.split()
            # sys.stdout.write("%s\n" % num)
            pop.dele(num)

    pop.quit()


def main():
    opts = proc_opts()
    check_opts(opts)
    proc_pop3(opts)


if __name__ == "__main__":
#    _test()
    main()


