第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 appendingdestfd=open(dest, ‘at‘)

#Log in like usualp=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 mailboxfor 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‘)
时间: 2024-10-12 15:19:49

第11章:POP的相关文章

C++ Primer 读书笔记:第11章 泛型算法

第11章 泛型算法 1.概述 泛型算法依赖于迭代器,而不是依赖容器,需要指定作用的区间,即[开始,结束),表示的区间,如上所示 此外还需要元素是可比的,如果元素本身是不可比的,那么可以自己定义比较函数. 2.常用的泛型算法函数: fill,fill_n, copy, replace, sort, unique, count_if, stable_sort 此外在有一个谓词函数会结合以上的函数使用,像sort, count_if等 3.再谈迭代器 (1)插入迭代器 back_inserter, f

锋利的jQuery第2版学习笔记8~11章

第8章,用jQuery打造个性网站 网站结构 文件结构 images文件夹用于存放将要用到的图片 styles文件夹用于存放CSS样式表,个人更倾向于使用CSS文件夹 scripts文件夹用于存放jQuery脚本,个人更倾向于使用JS文件夹存放所有的js及jQuery脚本 编写CSS样式 推荐首先编写全局样式,接着编写可大范围内重用的样式,最后编写细节样式,这样根据CSS最近优先原则,可以较容易地对网站进行从整体到细节样式的定义 第9章,jQuery Mobile jQuery Mobile主要

敏捷软件开发:原则、模式与实践——第11章 DIP:依赖倒置原则

第11章 DIP:依赖倒置原则 DIP:依赖倒置原则: a.高层模块不应该依赖于低层模块.二者都应该依赖于抽象. b.抽象不应该依赖于细节.细节应该依赖于抽象. 11.1 层次化 下图展示了一个简单的层次化方案: 高层的Policy层使用了低层的Mechanism层,而Mechanism层又使用了更细节的Utility层.它存在一个隐伏的错误特征,那就是:Policy层对于其下一直到Utility层的改动都是敏感的.依赖关系是传递的. 下图展示了一个更为合适的模型: 每个较高层次都为它所需要的服

《白帽子讲WEB安全》学习笔记之第11章 加密算法与随机数

第11章 加密算法与随机数 11.1 概述 攻击密码系统的方法 密码分析者攻击密码系统的方法主要有以下三种: (1)穷举攻击 所谓穷举攻击是指密码分析者采用依次试遍所有可能的密钥对所获密文进行解密,直至得到正确的明文. (2)统计分析攻击 所谓统计分析攻击就是指密码分析者通过分析密文和明文的统计规律来破译密码. (3)数学分析攻击 所谓数学分析攻击是指密码分析者针对加解密算法的数学基础和某些密码学特性,通过数学求解的方法来破译密码. 破译密码的类型 (1)唯密文攻击(Ciphertext-onl

《TCP/IP详解卷1:协议》第11章 UDP:用户数据报协议-读书笔记

章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(1)-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(2)-读书笔记 <TCP/IP详解卷1:协议>第4章 ARP:地址解析协议-读书笔记 <TCP/IP详解卷1:协议>第5章 RARP:逆地址解析协议-读书笔记 <TCP/IP详解卷1:协

10章、11章

一.典型用户和典型场景 Visual Studio的经典用户 怎样定义典型用户 从典型用户到场景 用例 规格说明书 功能说明书 定义好相关的概念 规范好一些假设 避免一些误解,界定一些边界条件 描述主流的用户/软件交互步骤 一些好的功能还会有副作用 服务质量的说明 功能驱动的设计 构造总体模型 构造功能列表 制定开发计划 功能设计阶段 实现具体功能 11章 分析和设计方法 图形建模和分析方法 表达实体和实体之间的关系 表达数据的流动 表达控制流 统一的表达方式 其他设计方法 形式化的方法 文学化

C++ primer plus读书笔记——第11章 使用类

第11章 使用类 1. 运算符重载是一种形式的C++多态. 2. 不要返回指向局部变量或临时对象的引用.函数执行完毕后,局部变量和临时对象将消失,引用将指向不存在的数据. 3. 运算符重载的格式如下: operatorop(argument-list); 可以使用函数表示法或运算符表示法来使用它. total = coding + fixing; total = coding.operator+(fixing); 4. 运算符重载的限制: 1)  重载后的运算符必须至少有一个操作数是用户定义的类

统计学习方法 李航---第11章 条件随机场

第11章 条件随机场 条件随机场(conditional random field, CRF)是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型,其特点是假设输出随机变量构成马尔可夫随机场.条件随机场可以用于不同的预测问题,本章主要讲述线性链(linear chain)条件随机场在标注问题的应用,这时问题变成了由输入序列对输出序列预测的判别模型,形式为对数线性模型,其学习方法通常是极大似然估计或正则化的极大似然估计. 11.1 概率无向图模型 概率无向图模型(probabilist

第11章 SQL Server 高可用性解决方案

第11章  SQL Server 高可用性解决方案 11.1  高可用性与网络负载均衡  http://mssqlmct.blog.51cto.com/9951484/1641028 11.2  日志传送简介 11.3  数据库镜像简介 11.4  AlwaysOn 故障转移群集简介 11.5  AlwaysOn 可用性组简介 11.6  设计高可用性解决方案

【Go web开发之revel+mgo】第11章 部署到heroku上

演示地址  http://gblog-revel.herokuapp.com/ 1.申请mongohq 关于如何在注册heroku和mongohq帐号,我在之前的blog里面有说明,http://blog.csdn.net/joveth/article/details/19999535 这里简单的说一下,还记得我们的models/dao.go文件里的NewDao方法中被注释的那一行吗? session, err := mgo.Dial("mongodb://omind:[email protec