本篇全文出自:鳥毅的BLOG
由 於Openwebmail的限制,不能用maildir,只能維持使用mailbox,這是系統loading高的主因。
由於許多原因以及沒有功能更齊全 的webmail前提下,只能暫時如此處理。本來要用比較熟悉的Java寫,
但是搜尋之下並沒有功能完整的library,而Python內建就支援 mailbox處理,
在缺乏其他支援/資源的情況下也只能硬著頭皮寫。因為我比較懶,裡頭有用到一個date parser,使用前請先安裝。
這裡的環境針對FreeBSD + Postfix+Openwebmail,sendmail/qmail應該也適用,我在Ubuntu開發,所以在Linux"應該"也能正常執行。
完整程式如下:
# #!/usr/bin/env python
# # coding: utf-8
#
# import datetime
# import mailbox
# import email.Errors
# import os
# from stat import ST_SIZE
# #由於python沒有內建的Date Parser,所以找了一個dateutil parser, http://labix.org/python-dateutil
# #FreeBSD ports裡在 /usr/ports/devel/py-dateutil
# from dateutil.parser import parse
#
# def mailbox_apart(inputfile, outputfile, splitdate):
# inbox = mailbox.mbox(inputfile);
# mboxNew = mailbox.mbox(outputfile);
#
# for key, message in inbox.iteritems():
# timex = parse(message['date']);
# timex = datetime.date(timex.year, timex.month, timex.day);
# if cmp(timex, splitdate) < 0:
# mboxNew.lock();
# mboxNew.add(message);
# mboxNew.flush();
# mboxNew.unlock();
# # Remove original message
# inbox.lock();
# inbox.discard(key);
# inbox.flush();
# inbox.unlock();
# inbox.close();
# mboxNew.close();
# return;
#
# def read_passwd_and_do_it(passwordfile, daysago):
# f=open(passwordfile, 'r');
# for line in f:
# line=line.lstrip();
# if not line.startswith('#'):
# x=line.split(':');
# userid=x[0];
# homedir = x[5];
# if homedir.startswith('/home'):
# inxfile = '/var/mail/'+userid;
# outxfile = homedir +'/mail/saved-messages'
# try:
# size = os.stat(inxfile)[ST_SIZE];
# if size > critial:
# mailbox_apart(inxfile, outxfile, daysago);
# except (IOError, OSError), e:
# pass;
# except mailbox.ExternalClashError, e:
# pass;
# except Exception, e:
# print e;
# f.close();
# return;
#
# #主程式
# #超過多大的檔案才處理,此處是500M
# critial = 500000000;
# #超過幾天的mail才移
# removedays = 30;
# #帳號檔
# passwdfile = '/etc/passwd';
# today = datetime.date.today();
# theDate = datetime.date(today.year, today.month, today.day);
# aMonthAgo = theDate - datetime.timedelta(days=removedays);
# read_passwd_and_do_it(passwdfile, aMonthAgo);
留言列表