ChinesePython Wiki   Python 编程范例:网络应用-邮件处理 用户设定
 
站内导航 Diffs Info Edit RAW Print
 ChinesePython Wiki   中蟒大杂院   最近修改   标题目录   看发表区   搜寻/发表   站内导航   求助 

1 电子邮件标题撷取

一般收取电子邮件的方法是利用邮件伺服器的 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也内建了很好的处理这些东西的函数库!!


PythonPowered
搜寻页面 或尝试以下动作: 附加档案, 删除页面, 本页连结图