广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python实现邮件自动下载的示例详解
  • 902
分享到

Python实现邮件自动下载的示例详解

2024-04-02 19:04:59 902人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

开始码代码之前,我们先来了解一下三种邮件服务协议: 1、SMTP协议 SMTP(Simple Mail Transfer Protocol),即简单邮件传输协议。相当于中转站,将邮件

开始码代码之前,我们先来了解一下三种邮件服务协议:

1、SMTP协议

SMTP(Simple Mail Transfer Protocol),即简单邮件传输协议。相当于中转站,将邮件发送到客户端。

2、POP3协议

POP3(Post Office Protocol 3),即邮局协议的第3个版本,是电子邮件的第一个离线协议标准。该协议把邮件下载到本地计算机,不与服务器同步,缺点是更易丢失邮件或多次下载相同的邮件。

3、IMAP协议

IMAP(Internet Mail Access Protocol),即交互式邮件存取协议。该协议连接远程邮箱直接操作,与服务器内容同步。

然后介绍一下email包

这个包的中心组件是代表电子邮件消息的“对象模型”。 应用程序主要通过在 message 子模块中定义的对象模型接口与这个包进行交互。 应用程序可以使用此 api 来询问有关现有电子邮件的问题、构造新的电子邮件,或者添加或移除自身也使用相同对象模型接口的电子邮件子组件。 也就是说,遵循电子邮件消息及其 MIME 子组件的性质,电子邮件对象模型是所有提供 EmailMessage API 的对象所构成的树状结构。

接下来我们通过具体的代码实现一个登录邮箱客户端,下载邮件,解析邮件附件内容的功能。

首先我们需要定义一个邮件解析的类,该类需要三个变量:

1、邮箱所属的imap服务地址;

2、邮箱账号;

3、邮箱密码【注:不同邮箱需要不同的安全策略,例如qq邮箱需要短信验证,获取登录授权码,而不是明文密码去登录远程客户端】

class Email_parse:

    def __init__(self,remote_server_url,email_url,passWord):
    	# imap服务地址
        self.remote_server_url = remote_server_url
        # 邮箱账号
        self.email_url = email_url
        # 邮箱密码
        self.password = password

然后定义类中入口函数,登录远程,默认获取第一页所有的邮件。我们获取邮件的主题,并打印出来【不同邮件主题的编码可能不同,二进制需要转码才能正确显示】

    def main_parse_Email(self):
        """入口函数,登录imap服务"""
        server = imaplib.IMAP4_SSL(self.remote_server_url, 993)
        server.login(self.email_url, self.password)
        server.select('INBOX')
        status,data = server.search(None,"ALL")
        if status != 'OK':
            raise Exception('read email error')
        emailids = data[0].split()
        mail_counts = len(emailids)
        print("count:",mail_counts)
        # 邮件的遍历是按时间从后往前,这里我们选择最新的一封邮件
        for i in range(mail_counts - 1, mail_counts - 2, -1):
            status, edata = server.fetch(emailids[i], '(RFC822)')
            msg = email.message_from_bytes(edata[0][1])
            #获取邮件主题title
            subject = email.header.decode_header(msg.get('subject'))
            if type(subject[-1][0]) == bytes:
                title = subject[-1][0].decode(str(subject[-1][1]))
            elif type(subject[-1][0]) == str:
                title = subject[-1][0]
            print("title:", title)

其中,msg变量保存的就是邮件的主体,接下来因为会重复用到msg和tilte,我们将构造一个类函数返回msg和title。

    def get_email_title(msg):
        subject = email.header.decode_header(msg.get('subject'))
        if type(subject[-1][0]) == bytes:
            title = subject[-1][0].decode(str(subject[-1][1]))
        elif type(subject[-1][0]) == str:
            title = subject[-1][0]
        print("title:", title)
        return title

解析邮件,我们分为两部分,邮件正文【html】和附件【xlsx等】,判断有附件,我们就保存到固定的路径下。表格的解析不再赘述了,pandas之类的包足以搞定。

    def get_att(msg):
        """获取附件并下载"""
        filename = Email_parse.get_email_name(msg)
        for part in msg.walk():
            file_name = part.get_param("name")
            if file_name:
                data = part.get_payload(decode=True)
                if data != None:
                    att_file = open('./src/' + filename, 'wb')
                    att_file.write(data)
                    att_file.close()
                else:
                    pass

邮件正文内容,我们直接解析html,将文本内容直接保存到.txt文件中,方便读取。

    def get_text_from_HTML(msg):
        """获取邮件中的html"""
        filename = Email_parse.get_email_name(msg)
        current_title = Email_parse.get_email_title(msg)
        print("filename:",filename,type(filename))
        for part in msg.walk():
            if not part.is_multipart():
                result = part.get_payload(decode=True)
                result = result.decode('gbk')
                f = open(f'./src/{current_title}.txt','w')
                f.write(result)
                f.close()
                return result

完整代码如下:

import email
import imaplib
from email.header import decode_header
import pandas as pd
import datetime


class Email_parse:
    def __init__(self,remote_server_url,email_url,password):
        self.remote_server_url = remote_server_url
        self.email_url = email_url
        self.password = password

    def get_att(msg):
        filename = Email_parse.get_email_name(msg)
        for part in msg.walk():
            file_name = part.get_param("name")
            if file_name:
                data = part.get_payload(decode=True)
                if data != None:
                    att_file = open('./src/' + filename, 'wb')
                    att_file.write(data)
                    att_file.close()
                else:
                    pass

    def get_email_title(msg):
        subject = email.header.decode_header(msg.get('subject'))
        if type(subject[-1][0]) == bytes:
            title = subject[-1][0].decode(str(subject[-1][1]))
        elif type(subject[-1][0]) == str:
            title = subject[-1][0]
        print("title:", title)
        return title


    def get_email_name(msg):
        for part in msg.walk():
            file_name = part.get_param("name")
            if file_name:
                h = email.header.Header(file_name)
                dh = email.header.decode_header(h)
                filename = dh[0][0]
                if dh[0][1]:
                    value, charset = decode_header(str(filename, dh[0][1]))[0]
                    if charset:
                        filename = value.decode(charset)
                        print("附件名称:", filename)
                        return filename


    def main_parse_Email(self):
        server = imaplib.IMAP4_SSL(self.remote_server_url, 993)
        server.login(self.email_url, self.password)
        server.select('INBOX')
        status,data = server.search(None,"ALL")
        if status != 'OK':
            raise Exception('read email error')
        emailids = data[0].split()
        mail_counts = len(emailids)
        print("count:",mail_counts)
        for i in range(mail_counts - 1, mail_counts - 2, -1):
            status, edata = server.fetch(emailids[i], '(RFC822)')
            msg = email.message_from_bytes(edata[0][1])
            subject = email.header.decode_header(msg.get('subject'))
            if type(subject[-1][0]) == bytes:
                title = subject[-1][0].decode(str(subject[-1][1]))
            elif type(subject[-1][0]) == str:
                title = subject[-1][0]
            print("title:", title)
            Email_parse.get_att(msg)
            Email_parse.get_text_from_HTML(msg)


    def get_text_from_HTML(msg):
        filename = Email_parse.get_email_name(msg)
        current_title = Email_parse.get_email_title(msg)
        print("filename:",filename,type(filename))
        for part in msg.walk():
            if not part.is_multipart():
                result = part.get_payload(decode=True)
                result = result.decode('gbk')
                f = open(f'./src/{current_title}.txt','w')
                f.write(result)
                f.close()
                return result

if __name__ == "__main__":
    remote_server_url = 'imap.qq.com'
    email_url = "*********@qq.com"
    password = "**********"
    demo = Email_parse(remote_server_url,email_url,password)
    demo.main_parse_Email()

运行结果:

以上就是python实现邮件自动下载的示例详解的详细内容,更多关于Python邮件自动下载的资料请关注编程网其它相关文章!

--结束END--

本文标题: Python实现邮件自动下载的示例详解

本文链接: https://www.lsjlt.com/news/119309.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python实现邮件自动下载的示例详解
    开始码代码之前,我们先来了解一下三种邮件服务协议: 1、SMTP协议 SMTP(Simple Mail Transfer Protocol),即简单邮件传输协议。相当于中转站,将邮件...
    99+
    2022-11-11
  • 简单介绍Python实现邮件自动下载的示例
    本篇文章给大家带来了关于Python的相关知识,详细介绍了如何利用Python语言实现邮件自动下载以及附件解析功能,文中的示例代码讲解详细,感下面一起来看一下,希望对大家有帮助。【相关推荐:Python3视频教程 】开始码代码之前,我们先来...
    99+
    2022-08-17
    python
  • Python如何实现邮件自动下载
    本篇内容介绍了“Python如何实现邮件自动下载”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!开始码代码之前,我们先来了解一下三种邮件服务协...
    99+
    2023-07-02
  • Python实现邮件发送功能的示例详解
    想实现发送邮件需要经过以下几步: 1、登录邮件服务器 2、构造符合邮件协议规则要求的邮件内容 3、发送 Python对SMTP支持有smtplib和email两个模块,email负责...
    99+
    2022-11-13
    Python邮件发送 Python邮件
  • Python实现自动化邮件发送过程详解
    使用Python实现自动化邮件发送,可以让你摆脱繁琐的重复性业务,可以节省非常多的时间。 操作前配置(以较为复杂的QQ邮箱举例,其他邮箱操作类似) 单击设置-账号,滑倒下方协议处,...
    99+
    2022-11-12
  • go smtp实现邮件发送示例详解
    目录smtp指令go demosdk中SendMail方法DialAndSend实现smtp指令 书接上文邮件实现详解,这里我们及我们简单复习一下smtp的指令如下: telnet ...
    99+
    2022-11-13
  • python使用imap-tools模块下载邮件附件的示例
    最近在做一些email相关的办公自动化项目,发现一个第三方模块imap-tools不错, 网上没有啥相关介绍,所以记录下来. 环境: python3.8; imap-tools 0....
    99+
    2022-11-12
  • python实现自动下载sftp文件
    本文实例为大家分享了python实现自动下载sftp文件的具体代码,供大家参考,具体内容如下 实现功能:利用python自动连接sftp,并下载sftp中指定目录下的所有目录及文件 ...
    99+
    2022-11-12
  • Python Flask实现图片上传与下载的示例详解
    目录1、效果预览2、新增逻辑概览3、tuchuang.py 逻辑介绍3.1 图片上传3.2 图片合法检查3.3 图片下载4、__init__.py 逻辑介绍5、upload.html...
    99+
    2022-11-11
  • Blob对象实现文件上传下载示例详解
    目录什么是Blod?Blob的属性与方法使用Blod下载指定类型文件上传FileReader对象的异步方式读取首先先介绍一下 FileReader对象FileReader常用属性与方...
    99+
    2023-01-04
    Blob对象实现文件上传下载 Blob文件上传下载
  • Python自动化办公之群发邮件案例详解
    目录背景实现过程总结背景 想象一下,现在你有一份Word邀请函模板,然后你有一份客户列表,上面有客户的姓名、联系方式、邮箱等基本信息,然后你的老板现在需要替换邀请函模板中的姓名,然后...
    99+
    2022-11-13
  • Python自动化办公实战案例详解(Word、Excel、Pdf、Email邮件)
    目录背景实现过程1)替换Word模板生成对应邀请函2)将Word邀请函转化为Pdf格式3)读取Excel表格中的姓名和邮箱4)自动发送邮件5)完整代码总结 背景 想象一下,现在你有一...
    99+
    2022-11-12
  • python使用imap-tools模块下载邮件附件的示例分析
    本篇文章给大家分享的是有关python使用imap-tools模块下载邮件附件的示例分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。最近在做一些email相关的办公自动化项目...
    99+
    2023-06-22
  • springboot实现自动邮件发送任务详解
    目录1.导入jar包2.配置文件3.测试复杂的邮件发送springboot可以很容易实现邮件的发送 具体实现步骤: 1.导入jar包 <dependency> &...
    99+
    2022-11-13
  • Android 动态加载 so实现示例详解
    目录背景so动态加载介绍从一个例子出发so库检索与删除动态加载so结束了吗?ELF文件扩展总结背景 对于一个普通的android应用来说,so库的占比通常都是巨高不下的,因为我们无可...
    99+
    2022-11-13
  • Android中DownloadManager实现文件下载实例详解
    Android中DownloadManager实现文件下载 下载 创建下载链接 DownloadManager.Request request = new DownloadM...
    99+
    2022-06-06
    Android
  • vue+django实现下载文件的示例
    目录一、概述二、django项目三、vue项目一、概述 在项目中,点击下载按钮,就可以下载文件。 传统的下载链接一般是get方式,这种链接是公开的,可以任意下载。 在实际项目,某些...
    99+
    2022-11-11
  • Android实现Service下载文件,Notification显示下载进度的示例
    先放个gif。。最终效果如果: 主要演示了Android从服务器下载文件,调用Notification显示下载进度,并且在下载完毕以后点击通知会跳转到安装APK的界面,演...
    99+
    2022-06-06
    service 示例 notification Android
  • Python实现动态绘图的示例详解
    目录示例FuncAnimation三维情况示例 matplotlib中的animation提供了动态绘图功能,下面列举一个最简单的动态绘制三角函数的例子,来初步演示一下。 impor...
    99+
    2023-05-19
    Python实现动态绘图 Python动态绘图 Python绘图
  • 基于Python实现视频自动下载软件
    目录序言效果展示下载视频下载弹幕下载评论软件生成打包序言 哈喽兄弟们,今天来实现一个Python采集视频、弹幕、评论与一体的小软件。 平常咱们都是直接代码运行,不过今天我们做成软件,...
    99+
    2022-11-11
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作