初学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()

【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. Appium的ios配置

    automationName  text        XCUITest platformName             text          iOS platformVersion      ...

  2. 51nod1242斐波那契数列的第N项 【矩阵快速幂】

    斐波那契数列的定义如下: F(0) = 0 F(1) = 1 F(n) = F(n - 1) + F(n - 2) (n >= 2) (1, 1, 2, 3, 5, 8, 13, 21, 34, ...

  3. 将项目上传到Github之使用git命令上传

    1,先从GitHub网页上建立一个数据仓库 2,安装git 下载地址:https://www.git-scm.com/download/win 3,找到本地要上传的项目目录,右键点击Git Bash ...

  4. 渗透实战(周四):CSRF跨站域请求伪造

    上图是广东外语外贸大学北校区内MBA中心旁边酒店房间的Wi-Fi网络环境,假设我们的Kali攻击机连入到SSID为414(房间号)的Wi-Fi网络,其IP地址:192.168.43.80 .同一Wi- ...

  5. PHP学习总结(13)——PHP入门篇之常量

    1.什么是常量 什么是常量?常量可以理解为值不变的量(如圆周率):或者是常量值被定义后,在脚本的其他任何地方都不可以被改变.PHP中的常量分为自定义常量和系统常量(后续小节会详细介绍). 自定义常量是 ...

  6. CentOS6.2上安装Oracle10g报ins_emdb.mk错误处理方法

    oracle安装过程报ins_emdb.mk错误,此时继续点击“continue”即可,待Oracle完成安装后,再手工执行相应脚本完成链接即可 在CentOS6.2操作系统上,安装Oracle10g ...

  7. spring boot @Transactional事物处理

    spring boot 添加事物使用 @Transactional注解 简单使用 在启动类上方添加 @EnableTransactionManagement注解 使用时直接在类或者方法上使用 @Tra ...

  8. 关于Mysql Enterprise Audit plugin的使用

    正如之前看到的一篇文章,假设想要知道是谁登陆了你的数据库server,干了什么东西,那么你须要使用Mysql Enterprise Audit plugin. 以下介绍一下Mysql Enterpri ...

  9. eclipse快捷键,比較有用

    1:Ctrl+Pg Up   向左切换选项卡   , 切换到头显示隐藏选项卡(等于Ctrl+e). 2:Ctrl+Pg Dn  向右切换选项卡    , 切换到头显示隐藏选项卡(等于Ctrl+e). ...

  10. luogu3811 【模板】乘法逆元

    题目大意:给出n,求1~n所有数的乘法逆元. 乘法逆元的概念是:如果b*rev(b)≡1 (mod p),p与b互质,则rev(b)就是b的模p乘法逆元.乘法逆元往往用于除法取模. 具体操作详见htt ...