| Python 编程范例:网络应用-邮件处理 |
用户设定 |
| ChinesePython Wiki | 中蟒大杂院 | 最近修改 | 标题目录 | 看发表区 | 搜寻/发表 | 站内导航 | 求助 |
一般收取电子邮件的方法是利用邮件伺服器的 pop3通讯协定 (基本设定为埠 110)。其操作是很简单的:
试开一个远端登入的请求并键入下面的命令:
示范 1. telnet yourpop3host 110 user yourname #提交用户名 pass xxxxxxx #提交密码 stat #统计一下有多少信件 +ok 1 1573 #一封信,共 1573字元 list #列出信件明细表 : : top 1 2 #写出第 1封信内容的头 2行 quit #离开 (另外还有 dele 和 retr 命令可以用 )
就是这样而已。非常简单的协定。好了,假设我们能有办法用程式模拟以上的键盘动作,那我们就可以有一个简单的收件工具了。为了快,我们每次只读邮件标题的内容 (top n 0) 就行了。利用 python,这个程式可以很快地开发出来。这是因为 python 已有了一个叫做 poplib 的函数库是专门做 pop3协定的。像这样:
1 # mailh.py
2 #!/usr/bin/evn python
3 #记住 user-pass-stat/list-top-dele/retr-quit这用法
4
5 import poplib, getpass, string, sys #先载入要用的函式库
6
7 host = raw_input("The hostname: ") # raw_input()从 stdin 读取字串
8 if (len(host)) == 0: #如果用户什么也不打,就用基本设定好了,自己方便嘛
9 host = 'your pop3 host'
10 username = 'yourname'
11 password = 'yourpass'
12 else:
13 username = raw_input("your username: ")
14 password = getpass.getpass() # getpass.getpass()会读取密码,和
15 # raw_input()一样,只是不把键值输出到萤幕而已
16
17 try:
18 sess = poplib.POP3(host) #打开 pop3 连接,得到一个该连线的实体
19 sess.user(username) #向 pop3连线输出用户名
20 sess.pass_(password) #再来是密码
21 except: #如果上面三行出错了,就表示连线有问题,干脆走人啦
22 print "O^O, there is an error in opening connection!"
23 sys.exit()
24
25 nMess = sess.stat()[0] #问一下到底有多少信
26 headers = [] #这个本程式不会用到,但将来扩展时或许有用
27 for i in range(1, nMess+1): # Python 的 range()是从 0开始数,但邮件序号是从一开始的
28 print
29 mesg = sess.top(i,0) #用 top 指令读信件的头几行,这里 mesg[0] 是一
30 #些资料, mesg[1]则是字串类的一个序列
31 print i, mesg[0]
32 for j in range(len(mesg[1])): #这个回圈尝试把寄件人,收件人,主题等资料抽出来
33 if mesg[1][j][0:5] == 'From:' or mesg[1][j][0:5] == 'Date:' \
34 or mesg[1][j][0:8] == 'Subject:' or mesg[1][j][0:3] == 'To:':
35 print mesg[1][j]
36 headers.append(mesg[1][j]) #存起来,本程式不会用到
37
38 if nMess>0:
39 print "Received %i message total."%(nMess)
40 else:
41 print "Nop, no mail on ", host, "for", username
42
43 sess.quit() #结束
基本上你不看右面的说明,应该也知道这个程式在做什么吧。难也许就难在逐样记住那些函 数罢了。不过放心,对于 Python用户,因为有内省这个功能, 绝对是很容易的事。
你有没有试过收到一些很大很大的垃圾邮件,用 modem下载的话很浪费,但是一般的邮件程 式则一定要一封接一封的下载。很头痛吧,这个小程式就有用了,你可以让它在读完标头后 问一下有哪些邮件是要删除的然后把它们移走。这很难么?不,只要加多 5行码就行了:
if 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
你又有没有试过一次过收到近千上万个没用的邮件?一个一个来删除?很头痛吧,这个小程 式又可以有用了,因为基本上我们知道来信者,当然可以选择其中没用的加以删除。这极其 量也只是一两行的改动,但可以省去很多人力,如果好的话还可以用来当邮件过滤器用呢! 至于如何改就留做练习好了。 _
当然如果你打算进一步处理资料,那你无可避免的要处理很多复杂的 MIME标头。不过这也不 打紧,因为 Python也内建了很好的处理这些东西的函数库!!