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

POP3协议

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

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

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

代码如下 

import poplib
import sys
from importlib import reload
from email.parser import Parser
from email.parser import BytesParser
from email.header import decode_header
from email.utils import parseaddr
import email.iterators

#解析消息头中的字符串
def decode_str(s):
    value, charset = decode_header(s)[0]
    if charset:
        value = value.decode(charset)
    return value

#将邮件附件或内容保存至文件
#即邮件中的附件数据写入附件文件
def savefile(filename, data, path):
    try:
        filepath = path + filename
        print('Save as: ' + filepath)
        f = open(filepath, 'wb')
    except:
        print(filepath + ' open failed')
        #f.close()
    else:
        f.write(data)
        f.close()

#获取邮件的字符编码,首先在message中寻找编码,如果没有,就在header的Content-Type中寻找
def guess_charset(msg):
    charset = msg.get_charset()
    if charset is None:
        content_type = msg.get('Content-Type', '').lower()
        pos = content_type.find('charset=')
        if pos >= 0:
            charset = content_type[pos+8:].strip()
    return charset

#解析邮件的函数,首先打印收件人、发件人、标题
#然后调用message的walk循环处理邮件中的每一个子对象(包括文本、html、附件一次或多次)
#邮件头属性中的filename存在则该子对象是附件,对附件名称进行编码并将附件下载到指定目录
#由于网络上传输的邮件都是编码以后的格式,需要在get_payload的时候指定decode=True来转换成可输出的编码
#如果邮件是text或者html格式,打印格式并输出转码以后的子对象内容
def print_info(msg):
    for header in ['From', 'To', 'Subject']:
        value = msg.get(header, '')
        if value:
            if header == 'Subject':
                value = decode_str(value)
            else:
                hdr, addr = parseaddr(value)
                name = decode_str(addr)
                value = name + ' < ' + addr + ' > '
        print(header + ':' + value)
    for part in msg.walk():
        filename = part.get_filename()
        content_type = part.get_content_type()
        charset = guess_charset(part)
        if filename:
            filename = decode_str(filename)
            data = part.get_payload(decode = True)
            if filename != None or filename != '':
                print('Accessory: ' + filename)
                savefile(filename, data, mypath)
        else:
            email_content_type = ''
            content = ''
            if content_type == 'text/plain':
                email_content_type = 'text'
            elif content_type == 'text/html':
                email_content_type = 'html'
            if charset:
                content = part.get_payload(decode=True).decode(charset)
            print(email_content_type + ' ' + content)

email = 'email_name@163.com'
password = 'email_passwd'
pop3_server = 'pop.163.com'
mypath = 'D://email/'

server = poplib.POP3(pop3_server, 110)
#print(server.getwelcome())
server.user(email)
server.pass_(password)
print('Message: %s. Size: %s' % server.stat())

resp, mails, objects = server.list()
#print(mails)
index = len(mails)
#取出某一个邮件的全部信息
resp, lines, octets = server.retr(index)
#邮件取出的信息是bytes,转换成Parser支持的str
lists = []
for e in lines:
    lists.append(e.decode())
msg_content = '\r\n'.join(lists)
msg = Parser().parsestr(msg_content)
print_info(msg)
#server.dele(index)
#提交操作信息并退出
server.quit()

转载于:https://www.cnblogs.com/learn-my-life/p/4007007.html

【Python3】POP3协议收邮件相关推荐

  1. python pop3_PYTHON学习:使用POP3协议下载邮件

    以前使用电脑端访问邮箱时,知道有POP3.SMTP协议,随首技术的发展,最近又有了很多种选择,尤其是手机端,看到了每多种连接方式,比如IMAP.EXCHANGE方式,邮件还带同步的,比如电脑端改变了邮 ...

  2. 【Python学习笔记】(十)邮件处理:email模块;SMTP协议(smtplib模块);POP3协议(poplib模块);IMAP协议(imaplib模块)

    电子邮件,简称电邮,是指一种由寄件人将数字信息发送给一个人或者多个人的信息交换方式. 电邮包括三个部分:消息的"信封".邮件标头.邮件内容. 电邮的格式:用户名@主机名(域名).电 ...

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

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

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

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

  5. 因特服务器协议,Internet邮件服务协议

    1 SMTP协议 简单邮件传输协议(Simple Mail Transfer Protocol,简称 SMTP)由 RFC 821定义,它是最早出现的,也是被普遍使用的最基本的 Internet邮件服 ...

  6. javamail pop3模式收取邮件

    pop3协议收取邮件inbox.getMessages()是一次性读取所有邮件,如果邮箱邮件过多的话,会非常耗时. 还有一个方法是Folder.getMessages(int start, int e ...

  7. 应用层:电子邮件、MIME、SMTP协议、POP3协议

    应用层:电子邮件.MIME.SMTP协议.POP3协议 1 邮件发送与接收 1.1 邮件发送和接收的具体过程 2 简单邮件传送协议SMTP工作原理 3 电子邮件信息格式 4 MIME 5 邮件读取协议 ...

  8. python3收邮件_认真对待 Python3 收邮件

    前言 之前老是用Python发邮件,用起来挺方便的.但是一直没实现用Python收邮件,最近忙着笔试面试,但是又不能时刻打开浏览器,刷手机看看有没有新邮件(尤其是有没有关于面试,笔试通知的邮件)啊.所 ...

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

    1.实现SMTP协议的类dsmtp.cls.php: <?php            // 通过socket实现SMTP协议的功能 // version: 1.1 // author : DC ...

最新文章

  1. Java Magic. Part 5: SecurityManager
  2. HTML特殊字符大全2
  3. python string模块template_Python - 定制pattern的string模板(template) 详解
  4. java textfield赋值_Java中怎么把运行结果显示到textfield中
  5. Android 屏幕适配攻略(三)单位dp与sp
  6. 对抗神经机器翻译:GAN+NMT 模型,中国研究者显著提升机翻质量
  7. PhpStorm下Laravel代码智能提示
  8. MYSQL锁表的用法,防止并发情况下的重复数据
  9. API文档和代码片段管理器:​​​​Dash
  10. 如何在Mac上恢复已删除或丢失的分区
  11. 前端进阶篇——02、CSS和JS
  12. 2014 Unity 璀璨星空夜
  13. cdLinux显示“没有发现无限网卡!”
  14. 【影像配准】配准之棋盘网格图(镶嵌图像)(附有 C++ 代码)
  15. 计算机国家级论文,计算机类期刊汇总(核心期刊,国家级期刊)
  16. 【2019-2020春学期】数据库作业13:SQL练习8 - CHECK / CONSTRAINT / TRIGGER / PROCEDURE/ FUNCTION
  17. mqtt协议 阿里云物联网平台
  18. [组图]国外专家谈游戏制作
  19. vivado ILA核使用教程
  20. c#控件弹幕效果_仿B站弹幕,极简Android开源弹幕控件:EasyDanmaku

热门文章

  1. bettertouchtool闪退_BetterTouchTool for Mac 3.238 无闪退 触控板增强工具
  2. 腐蚀国内稳定服务器_工控机箱和服务器机箱区别在哪里
  3. springboot 上传文件解析入库_SpringBoot + easyexcel + WebUploader 实现文件上传并解析
  4. c++语言 tcp例子,C++中TCP通信实现文件传输
  5. mybatis不等于某个字符串的值_MyBatis 的 4 个妙用,别再踩坑了!
  6. linux删除权限命令,管理使用者和设立权限的命令
  7. 计算机组成原理第六章难,计算机组成原理第六章答案
  8. visual报表服务器项目,为 Visual Studio ALM 创建报表服务器项目
  9. Python小白的数学建模课-04.整数规划
  10. kali linux子远程桌面,适用于kali linux的远程桌面开启方法(从windows xp 远程登录到kali linux )...