第11章:POP

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 appending
destfd=open(dest, 'at')

#Log in like usual
p=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 mailbox
for 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')


你可能感兴趣的:(python,pop)