138 lines
2.7 KiB
Python
138 lines
2.7 KiB
Python
import poplib,pdb,email,re,time
|
|
from email import header
|
|
import datetime
|
|
import os
|
|
|
|
POP_ADDR = r'pop.126.com'
|
|
USER = ''
|
|
PASS = ''
|
|
CONFIG = ''
|
|
|
|
def getYear(date):
|
|
rslt = re.search(r'\b2\d{3}\b', date)
|
|
return int(rslt.group())
|
|
|
|
def getMonth(date):
|
|
monthMap = {'Jan':1,'Feb':2,'Mar':3,'Apr':4,'May':5,'Jun':6,
|
|
'Jul':7,'Aug':8,'Sep':9,'Oct':10,'Nov':11,'Dec':12,}
|
|
|
|
rslt = re.findall(r'\b\w{3}\b', date)
|
|
for i in range(len(rslt)):
|
|
month = monthMap.get(rslt[i])
|
|
if None != month:
|
|
break
|
|
|
|
return month
|
|
|
|
def getDay(date):
|
|
rslt = re.search(r'\b\d{1,2}\b', date)
|
|
return int(rslt.group())
|
|
|
|
def getTime(date):
|
|
rslt = re.search(r'\b\d{2}:\d{2}:\d{2}\b', date)
|
|
timeList = rslt.group().split(':')
|
|
|
|
for i in range(len(timeList)):
|
|
timeList[i] = int(timeList[i])
|
|
|
|
return timeList
|
|
|
|
def transformDate(date):
|
|
rslt = getYear(date)
|
|
rslt = rslt * 100
|
|
rslt = rslt + getMonth(date)
|
|
rslt = rslt * 100
|
|
rslt = rslt + getDay(date)
|
|
|
|
|
|
timeList = getTime(date)
|
|
for i in range(len(timeList)):
|
|
rslt = rslt * 100
|
|
rslt = rslt + timeList[i]
|
|
|
|
return rslt
|
|
|
|
def getRecentReadMailTime():
|
|
fp = open(CONFIG, 'r')
|
|
rrTime = fp.read()
|
|
fp.close()
|
|
return rrTime
|
|
|
|
def setRecentReadMailTime():
|
|
fp = open(CONFIG, 'w')
|
|
fp.write(time.ctime())
|
|
fp.close()
|
|
return
|
|
|
|
def getTimeEarly(period):
|
|
def years(n):
|
|
return datetime.timedelta(years=n)
|
|
def months(n):
|
|
return datetime.timedelta(years=n)
|
|
def days(n):
|
|
return datetime.timedelta(days=n)
|
|
def hours(n):
|
|
return datetime.timedelta(hours=n)
|
|
def minutes(n):
|
|
return datetime.timedelta(minutes=n)
|
|
def seconds(n):
|
|
return datetime.timedelta(seconds=n)
|
|
|
|
funcs={
|
|
'y':years,
|
|
'm':months,
|
|
'd':days,
|
|
'H':hours,
|
|
'M':minutes,
|
|
'S':seconds,
|
|
}
|
|
pattern='(\d*)([ymdHMS])'
|
|
r=re.compile(pattern)
|
|
s = r.findall(period)
|
|
t = datetime.datetime.now()
|
|
for v,ty in s:
|
|
td = funcs[ty](int(v))
|
|
t = t - td
|
|
return time.ctime(t.timestamp())
|
|
|
|
|
|
def parseMailContent(msg):
|
|
if msg.is_multipart():
|
|
for part in msg.get_payload():
|
|
parseMailContent(part)
|
|
else:
|
|
bMsgStr = msg.get_payload(decode=True)
|
|
charset = msg.get_param('charset')
|
|
msgStr = 'Decode Failed'
|
|
try:
|
|
if None == charset:
|
|
msgStr = bMsgStr.decode()
|
|
else:
|
|
msgStr = bMsgStr.decode(charset)
|
|
except:
|
|
pass
|
|
|
|
print(msgStr)
|
|
|
|
def recvEmail(POP_ADDR,USER,PASS,PERIOD,callback):
|
|
server = poplib.POP3(POP_ADDR)
|
|
server.user(USER)
|
|
server.pass_(PASS)
|
|
|
|
mailCount,size = server.stat()
|
|
mailNoList = list(range(mailCount))
|
|
mailNoList.reverse()
|
|
FROMTIME = getTimeEarly(PERIOD)
|
|
hisTime = transformDate(FROMTIME)
|
|
#pdb.set_trace()
|
|
for i in mailNoList:
|
|
message = server.retr(i+1)[1]
|
|
mail = email.message_from_bytes(b'\n'.join(message))
|
|
|
|
if transformDate(mail.get('Date')) > hisTime:
|
|
if not callback(mail):
|
|
break
|
|
#parseMailContent(mail)
|
|
else:
|
|
break
|