Python——POP3邮件协议
一、POP3协议用于收取邮件
二、POP3协议常用方法
user(login):想服务器发送登录名,并显示服务器的响应,表示服务器正在等待该用户的输入密码
pass_(passwd):在用户使用user登陆后,发送passwd,如果登录失败,则抛出异常
stat():返回邮件的状态
list([msgnum]):stat()的扩展,如果给定msgnum,则返回指定消息数据
retr(msgnum):从服务器中得到消息msgnum,并设置“已读”标志
dele(msgnum):把消息msgnum标记为删除,大多数服务器在调用quit()后执行删除操作
quit():注销,提交修改,解锁邮箱,终止连接,然后退出
三、代码示例
1、先下载邮件
- import poplib
- # 输入邮件地址, 口令和POP3服务器地址:
- email = raw_input('Email: ')
- password = raw_input('Password: ')
- pop3_server = raw_input('POP3 server: ')
- # 连接到POP3服务器:
- server = poplib.POP3(pop3_server)
- # 可以打开或关闭调试信息:
- # server.set_debuglevel(1)
- # 可选:打印POP3服务器的欢迎文字:
- print(server.getwelcome())
- # 身份认证:
- server.user(email)
- server.pass_(password)
- # stat()返回邮件数量和占用空间:
- print('Messages: %s. Size: %s' % server.stat())
- # list()返回所有邮件的编号:
- resp, mails, octets = server.list()
- # 可以查看返回的列表类似['1 82923', '2 2184', ...]
- print(mails)
- # 获取最新一封邮件, 注意索引号从1开始:
- index = len(mails)
- resp, lines, octets = server.retr(index)
- # lines存储了邮件的原始文本的每一行,
- # 可以获得整个邮件的原始文本:
- msg_content = '\r\n'.join(lines)
- # 稍后解析出邮件:
- msg = Parser().parsestr(msg_content)
- # 可以根据邮件索引号直接从服务器删除邮件:
- # server.dele(index)
- # 关闭连接:
- server.quit()
2、解析邮件
- #导入模块
- import email
- from email.parser import Parser
- from email.header import decode_header
- from email.utils import parseaddr
- #只需要一行代码就可以把邮件内容解析为Message对象:
- msg = Parser().parsestr(msg_content)
- #但是这个Message对象本身可能是一个MIMEMultipart对象,即包含嵌套的其他MIMEBase对象,嵌套可能还不止一层。
- #所以我们要递归地打印出Message对象的层次结构:
- # indent用于缩进显示:
- def print_info(msg, indent=0):
- if indent == 0:
- # 邮件的From, To, Subject存在于根对象上:
- for header in ['From', 'To', 'Subject']:
- value = msg.get(header, '')
- if value:
- if header=='Subject':
- # 需要解码Subject字符串:
- value = decode_str(value)
- else:
- # 需要解码Email地址:
- hdr, addr = parseaddr(value)
- name = decode_str(hdr)
- value = u'%s <%s>' % (name, addr)
- print('%s%s: %s' % (' ' * indent, header, value))
- if (msg.is_multipart()):
- # 如果邮件对象是一个MIMEMultipart,
- # get_payload()返回list,包含所有的子对象:
- parts = msg.get_payload()
- for n, part in enumerate(parts):
- print('%spart %s' % (' ' * indent, n))
- print('%s--------------------' % (' ' * indent))
- # 递归打印每一个子对象:
- print_info(part, indent + 1)
- else:
- # 邮件对象不是一个MIMEMultipart,
- # 就根据content_type判断:
- content_type = msg.get_content_type()
- if content_type=='text/plain' or content_type=='text/html':
- # 纯文本或HTML内容:
- content = msg.get_payload(decode=True)
- # 要检测文本编码:
- charset = guess_charset(msg)
- if charset:
- content = content.decode(charset)
- print('%sText: %s' % (' ' * indent, content + '...'))
- else:
- # 不是文本,作为附件处理:
- print('%sAttachment: %s' % (' ' * indent, content_type))
- #邮件的Subject或者Email中包含的名字都是经过编码后的str,要正常显示,就必须decode:
- def decode_str(s):
- value, charset = decode_header(s)[0]
- if charset:
- value = value.decode(charset)
- return value
- #decode_header()返回一个list,因为像Cc、Bcc这样的字段可能包含多个邮件地址,所以解析出来的会有多个元素。上面的代码我们偷了个懒,只取了第一个元素。
- #文本邮件的内容也是str,还需要检测编码,否则,非UTF-8编码的邮件都无法正常显示:
- def guess_charset(msg):
- # 先从msg对象获取编码:
- charset = msg.get_charset()
- if charset is None:
- # 如果获取不到,再从Content-Type字段获取:
- content_type = msg.get('Content-Type', '').lower()
- pos = content_type.find('charset=')
- if pos >= 0:
- charset = content_type[pos + 8:].strip()
- return charset
Python——POP3邮件协议的更多相关文章
- 邮件协议POP3/IMAP/SMTP服务的区别
2016年09月09日 09時51分 wanglinqiang整理 通过网上查找的资料和自己的总结完成了下面的文章,看完之后相信大家对这三种协议会有更深入的理解.如有错误的地方望指正. POP3 PO ...
- centos 邮件服务 腾讯企业邮箱(免费) 使用iRedmail 需要有公网的centos主机 发邮件协议:smtp 端口25 收邮件协议:pop3 端口110 iredmail安装配置 使用邮箱系统 第三十一节课
centos 邮件服务 腾讯企业邮箱(免费) 使用iRedmail 需要有公网的centos主机 发邮件协议:smtp 端口25 收邮件协议:pop3 端口110 iredmail安装配置 ...
- 如何用python进行邮件发送
使用Python调用邮件服务器发送邮件,使用的协议是SMTP(Simple Mail Transfer Protocol),下图为使用TCP/IP基于SMTP发送邮件的过程示意图: SMTP协议工作原 ...
- python SMTP邮件发送(转载)
Python SMTP发送邮件 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. py ...
- 基于Lumisoft.NET组件的POP3邮件接收和删除操作(转载)
Lumisoft.NET组件是一个非常强大的邮件发送.邮件接收等功能的开源组件,一般用它来处理邮件的相关操作,是非常合适的.之前也写过一些该组件的随笔文章,不过主要是利用来发送邮件居多,最近由于项目需 ...
- 基于Lumisoft.NET组件的POP3邮件接收和删除操作
From: http://www.cnblogs.com/wuhuacong/archive/2013/05/06/3063093.html Lumisoft.NET组件是一个非常强大的邮件发送.邮件 ...
- python发邮件遇到的端口号问题
在学习使用python发邮件的过程中, 遇到了一个问题:由于测试的时候使用的是QQ邮箱,要求必须使用SSL/TLS加密,所以有了下面的代码, from email.mime.text import M ...
- C#邮件接收系统核心代码(接收POP3邮件IMAP邮件)
/* * Created by SharpDevelop. * User: Administrator * Date: 2013/11/18 * Time: 20:55 * * To change t ...
- 邮件协议(SMTP)性能测试总结(Foxmail邮箱)
先介绍一下邮件协议SMTP的工作机制(连接和发送过程),用wireshark工具抓包进行分析,如下: SMTP协议的工作机制(连接和发送过程): 1.建立TCP连接,并将邮件服务器地址给客户端: 2. ...
随机推荐
- GFF高仿QQ客户端及服务器
一.GFF简介 GFF是仿QQ界面,通信基于SAEA.MessageSocket.SAEA.Http.SAEA.MVC实现包含客户端和服务器的程序,源码完全公开,项目源码地址:https://gith ...
- CentOS7 安装MySQL5.6
1. 检查是否有MariaDB和MySQL,如果有则卸载掉 [root@--- ~]# rpm -qa | egrep "mariadb|mysql" mariadb-serve ...
- Grafana+Telegraf+Influxdb监控Tomcat集群方案
前言 前一段时间自家养的几只猫经常出问题,由于没有有效的监控预警手段,以至于问题出现或者许久一段时间才会被通知到.凌晨一点这个锅可谁都不想背,为此基于目前的情况搭建了以下这么一套监控预警系统. 相关软 ...
- 网络爬虫之Url含有中文如何转码
一:背景 今天在使用Jsoup对一个网站进行数据爬取,发现爬取内容为该搜索结果是0条,请求头啥的都填好,利用Chrome开发者工具发现请求Url路径不含中文,抱着试一试的态度,我复制此段非中文参数进行 ...
- 【Python撩妹合集】微信聊天机器人,推送天气早报、睡前故事、精美图片分享
福利时间,福利时间,福利时间 如果你还在为不知道怎么撩妹而烦恼,不知道怎么勾搭小仙女而困惑,又或者不知道怎么讨女朋友欢心而长吁短叹. 那么不要犹豫徘徊,往下看.接下来我会分享怎么使用 Python 实 ...
- Item 20: 使用std::weak_ptr替换会造成指针悬挂的类std::shared_ptr指针
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 矛盾的是,我们很容易就能创造出一个和std::shared_ptr ...
- Item 13: 比起iterator优先使用const_iterator
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 STL中的const_iterator等价于pointers-to ...
- 跨域访问-需要设置HTTP响应标头
前提:服务端网站的配置(被请求的网站) 1.需要在IIS服务器站点的功能视图中设置HTTP响应标头: 2.双击“HTTP响应标头”进入设置界面 3.点击右侧添加按钮弹出窗口 4.填入需要设置的信息 名 ...
- 小程序解决方案 Westore - 组件、纯组件、插件开发
数据流转 先上一张图看清 Westore 怎么解决小程序数据难以管理和维护的问题: 非纯组件的话,可以直接省去 triggerEvent 的过程,直接修改 store.data 并且 update,形 ...
- CodeForces 719A. Vitya in the Countryside
链接:[http://codeforces.com/group/1EzrFFyOc0/contest/719/problem/A] 题意: 给你一个数列(0, 1, 2, 3, 4, 5, 6, 7, ...