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')