博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python之poplib库
阅读量:4685 次
发布时间:2019-06-09

本文共 4524 字,大约阅读时间需要 15 分钟。

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-8import getpass, poplib, syshost = 'pop3.163.com'user = @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.pyPassword: Mailbox has 493 messages for a total of 34415730 bytes

APOP认证

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

#!/usr/bin/python# POP connection and authentication with APOPimport getpass, poplib, syshost = '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 scanningimport getpass, poplib, syshost = '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 downloaderimport getpass, poplib, sys, emailhost = '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 deletionimport getpass, poplib, sys, emaildef log(text):        sys.stdout.write(text)        sys.stdout.flush()host = 'pop3.163.com'user = @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 = 0for 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")

 

转载于:https://www.cnblogs.com/gxops/p/3373492.html

你可能感兴趣的文章
[转]MySQL数据库管理常用命令
查看>>
Git Stash用法
查看>>
线程与同步
查看>>
co源码解读
查看>>
Page directive must not have multiple occurrences of pageencoding
查看>>
Oracle获取异常的具体出处dbms_utility.format_error_backtrace
查看>>
Python爬虫技巧
查看>>
javascript C# 兼容的DES Base64加密/解密方法 整理
查看>>
利用$(window).resize()实现窗口大小自适应宽度问题
查看>>
OggVorbis 小记
查看>>
hibernate中多表映射关系配置
查看>>
react 高阶组件
查看>>
msi微星B350M主板开启VT(Virtualization Technology)
查看>>
java中可达对象和不可达对象
查看>>
react 路由跳转刷新页面参数消失
查看>>
Android 读取文件内容
查看>>
sql server 2008学习8 sql server存储和索引结构
查看>>
Jquery radio选中
查看>>
《Visual C++ 2010入门教程》系列二:安装、配置和首次使用VS2010
查看>>
P1351 联合权值[鬼畜解法]
查看>>