【Python3】POP3协议收邮件

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

时间: 2024-10-13 16:00:38

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

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

最近在用outlook同步邮件.对邮件协议有一点兴趣.于是就去收集了一些资料,学习了一下如何通过.net来实现邮件的收发.    一:SMTP协议  1.什么是SMTP协议:       SMTP目前已是事实上的在Internet传输E-Mail的标准,是一个相对简单的基于文本的协议.在其之上指定了一条消息的一个或多个接收者(在大多数情况下被确定是存在的),然后消息文本就传输了.可以很简单地通过Telnet程序来测试一个SMTP服务器,SMTP使用TCP端口25.要为一个给定的域名决定一个SMT

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

本文转自https://blog.csdn.net/qq_15646957/article/details/52544099 感谢作者 一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在Internet很多提供邮件服务的厂商:sina.sohu.163等等他们都有自己的邮件服务器. 这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中. 电子邮箱(E

C#_收邮件

用visual c#实现邮件接收程序_邮件服务器 本文通过运用C#来实现一个基于POP3协议的邮件接收程序来向大家展示C#网络编程的功能强大,同时也向大家介绍一下基于POP3协议的电子邮件接收原理. 首先我向大家介绍邮件接收的基本原理: 一开始便是客户端与服务器的连接.不过,在客户端连接到服务器之前,注意把端口设为POP3协议默认的110号. 客户端连接服务器成功后,服务器会返回以下信息: +OK…… 字符+OK是POP3协议的返回信息.它的回应信息不像SMTP协议那样用丰富多变的数字表示,只有

C#收邮件

用visual c#实现邮件接收程序_邮件服务器 本文通过运用C#来实现一个基于POP3协议的邮件接收程序来向大家展示C#网络编程的功能强大,同时也向大家介绍一下基于POP3协议的电子邮件接收原理. 首先我向大家介绍邮件接收的基本原理: 一开始便是客户端与服务器的连接.不过,在客户端连接到服务器之前,注意把端口设为POP3协议默认的110号. 客户端连接服务器成功后,服务器会返回以下信息: +OK…… 字符+OK是POP3协议的返回信息.它的回应信息不像SMTP协议那样用丰富多变的数字表示,只有

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

问题: 公司之前可以通过POP3协议收发邮件,因而在SoapUI中用JavaMail可以读取邮件,后来配置了Office 365,POP3协议端口不再开放,邮件全部读取失败,报login timeout,需要改用EWS(Exchange Web Service)协议. 参考 : http://blog.csdn.net/yangcheng33/article/details/55049629 需要导入此JAR包 : ews-java-api-2.0.jar import java.net.URI

认真对待 Python3 收邮件

前言 准备 初体验 试水 划水 蹚水 潜水 拓展 前言 之前老是用Python发邮件,用起来挺方便的.但是一直没实现用Python收邮件,最近忙着笔试面试,但是又不能时刻打开浏览器,刷手机看看有没有新邮件(尤其是有没有关于面试,笔试通知的邮件)啊.所以写个脚本来做下定时任务,一旦有相关的主题邮件,结合GUI控件,声音组件,给出提醒. 想来还是不错的. 收邮件其实是被Python内置支持的,名为poplib.安装了Python的话,就会默认存在于标准库中,用起来也很方便.下面就一步步的来实现今天的

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

1.实现SMTP协议的类dsmtp.cls.php: <?php          // 通过socket实现SMTP协议的功能// version: 1.1// author : DCC// create : 2014-01-17 23:38:24// modify : 2014-01-18 16:59:04// more   : http://www.thinkful.cn/archives/389.html          class Dmail_smtp{               

Java Mail---SMTP、POP3协议-DOS下手动收发邮件演示过程

转载请注明出处: http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] E-Mail协议简介: 邮件服务器,按照提供的服务类型,可以分为发送邮件的服务器我接收邮件的服务器. 发送邮件的服务器使用发送协议,现在常用的是SMTP协议.所以,通常发邮件的服务器也称为SMTP服务器. 接收邮件的服务器使用接收协议,现在常用的是POP3协议或IMAP协议,所以通常也被称为POP3或IMAP服务器. 目前经常见到的服务器为SMTP和POP3服务器.如大家在注册了

VBA通过HTTP协议实现邮件轨迹跟踪查询

作者:iamlasong 1.接口说明 通过互联网访问,接口调用为HTTP请求的方式,每一次由用户发起的HTTP请求,需要设置验证信息,具体方法是,在HTTP Header部分增加version及authenticate属性,属性值在联调测试之前由总部提供. 接口调用地址:http:// IP:Port/invoke/path/{mail_num} 接口调用方式:HTTP GET方式,通过HTTP GET发起请求,使用真实邮件号替换{mail_num} 编码格式:UTF-8 接口返回数据格式: