一、POP3协议用于收取邮件

二、POP3协议常用方法

user(login):想服务器发送登录名,并显示服务器的响应,表示服务器正在等待该用户的输入密码

pass_(passwd):在用户使用user登陆后,发送passwd,如果登录失败,则抛出异常

stat():返回邮件的状态

list([msgnum]):stat()的扩展,如果给定msgnum,则返回指定消息数据

retr(msgnum):从服务器中得到消息msgnum,并设置“已读”标志

dele(msgnum):把消息msgnum标记为删除,大多数服务器在调用quit()后执行删除操作

quit():注销,提交修改,解锁邮箱,终止连接,然后退出

三、代码示例

1、先下载邮件

  1. import poplib
  2.  
  3. # 输入邮件地址, 口令和POP3服务器地址:
  4. email = raw_input('Email: ')
  5. password = raw_input('Password: ')
  6. pop3_server = raw_input('POP3 server: ')
  7.  
  8. # 连接到POP3服务器:
  9. server = poplib.POP3(pop3_server)
  10. # 可以打开或关闭调试信息:
  11. # server.set_debuglevel(1)
  12. # 可选:打印POP3服务器的欢迎文字:
  13. print(server.getwelcome())
  14. # 身份认证:
  15. server.user(email)
  16. server.pass_(password)
  17. # stat()返回邮件数量和占用空间:
  18. print('Messages: %s. Size: %s' % server.stat())
  19. # list()返回所有邮件的编号:
  20. resp, mails, octets = server.list()
  21. # 可以查看返回的列表类似['1 82923', '2 2184', ...]
  22. print(mails)
  23. # 获取最新一封邮件, 注意索引号从1开始:
  24. index = len(mails)
  25. resp, lines, octets = server.retr(index)
  26. # lines存储了邮件的原始文本的每一行,
  27. # 可以获得整个邮件的原始文本:
  28. msg_content = '\r\n'.join(lines)
  29. # 稍后解析出邮件:
  30. msg = Parser().parsestr(msg_content)
  31. # 可以根据邮件索引号直接从服务器删除邮件:
  32. # server.dele(index)
  33. # 关闭连接:
  34. server.quit()

2、解析邮件

  1. #导入模块
  2. import email
  3. from email.parser import Parser
  4. from email.header import decode_header
  5. from email.utils import parseaddr
  6. #只需要一行代码就可以把邮件内容解析为Message对象:
  7. msg = Parser().parsestr(msg_content)
  8. #但是这个Message对象本身可能是一个MIMEMultipart对象,即包含嵌套的其他MIMEBase对象,嵌套可能还不止一层。
  9. #所以我们要递归地打印出Message对象的层次结构:
  10. # indent用于缩进显示:
  11. def print_info(msg, indent=0):
  12. if indent == 0:
  13. # 邮件的From, To, Subject存在于根对象上:
  14. for header in ['From', 'To', 'Subject']:
  15. value = msg.get(header, '')
  16. if value:
  17. if header=='Subject':
  18. # 需要解码Subject字符串:
  19. value = decode_str(value)
  20. else:
  21. # 需要解码Email地址:
  22. hdr, addr = parseaddr(value)
  23. name = decode_str(hdr)
  24. value = u'%s <%s>' % (name, addr)
  25. print('%s%s: %s' % (' ' * indent, header, value))
  26. if (msg.is_multipart()):
  27. # 如果邮件对象是一个MIMEMultipart,
  28. # get_payload()返回list,包含所有的子对象:
  29. parts = msg.get_payload()
  30. for n, part in enumerate(parts):
  31. print('%spart %s' % (' ' * indent, n))
  32. print('%s--------------------' % (' ' * indent))
  33. # 递归打印每一个子对象:
  34. print_info(part, indent + 1)
  35. else:
  36. # 邮件对象不是一个MIMEMultipart,
  37. # 就根据content_type判断:
  38. content_type = msg.get_content_type()
  39. if content_type=='text/plain' or content_type=='text/html':
  40. # 纯文本或HTML内容:
  41. content = msg.get_payload(decode=True)
  42. # 要检测文本编码:
  43. charset = guess_charset(msg)
  44. if charset:
  45. content = content.decode(charset)
  46. print('%sText: %s' % (' ' * indent, content + '...'))
  47. else:
  48. # 不是文本,作为附件处理:
  49. print('%sAttachment: %s' % (' ' * indent, content_type))
  50.  
  51. #邮件的Subject或者Email中包含的名字都是经过编码后的str,要正常显示,就必须decode:
  52. def decode_str(s):
  53. value, charset = decode_header(s)[0]
  54. if charset:
  55. value = value.decode(charset)
  56. return value
  57.  
  58. #decode_header()返回一个list,因为像Cc、Bcc这样的字段可能包含多个邮件地址,所以解析出来的会有多个元素。上面的代码我们偷了个懒,只取了第一个元素。
  59. #文本邮件的内容也是str,还需要检测编码,否则,非UTF-8编码的邮件都无法正常显示:
  60. def guess_charset(msg):
  61. # 先从msg对象获取编码:
  62. charset = msg.get_charset()
  63. if charset is None:
  64. # 如果获取不到,再从Content-Type字段获取:
  65. content_type = msg.get('Content-Type', '').lower()
  66. pos = content_type.find('charset=')
  67. if pos >= 0:
  68. charset = content_type[pos + 8:].strip()
  69. return charset

Python——POP3邮件协议的更多相关文章

  1. 邮件协议POP3/IMAP/SMTP服务的区别

    2016年09月09日 09時51分 wanglinqiang整理 通过网上查找的资料和自己的总结完成了下面的文章,看完之后相信大家对这三种协议会有更深入的理解.如有错误的地方望指正. POP3 PO ...

  2. centos 邮件服务 腾讯企业邮箱(免费) 使用iRedmail 需要有公网的centos主机 发邮件协议:smtp 端口25 收邮件协议:pop3 端口110 iredmail安装配置 使用邮箱系统 第三十一节课

    centos   邮件服务  腾讯企业邮箱(免费) 使用iRedmail 需要有公网的centos主机 发邮件协议:smtp 端口25  收邮件协议:pop3 端口110  iredmail安装配置 ...

  3. 如何用python进行邮件发送

    使用Python调用邮件服务器发送邮件,使用的协议是SMTP(Simple Mail Transfer Protocol),下图为使用TCP/IP基于SMTP发送邮件的过程示意图: SMTP协议工作原 ...

  4. python SMTP邮件发送(转载)

    Python SMTP发送邮件 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. py ...

  5. 基于Lumisoft.NET组件的POP3邮件接收和删除操作(转载)

    Lumisoft.NET组件是一个非常强大的邮件发送.邮件接收等功能的开源组件,一般用它来处理邮件的相关操作,是非常合适的.之前也写过一些该组件的随笔文章,不过主要是利用来发送邮件居多,最近由于项目需 ...

  6. 基于Lumisoft.NET组件的POP3邮件接收和删除操作

    From: http://www.cnblogs.com/wuhuacong/archive/2013/05/06/3063093.html Lumisoft.NET组件是一个非常强大的邮件发送.邮件 ...

  7. python发邮件遇到的端口号问题

    在学习使用python发邮件的过程中, 遇到了一个问题:由于测试的时候使用的是QQ邮箱,要求必须使用SSL/TLS加密,所以有了下面的代码, from email.mime.text import M ...

  8. C#邮件接收系统核心代码(接收POP3邮件IMAP邮件)

    /* * Created by SharpDevelop. * User: Administrator * Date: 2013/11/18 * Time: 20:55 * * To change t ...

  9. 邮件协议(SMTP)性能测试总结(Foxmail邮箱)

    先介绍一下邮件协议SMTP的工作机制(连接和发送过程),用wireshark工具抓包进行分析,如下: SMTP协议的工作机制(连接和发送过程): 1.建立TCP连接,并将邮件服务器地址给客户端: 2. ...

随机推荐

  1. GFF高仿QQ客户端及服务器

    一.GFF简介 GFF是仿QQ界面,通信基于SAEA.MessageSocket.SAEA.Http.SAEA.MVC实现包含客户端和服务器的程序,源码完全公开,项目源码地址:https://gith ...

  2. CentOS7 安装MySQL5.6

    1.  检查是否有MariaDB和MySQL,如果有则卸载掉 [root@--- ~]# rpm -qa | egrep "mariadb|mysql" mariadb-serve ...

  3. Grafana+Telegraf+Influxdb监控Tomcat集群方案

    前言 前一段时间自家养的几只猫经常出问题,由于没有有效的监控预警手段,以至于问题出现或者许久一段时间才会被通知到.凌晨一点这个锅可谁都不想背,为此基于目前的情况搭建了以下这么一套监控预警系统. 相关软 ...

  4. 网络爬虫之Url含有中文如何转码

    一:背景 今天在使用Jsoup对一个网站进行数据爬取,发现爬取内容为该搜索结果是0条,请求头啥的都填好,利用Chrome开发者工具发现请求Url路径不含中文,抱着试一试的态度,我复制此段非中文参数进行 ...

  5. 【Python撩妹合集】微信聊天机器人,推送天气早报、睡前故事、精美图片分享

    福利时间,福利时间,福利时间 如果你还在为不知道怎么撩妹而烦恼,不知道怎么勾搭小仙女而困惑,又或者不知道怎么讨女朋友欢心而长吁短叹. 那么不要犹豫徘徊,往下看.接下来我会分享怎么使用 Python 实 ...

  6. Item 20: 使用std::weak_ptr替换会造成指针悬挂的类std::shared_ptr指针

    本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 矛盾的是,我们很容易就能创造出一个和std::shared_ptr ...

  7. Item 13: 比起iterator优先使用const_iterator

    本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 STL中的const_iterator等价于pointers-to ...

  8. 跨域访问-需要设置HTTP响应标头

    前提:服务端网站的配置(被请求的网站) 1.需要在IIS服务器站点的功能视图中设置HTTP响应标头: 2.双击“HTTP响应标头”进入设置界面 3.点击右侧添加按钮弹出窗口 4.填入需要设置的信息 名 ...

  9. 小程序解决方案 Westore - 组件、纯组件、插件开发

    数据流转 先上一张图看清 Westore 怎么解决小程序数据难以管理和维护的问题: 非纯组件的话,可以直接省去 triggerEvent 的过程,直接修改 store.data 并且 update,形 ...

  10. CodeForces 719A. Vitya in the Countryside

    链接:[http://codeforces.com/group/1EzrFFyOc0/contest/719/problem/A] 题意: 给你一个数列(0, 1, 2, 3, 4, 5, 6, 7, ...