pop3能实现访问远程主机下载新的邮件或者下载后删掉这些邮件。不支持多信箱,也不能提供持久稳定的邮件认证。也就是说不能使用pop3来作为邮件同步协议。 poplib支持多个认证方法。最普遍的是基本的用户名和密码方式以及APOP,后者是POP的一种可选扩展,可以帮助服务器在传输明文的时候避免袭击者盗取密码。连接和认证过程如下:

1.建立一个pop3对象,传给它远程服务器的主机名和端口号。

2.调用user()和pass_()函数来发送用户名和密码。

3.如果产生poplib.error_proto异常,登录就失败,服务器就会发送和异常有关的字符串和解释文字。

4.登录连接后,调用star()返回一个tuple,其中包含了服务器邮箱中的邮件数量和邮件总的大小。

5.最后,调用quit(),关闭pop连接.

[root@localhost example]# cat popconn.py
#!/usr/bin/python
#POP connection and authentication
#coding:utf-8 import getpass, poplib, sys host = 'pop3.163.com'
user = 'test@163.com'
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() [root@localhost example]# python popconn.py
Password:
Mailbox has 493 messages for a total of 34415730 bytes

APOP认证

使用一种加密方法来确保密码不被网络嗅探器窃取。APOP认证需要服务器支持,客户端连接时可以先尝试APOP认证,如果失败再尝试标准认证。

#!/usr/bin/python
# POP connection and authentication with APOP import getpass, poplib, sys host = 'pop3.163.com'
user = 'test@163.com'
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:
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返回的结果为邮件的数量和全部大小。如果要返回每一封邮件更详细的信息,就要用指令 list() 。

#!/usr/bin/python
#POP mailbox scanning import getpass, poplib, sys host = 'pop3.163.com'
user = 'test@163.com'
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 messges 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()

p.list返回一个包含两个条目的组,第一个为应答代码,第二个是字符串列表,其中包括邮件数字和邮件的字节数。

下载邮件: poplib模块的retr()函数通过传递想要下载的邮件数字来下载邮件,每次下载一封邮件。 例:从服务器下载全部邮件并保留它们并以标准的unix mbox 格式写入文件中。

#!/usr/bin/python
#POP mailbox downloader import getpass, poplib, sys, email host = 'pop3.163.com'
user = 'test@163.com'
dest = './mailbox'
passwd = getpass.getpass() destfd = open(dest, "at") p = poplib.POP3(host)
try:
p.user(user)
p.pass_(passwd)
except poplib.error_proto, e:
print "Login failed:", e
sys.exit(1) for item in p.list()[1]:
number, octets = item.split(' ')
print "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") p.quit()
destfd.close()

删除邮件:
poplib库调用dele()函数向服务器发送POP DELE指令,dele函数调用时需要传递一个要删除邮件的数字。

[root@localhost example]# cat download-and-delete.py
#!/usr/bin/python
#POP mailbox downloader with deletion import getpass, poplib, sys, email def log(text):
sys.stdout.write(text)
sys.stdout.flush() host = 'pop3.163.com'
user = 'test@163.com'
dest = './mailbox'
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 num in dellist:
counter += 1
log("Deleting message %d of %d\n" % (counter, len(dellist)))
#p.dele(num)
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之poplib库的更多相关文章

  1. Python底层socket库

    Python底层socket库将Unix关于网络通信的系统调用对象化处理,是底层函数的高级封装,socket()函数返回一个套接字,它的方法实现了各种套接字系统调用.read与write与Python ...

  2. 【C++实现python字符串函数库】strip、lstrip、rstrip方法

    [C++实现python字符串函数库]strip.lstrip.rstrip方法 这三个方法用于删除字符串首尾处指定的字符,默认删除空白符(包括'\n', '\r', '\t', ' '). s.st ...

  3. 【C++实现python字符串函数库】二:字符串匹配函数startswith与endswith

    [C++实现python字符串函数库]字符串匹配函数startswith与endswith 这两个函数用于匹配字符串的开头或末尾,判断是否包含另一个字符串,它们返回bool值.startswith() ...

  4. 【C++实现python字符串函数库】一:分割函数:split、rsplit

    [C++实现python字符串函数库]split()与rsplit()方法 前言 本系列文章将介绍python提供的字符串函数,并尝试使用C++来实现这些函数.这些C++函数在这里做单独的分析,最后我 ...

  5. python使用cookielib库示例分享

    Python中cookielib库(python3中为http.cookiejar)为存储和管理cookie提供客户端支持,下面是使用示例 该模块主要功能是提供可存储cookie的对象.使用此模块捕获 ...

  6. Python virtualenv安装库报错SSL: CERTIFICATE_VERIFY_FAILED

    Python virtualenv安装库报错SSL: CERTIFICATE_VERIFY_FAILED 问题描述 使用pip按照virtualenv报错,如下: pip install virtua ...

  7. 【python】标准库的大致认识

    正如那句 Python 社区中很有名的话所说的:“battery included”,Python 的一大好处在于它有一套很有用的标准库(standard library).标准库是随着 Python ...

  8. Python 图形 GUI 库 pyqtgraph

    原文  Python 图形 GUI 库 pyqtgraph pyqtgraph 是纯 Python 图形 GUI 库,基于PyQT4 /pyside和NumPy.它主要目的用于在数学/科学/工程中.M ...

  9. python的urllib2库详细使用说明

    一直以来技术群里会有新入行的同学提问关于urllib和urllib2以及cookielib相关的问题.所以我打算在这里总结一下,避免大家反复回答同样的问题浪费资源. 这篇属于教程类的文字,如果你已经非 ...

随机推荐

  1. OC基础(17)

    ARC基本概念 ARC快速入门 ARC下的内存管理 ARC和MRC兼容和转换 *:first-child { margin-top: 0 !important; } body > *:last- ...

  2. android 拍照,裁切,上传圆形头像, 图片等比缩放

    最近太忙了,没有空更新博客,其它部分以后再更新: 今天给大家分享的是解决解析图片的出现oom的问题,我们可以用BitmapFactory这里的各种Decode方法,如果图片很小的话,不会出现oom,但 ...

  3. Botposter.com集群ETCD2.3.7升级至3.0实录[原创]

    7月1日,为庆祝我党生日,ETCD隆重发布了3.0版本.Botposter.com也在第一时间对集群进行了升级.本文是升级过程的记录与总结(文中假设读者已经使用或测试过ETCD V2,如有不妥请见谅) ...

  4. python基础set

    1.set set是一个无序的不重复的集合 li=[11,22,33,11] s=set(li) print(s) {11,22,33}  set提供的方法 1.add(self, *args, ** ...

  5. rsync 参数断点续传

    断点续传是使用大写P参数,-P这个参数是综合了--partial --progress两个参数 rsync -avzP /home/hadoop/jdk1..0_73.tar.gz root@10.2 ...

  6. Java基础——左移和右移

    首先要明白一点,这里面所有的操作都是针对存储在计算机中中二进制的操作,那么就要知道,正数在计算机中是用二进制表示的,负数在计算机中使用补码表示的. 左移位:<<,有符号的移位操作 左移操作 ...

  7. JS &#8203; ZERO WIDTH SPACE

    如上编码 ZERO WIDTH SPACE  在各个语言的表达. JS中使用 var b = a.replace(/\u200B/g,''); 来替换,去掉 ZERO WIDTH SPACE . ht ...

  8. 【MySQL】MySQL锁和隔离级别浅析二 之 INSERT

    最近在整理线上性能时,发现一台线上DB出现两个insert产生的死锁问题 ------------------------ LATEST DETECTED DEADLOCK ------------- ...

  9. CSS 中 display:inline-block 属性使用详解

    本文详细描述了display:inline-block的基础知识,产生的问题和解决方法以及其常见的应用场景,加深了对inline-block应用的进一步理解. 基础知识 display:inline- ...

  10. linux地址空间划分

    LDD讲的很明白了: Linux 是一个虚拟内存系统, 意味着用户程序见到的地址不直接对应于硬件使用的物理地址. 虚拟内存引入了一个间接层, 它允许了许多好事情. 有了虚拟内存, 系统重运行的程序可以 ...