初学Python3,做一个email的例子,虽然知道做的很渣渣,还是分享一下吧

POP3协议

POP3全称Post Official Protocol3,即邮局协议的第三个版本,它规定了怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议,它是因特网电子协议的第一个离线标准,POP3允许用户从服务器上将邮件存储到本地主机(个人计算机),同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的邮件服务器,用来接收电子邮件。

Python3支持POP3的模块是poplib:建立连接(初始化POP3时进行)、用户名/密码认证、获取邮件信息/下载邮件/删除邮件等处理、退出并更新处理。

POP3的协议模型及处理是非常直观的,获取到邮件以后的解析消息才是major problem!

代码如下 

  1. import poplib
  2. import sys
  3. from importlib import reload
  4. from email.parser import Parser
  5. from email.parser import BytesParser
  6. from email.header import decode_header
  7. from email.utils import parseaddr
  8. import email.iterators
  9.  
  10. #解析消息头中的字符串
  11. def decode_str(s):
  12.     value, charset = decode_header(s)[0]
  13.     if charset:
  14.         value = value.decode(charset)
  15.     return value
  16.  
  17. #将邮件附件或内容保存至文件
  18. #即邮件中的附件数据写入附件文件
  19. def savefile(filename, data, path):
  20.     try:
  21.         filepath = path + filename
  22.         print('Save as: ' + filepath)
  23.         f = open(filepath, 'wb')
  24.     except:
  25.         print(filepath + ' open failed')
  26.         #f.close()
  27.     else:
  28.         f.write(data)
  29.         f.close()
  30.  
  31. #获取邮件的字符编码,首先在message中寻找编码,如果没有,就在header的Content-Type中寻找
  32. def guess_charset(msg):
  33.     charset = msg.get_charset()
  34.     if charset is None:
  35.         content_type = msg.get('Content-Type', '').lower()
  36.         pos = content_type.find('charset=')
  37.         if pos >= 0:
  38.             charset = content_type[pos+8:].strip()
  39.     return charset
  40.  
  41. #解析邮件的函数,首先打印收件人、发件人、标题
  42. #然后调用message的walk循环处理邮件中的每一个子对象(包括文本、html、附件一次或多次)
  43. #邮件头属性中的filename存在则该子对象是附件,对附件名称进行编码并将附件下载到指定目录
  44. #由于网络上传输的邮件都是编码以后的格式,需要在get_payload的时候指定decode=True来转换成可输出的编码
  45. #如果邮件是text或者html格式,打印格式并输出转码以后的子对象内容
  46. def print_info(msg):
  47.     for header in ['From', 'To', 'Subject']:
  48.         value = msg.get(header, '')
  49.         if value:
  50.             if header == 'Subject':
  51.                 value = decode_str(value)
  52.             else:
  53.                 hdr, addr = parseaddr(value)
  54.                 name = decode_str(addr)
  55.                 value = name + ' < ' + addr + ' > '
  56.         print(header + ':' + value)
  57.     for part in msg.walk():
  58.         filename = part.get_filename()
  59.         content_type = part.get_content_type()
  60.         charset = guess_charset(part)
  61.         if filename:
  62.             filename = decode_str(filename)
  63.             data = part.get_payload(decode = True)
  64.             if filename != None or filename != '':
  65.                 print('Accessory: ' + filename)
  66.                 savefile(filename, data, mypath)
  67.         else:
  68.             email_content_type = ''
  69.             content = ''
  70.             if content_type == 'text/plain':
  71.                 email_content_type = 'text'
  72.             elif content_type == 'text/html':
  73.                 email_content_type = 'html'
  74.             if charset:
  75.                 content = part.get_payload(decode=True).decode(charset)
  76.             print(email_content_type + ' ' + content)
  77.  
  78. email = 'email_name@163.com'
  79. password = 'email_passwd'
  80. pop3_server = 'pop.163.com'
  81. mypath = 'D://email/'
  82.  
  83. server = poplib.POP3(pop3_server, 110)
  84. #print(server.getwelcome())
  85. server.user(email)
  86. server.pass_(password)
  87. print('Message: %s. Size: %s' % server.stat())
  88.  
  89. resp, mails, objects = server.list()
  90. #print(mails)
  91. index = len(mails)
  92. #取出某一个邮件的全部信息
  93. resp, lines, octets = server.retr(index)
  94. #邮件取出的信息是bytes,转换成Parser支持的str
  95. lists = []
  96. for e in lines:
  97.     lists.append(e.decode())
  98. msg_content = '\r\n'.join(lists)
  99. msg = Parser().parsestr(msg_content)
  100. print_info(msg)
  101. #server.dele(index)
  102. #提交操作信息并退出
  103. server.quit()

【Python3】POP3协议收邮件的更多相关文章

  1. POP3是收邮件的协议,SMTP是发邮件的协议,IMAP是一种邮箱通信协议。

    我也是第一次接触这种服务,是因为我自己在做一个小小的自动推送天气情况到自己邮箱.所以才碰到这个的/ 看一下标题,我们可以先这样理解. POP3(Post Office Protocol - Versi ...

  2. C#基础--基于POP3协议的邮件接收和基于STMP的邮件发送

    最近在用outlook同步邮件.对邮件协议有一点兴趣.于是就去收集了一些资料,学习了一下如何通过.net来实现邮件的收发.    一:SMTP协议  1.什么是SMTP协议:       SMTP目前 ...

  3. Loadrunner:POP3协议录制收信,使用foxmail录制到的脚本为空

    以下录制方法使得录制到的脚本为空: (1)打开Virtual User Generator,点击“新建Vuser脚本”,在弹出的向导页面,选择“新建单协议脚本”,选择“POP3”协议,并确定 (2)在 ...

  4. 邮件实现详解(二)------手工体验smtp和pop3协议

    上篇博客我们简单介绍了电子邮件的发送和接收过程,对参与其中的邮件服务器,邮件客户端软件,邮件传输协议也有简单的介绍.我们知道电子邮件需要在邮件客户端和邮件服务器之间,以及两个邮件服务器之间进行传递必须 ...

  5. SMTP协议及POP3协议-邮件发送和接收原理(转)

    本文转自https://blog.csdn.net/qq_15646957/article/details/52544099 感谢作者 一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 ...

  6. 使用POP3协议接收并解析电子邮件(全)

    package org.yangxin.study.jm; import java.io.BufferedInputStream; import java.io.BufferedOutputStrea ...

  7. 使用 EWS(Exchange Web Service)协议读取邮件、发送邮件

    问题: 公司之前可以通过POP3协议收发邮件,因而在SoapUI中用JavaMail可以读取邮件,后来配置了Office 365,POP3协议端口不再开放,邮件全部读取失败,报login timeou ...

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

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

  9. PHP+socket+SMTP、POP3协议发送、接收邮件

    .实现SMTP协议的类dsmtp.cls.php:<?php            , $webname=).);     } } .实现POP3协议的类dpop3.cls.php: <? ...

随机推荐

  1. python 遍历xml所有节点

    1.xml文件 2.代码 #coding:utf-8 import xml import xml.etree.ElementTree as ET """ 实现从xml文件 ...

  2. S-HR二开基础

    检测是否某个类部署上去了:http://10.3.0.115:6888/easportal/tools/getclassurl.jsp?className=com.kingdee.eas.hr.ser ...

  3. 网络安全web部分

    Web安全 一.    SQL注入 1)    原理 通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序 ...

  4. 61.index CUD

    主要知识点 索引CUD     一.创建索引的语法     PUT /my_index { "settings": { ... any settings ... }, " ...

  5. android 权限问题分析

    Android系统是运行在Linux内核上的,Android与Linux分别有自己的一套严格的安全及权限机制, 很多像我这样的新手,尤其是习惯了windows低安全限制的用户,很容易在这方面弄混淆,下 ...

  6. (25)Spring Boot使用自定义的properties【从零开始学Spring Boot】

    spring boot使用application.properties默认了很多配置.但需要自己添加一些配置的时候,我们应该怎么做呢. 若继续在application.properties中添加 如: ...

  7. Spring注解@Repository、@Service、@Controller、@Component

    继前几章所讲解的注解中: http://www.cnblogs.com/EasonJim/p/6892280.html http://www.cnblogs.com/EasonJim/p/689974 ...

  8. HDU 3644

    模拟退火算法.... 这道题,呃.我怎么感觉他就是随机的.同一个代码,时而AC,时而WA.其实还真的是随机的.呵呵呵呵呵...因为下降火太快了,没办法,而降得慢又会...TLE,虽然精度提高了. 敢问 ...

  9. 使用 F# 列表

    使用 F# 列表 在 C# 中使用 F# 的列表,是全然可能的,可是,我建议不要用,由于,仅仅要再做一点,就会使事情在 C# 看来更加自然.比如,把列表转换成数组非常easy.用List.toArra ...

  10. ZOJ2724_Windows Message Queue(STL/优先队列)

    解题报告 题意: 看输入输出就非常明确. 思路: 优先队列. #include <algorithm> #include <iostream> #include <cst ...