1 电子邮件标题撷取
VflZ}0一般收取电子邮件的方法是利用邮件伺服器的 pop3通讯协定 (基本设定为埠 110)。其操作是很简单的:
+~tcUI$hz0试开一个远端登入的请求并键入下面的命令:51Testing软件测试网/Ok}0a8vX4~r
f)n
示范 1.
telnet yourpop3host 110
user yourname #提交用户名
pass xxxxxxx #提交密码
stat #统计一下有多少信件
+ok 1 1573 #一封信,共 1573字元
list #列出信件明细表
:
:
top 1 2 #写出第 1封信内容的头 2行
quit #离开 (另外还有 dele 和 retr 命令可以用 )
51Testing软件测试网I Y/N7MRG/{|就是这样而已。非常简单的协定。好了,假设我们能有办法用程式模拟以上的键盘动作,那我们就可以有一个简单的收件工具了。为了快,我们每次只读邮件标题的内容 (top n 0) 就行了。利用 python,这个程式可以很快地开发出来。这是因为 python 已有了一个叫做 poplib 的函数库是专门做 pop3协定的。像这样:51Testing软件测试网gI$Pn:F
51Testing软件测试网6?ltGAALe#s9J|9wE
1# mailh.py2#!/usr/bin/evn python3#记住 user-pass-stat/list-top-dele/retr-quit这用法45importpoplib,getpass,string,sys#先载入要用的函式库67host=raw_input("The hostname: ")# raw_input()从 stdin 读取字串8if(len(host))==0:#如果用户什么也不打,就用基本设定好了,自己方便嘛9host='your pop3 host'10username='yourname'11password='yourpass'12else:13username=raw_input("your username: ")14password=getpass.getpass()# getpass.getpass()会读取密码,和15# raw_input()一样,只是不把键值输出到萤幕而已1617try:18sess=poplib.POP3(host)#打开 pop3 连接,得到一个该连线的实体19sess.user(username)#向 pop3连线输出用户名20sess.pass_(password)#再来是密码21except:#如果上面三行出错了,就表示连线有问题,干脆走人啦22print"O^O, there is an error in opening connection!"23sys.exit()2425nMess=sess.stat()[0]#问一下到底有多少信26headers=[]#这个本程式不会用到,但将来扩展时或许有用27foriinrange(1,nMess+1):# Python 的 range()是从 0开始数,但邮件序号是从一开始的28print29mesg=sess.top(i,0)#用 top 指令读信件的头几行,这里 mesg[0] 是一30#些资料, mesg[1]则是字串类的一个序列31printi,mesg[0]32forjinrange(len(mesg[1])):#这个回圈尝试把寄件人,收件人,主题等资料抽出来33ifmesg[1][j][0:5]=='From:'ormesg[1][j][0:5]=='Date:'\34ormesg[1][j][0:8]=='Subject:'ormesg[1][j][0:3]=='To:':35printmesg[1][j]36headers.append(mesg[1][j])#存起来,本程式不会用到3738ifnMess>0:39print"Received %i message total."%(nMess)40else:41print"Nop, no mail on ",host,"for",username4243sess.quit()#结束
J
StJ6^ W"@0基本上你不看右面的说明,应该也知道这个程式在做什么吧。难也许就难在逐样记住那些函 数罢了。不过放心,对于 Python用户,因为有内省这个功能, 绝对是很容易的事。51Testing软件测试网$fBL$u8Y
你有没有试过收到一些很大很大的垃圾邮件,用 modem下载的话很浪费,但是一般的邮件程 式则一定要一封接一封的下载。很头痛吧,这个小程式就有用了,你可以让它在读完标头后 问一下有哪些邮件是要删除的然后把它们移走。这很难么?不,只要加多 5行码就行了:51Testing软件测试网y I^u8@
N
^urYe0if nMess>0:
print "Received %i message total."%(nMess)
else:
print "Nop, no mail on', host, 'for', username
改成 :
if nMess>0:
print "Received %i message total."%(nMess)
todele = string.split(raw_input("dele which ones:"))
for i in todele:
if i !='0':
sess.dele(int(i))
else:
print "Nop, no mail on', host, 'for', username