POP(The Post Office Protocol),是一个简单的协议。它可以用来从邮件服务器上下载邮件。
POP最常用的版本是3,通常被称为POP3。因为版本3用的实在是太广泛了。因此POP和POP3经常可以互换使用。
Python提供一个模块称为poplib,它提供一个使用POP的便利接口。
使用poplib来连接服务器,取得邮箱信息,下载邮件并在服务器上删除邮件。这就是POP所有标准的特性。
一、连接和认证:
- #!usr/bin/env python
- import getpass,poplib,sys
- (host,user) = sys.argv[1:]
- passwd = 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()
把POP服务器和用户名作为命令行参数,然后登陆。
pass_()传输密码,为了与python的关键字区分,所以要加下划线。
无论使用什么方式,一旦登录成功,大多数的POP服务器都会锁上邮箱。这意味着只要POP连接还维持着,服务器就不会传递任何邮件。直到quit()被调用。
二、取得邮箱信息:
- #!/usr/bin/env python
- import getpass,poplib,sys
- (host,user)=sys.argv[1:]
- passwd = getpass.getpass()
- p=poplib.POP3()
- 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()
三、下载邮件:
Poplib模块的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 (storing it in a list of lines)
- 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()
这个程序是一个把邮箱中的所有邮件都下载下来然后写到文件中的程序。
retr()其实有点奇怪,它返回一个tuple,其中包含了结果代码和邮件。但是邮件并不是字符串格式,而是一个字符串的列表。每一个元素表示该邮件的一行。我们可以使用”\n”.join(lines)来把它们转换成标准的字符串。
四、删除邮件:
有一个dele()函数可以删除邮件,他会发送POP DELE指令,多数情况下,它会把邮件的标识设置为删除。大多数POP服务器在调用了quit()之后才真正删除那些邮件。
p.dele(number)
dele()指令只带一个邮件数字作为参数,所以必须为每一个要删除的邮件调用一次该指令。
POP的最大的特点,就是,实在是太简单了。如果只是想访问远程主机并且下载邮件或者删掉邮件,POP是非常合适的。
但是POP在远程主机上不能够支持多信箱,也不能提供持久稳定的邮件认证。我们不能使用POP3来作为邮件同步的协议。(如果需要使用邮件同步的功能,就必须要使用IMAP)
通常来说,POP会用明文(not加密)来传递认证信息。APOP特性可以加密密码。但是有些POP服务器却不支持APOP。通常的办法是先尝试APOP,如果不行,然后退而使用标准认证。
注:本文参考《python网络编程基础》John Goerzen。
阅读(10943) | 评论(0) | 转发(1) |