POP用来从邮件服务器上下载邮件。
一、连接和认证
建立一个POP3对象,传给它远程服务器的主机名和端口号;调用user()和pass_()函数来发送用户名和密码;如果产生poplib.error_proto异常,登录就失败。
#!/usr/bin/env python import getpass, poplib, sys(host, user)=sys.argv[1:]passwd=getpass.getpass() p=poplib.POP3(host)try: p.user(user) p.pass_(passwd)except poplib.error_proto, e: print ‘Login failed: ‘, e sys.exit(1)status=p.stat()print‘Mailbox has %d messages for a total of %d bytes‘ %(status[0], status[1])p.quit()
stat()会返回一个元组,其中包含了服务器邮箱中邮件的数量和邮件总的大小,最后调用quit(),关闭POP连接。一旦登录成功,大多数的POP服务器会锁上邮箱,这意味这只要POP连接海维持着,服务器就不会递送任何邮件,邮件也不会被修改,直到quit()被调用。因此在结束一个POP操作后,调用quit()是至关重要的。
二、取得邮箱信息
#!/usr/bin/env python import getpass, poplib, sys(host, user)=sys.argv[1:]passwd=getpass.getpass() p=poplib.POP3(host) try: print ‘Attempting APOP authentication‘ p.apop(user, passwd)except poplib.error_proto: print ‘Attempting standard authentication‘ try: p.user(user) p.pass_(passwd) except poplib.error_proto, e: print ‘Login failed: ‘, e sys.exit(1)status=p.stat()print‘Mailbox has %d messages for a total of %d bytes‘ %(status[0], status[1])for item in p.list()[1]: number, octets=item.split(‘ ‘) print ‘Message %s: %s bytes‘%(number, octets)p.quit()
list()函数返回一个包含两个条目的元组,第一个是一个应答代码,通常可以忽略。第二个是一个字符串的列表。列表中的每一个字符串也包含两个条目:邮件的数字和邮件的字节数。
三、下载邮件
poplib模块的retr()函数用来下载邮件,传递想要下载的邮件的数字作为参数。retr()函数返回一个元组,其中包含了结果代码和邮件。但邮件不时字符串格式,而是一个字符串的列表,每一个元素表示该邮件的一行。
#!/usr/bin/env python import getpass, poplib, sys, email(host, user, dest)=sys.argv[1:]passwd=getpass.getpass() #open a mailbox for appendingdestfd=open(dest, ‘at‘) #Log in like usualp=poplib.POP3(host)try: p.user(user) p.pass_(passwd)except poplib.error_proto, e: print ‘Login failed:‘, e sys.exit(1) #Iterate over the list of messages in the mailboxfor item in p.list()[1]: number, octets=item.split(‘ ‘) print ‘Downloading message %s (%s bytes)‘ %(number, octets) #Retrieve the message lines=p.retr(number)[1] #Create an e-mail object representing the message msg=email.message_from_string(‘\n‘.join(lines)) #Write it out to the mailbox destfd.write(msg.as_string(unixfrom=1)) #Make sure there‘s an extra newline separating messages destfd.write(‘\n‘) p.quit()destfd.close()
四、删除邮件
dele()函数会把邮件的标志设置为删除,大多数的POP服务器只有在调用了quit()之后,才会真正删除这些邮件。
#!/usr/bin/env python import getpass, poplib, sys, email def log(text): ‘‘‘Simple function to write status information‘‘‘ sys.stdout.write(text) sys.stdout.flush() (host, user, dest)=sys.argv[1:]passwd=getpass.getpass() destfd=open(dest, ‘at‘) log(‘Connecting to %s...\n‘%host)p=poplib.POP3(host)try: log(‘Logging on...‘) p.user(user) p.pass_(passwd) log(‘success.\n‘)except poplib.error_proto, e: print ‘Login failed:‘, e sys.exit(1) log(‘Scanning INBOX...‘)mblist=p.list()[1]log(‘%d messages.\n‘%len(mblist)) dellist=[] for item in mblist: number, octets=item.split(‘ ‘) log(‘Downloading message %s (%s bytes)...‘%(number, octets)) lines=p.retr(number)[1] msg=email.message_from_string(‘\n‘.join(lines)) destfd.write(msg.as_string(unixfrom=1)) destfd.write(‘\n‘) dellist.append(number) log(‘done\n‘) destfd.close() counter=0 for number in dellist: counter+=1 log(‘Deleting message %d of %d\r‘%(counter, len(dellist))) p.dele(number) if counter>0: log(‘successfully deleted %d messages from server.\n‘% counter)else: log(‘No messages present to download.\n‘) log(‘Closing connection,....‘)p.quit()log(‘done\n‘)
时间: 2024-10-12 15:19:49