广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python如何利用IMAP实现邮箱客户端功能
  • 459
分享到

Python如何利用IMAP实现邮箱客户端功能

2024-04-02 19:04:59 459人浏览 泡泡鱼

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

摘要

目录概述什么是IMAP?IMAP和POP有什么区别?如何设置IMAP服务的SSL加密方式?涉及知识点示例效果图核心代码邮箱设置总结概述 在日常工作生活中,都是利用个人或公司的

概述

在日常工作生活中,都是利用个人或公司的邮箱客户端进行收发邮件,那么如何打造一款属于自己的邮箱客户端呢?本文以一个简单的小例子,简述如何通过Pyhton的imaplib和email两大模块,实现邮件的接收并展示,仅供学习分享使用,如有不足之处,还请指正。

什么是IMAP?

IMAP,即Internet Message Access Protocol(互联网邮件访问协议),您可以通过这种协议从邮件服务器上获取邮件的信息、下载邮件等。IMAP与POP类似,都是一种邮件获取协议。

IMAP和POP有什么区别?

POP允许电子邮件客户端下载服务器上的邮件,但是您在电子邮件客户端的操作(如:移动邮件、标记已读等),这是不会反馈到服务器上的,比如:您通过电子邮件客户端收取了QQ邮箱中的3封邮件并移动到了其他文件夹,这些移动动作是不会反馈到服务器上的,也就是说,QQ邮箱服务器上的这些邮件是没有同时被移动的 。但是IMAP就不同了,电子邮件客户端的操作都会反馈到服务器上,您对邮件进行的操作(如:移动邮件、标记已读等),服务器上的邮件也会做相应的动作。也就是说,IMAP是“双向”的。

同时,IMAP可以只下载邮件的主题,只有当您真正需要的时候,才会下载邮件的所有内容。

如何设置IMAP服务的SSL加密方式?

使用SSL的通用配置如下:

  • 接收邮件服务器:imap.qq.com,使用SSL,端口号993
  • 发送邮件服务器:smtp.qq.com,使用SSL,端口号465或587
  • 账户名:您的QQ邮箱账户名(如果您是VIP帐号或Foxmail帐号,账户名需要填写完整的邮件地址)
  • 密码:您的QQ邮箱密码
  • 电子邮件地址:您的QQ邮箱的完整邮件地址

涉及知识点

在本示例中,涉及知识点如下所示:

  • imaplib模块:此模块实现通过IMAP【Internet Message Access Protocol,信息交互访问协议】协议进行邮箱的登录,接收和发送等功能。
    • IMAP4_SSL(host='', port=IMAP4_SSL_PORT),通过此方法可以定义一个IMAP对象,需要对应的服务器和端口号。
    • login(self, user, passWord),通过此方法实现对应邮箱的登录,传入指定的账号,密码即可。
    • select(self, mailbox='INBOX', readonly=False) 选择收件箱
    • search(self, charset, *criteria) 查找获取邮箱数据
    • fetch(self, message_set, message_parts) 通过邮件编号,查找具体的邮件内容
  • email模块:此模块主要用于邮件的解析功能
    • message_from_string(s, *args, **kws) , 获取解析数据消息体
    • email.header.decode_header(msg.get('Subject'))[0][1] 解析编码方式
    • email.header.decode_header(msg.get('Date')) 解析邮件接收时间
    • email.header.decode_header(msg.get('From'))[0][0] 解析发件人
    • email.header.decode_header(msg.get('Subject'))[0][0].decode(msGCharset) 解析邮件标题
    • email.utils.parseaddr(msg.get('Content-Transfer-Encoding'))[1] 解析邮件传输编码

示例效果图

示例分为两部分,左边是邮件列表,右边是邮件内容,如下所示:

核心代码

邮件帮助类,主要包括邮件的接收,具体邮件内容的解析等功能,如下所示:


import imaplib
import email
import datetime
 
 
class EmailUtil:
    """
    Email帮助类
    """
    host = 'imap.qq.com'  # 主机IP或者域名
    port = '993'  # 端口
    username = '********'  # 用户名
    password = '**************'  # 密码或授权码
    imap = None  # 邮箱连接对象
 
    # mail_box = '**************'  # 邮箱名
 
    def __init__(self, host, port):
        """初始化方法"""
        self.host = host
        self.port = port
        # 初始化一个邮箱链接对象
        self.imap = imaplib.IMAP4_SSL(host=self.host, port=int(self.port))
 
    def login(self, username, password):
        """登录"""
        self.username = username
        self.password = password
        self.imap.login(user=self.username, password=self.password)
 
    def get_mail(self):
        """获取邮件"""
        # self.mail_box = mail_box
        email_infos = []
        if self.imap is not None:
            self.imap.select(readonly=False)
            typ, data = self.imap.search(None, 'ALL')  # 返回一个元组,data为此邮箱的所有邮件数据
            #  数据格式 data =  [b'1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18']
            if typ == 'OK':
                for num in data[0].split():
                    if int(num) > 10:
                        # 超过20,退出循环,不输出
                        break
                    typ1, data1 = self.imap.fetch(num, '(RFC822)')  # 通过邮箱编号和选择获取数据
                    if typ1 == 'OK':
                        print('**********************************begin******************************************')
                        msg = email.message_from_string(data1[0][1].decode("utf-8"))  # 用email库获取解析数据(消息体)
                        # 获取邮件标题并进行进行解码,通过返回的元组的第一个元素我们得知消息的编码
                        msgCharset = email.header.decode_header(msg.get('Subject'))[0][1]
                        # print('msg = ',msg)
                        # print('msgCharset= ',msgCharset)  # gb2312
                        recv_date = self.get_email_date(email.header.decode_header(msg.get('Date')))
                        mail_from = email.header.decode_header(msg.get('From'))[0][0]
                        if type(mail_from) == bytes:
                            mail_from = mail_from.decode(msgCharset)
 
                        mail_to = email.header.decode_header(msg.get('To'))[0][0]
                        subject = email.header.decode_header(msg.get('Subject'))[0][0].decode(msgCharset)  # 获取标题并通过标题进行解码
 
                        print("Message %s\n%s\n" % (num, subject))  # 打印输出标题
                        print('mail_from:' + mail_from + ' mail_to:' + mail_to + ' recv_date:' + str(recv_date))
                        # # 邮件内容
                        # for part in msg.walk():
                        #     if not part.is_multipart():
                        #         name = part.get_param("name")
                        #         if not name:  # 如果邮件内容不是附件可以打印输出
                        #             print(part.get_payload(decode=True).decode(msgCharset))
                        # print('***********************************end*****************************************')
                        email_info = {
                            "num": num,
                            "subject": subject,
                            "recv_date": recv_date,
                            "mail_to": mail_to,
                            "mail_from": mail_from
                        }
                        email_infos.append(email_info)
        else:
            print('请先初始化并登录')
        return email_infos
 
    def get_email_content(self, num):
        content = None
        typ1, data1 = self.imap.fetch(num, '(RFC822)')  # 通过邮箱编号和选择获取数据
        if typ1 == 'OK':
            print('**********************************begin******************************************')
            msg = email.message_from_string(data1[0][1].decode("utf-8"))  # 用email库获取解析数据(消息体)
            print(msg)
            # 获取邮件标题并进行进行解码,通过返回的元组的第一个元素我们得知消息的编码
            msgCharset = email.header.decode_header(msg.get('Subject'))[0][1]
            # transfer_encoding = email.header.decode_header(msg.get('Content-Transfer-Encoding'))
            transfer_encoding = email.utils.parseaddr(msg.get('Content-Transfer-Encoding'))[1]
            print("transfer_encoding:",transfer_encoding)
            print("charset:",msgCharset)
            # 邮件内容
            for part in msg.walk():
                if not part.is_multipart():
                    name = part.get_param("name")
                    if not name:  # 如果邮件内容不是附件可以打印输出
                        if transfer_encoding == '8bit':
                            content = part.get_payload(decode=False)
                        else:
                            content = part.get_payload(decode=True).decode(msgCharset)
 
            print(content)
            print('***********************************end*****************************************')
        return content
 
    def get_email_date(self, date):
        """获取时间"""
        utcstr = date[0][0].replace('+00:00', '')
        utcdatetime = None
        localtimestamp = None
        try:
            utcdatetime = datetime.datetime.strptime(utcstr, '%a, %d %b %Y %H:%M:%S +0000 (GMT)')
            localdatetime = utcdatetime + datetime.timedelta(hours=+8)
            localtimestamp = localdatetime.timestamp()
        except:
            try:
                utcdatetime = datetime.datetime.strptime(utcstr, '%a, %d %b %Y %H:%M:%S +0800 (CST)')
                localtimestamp = utcdatetime.timestamp()
            except:
                utcdatetime = datetime.datetime.strptime(utcstr, '%a, %d %b %Y %H:%M:%S +0800')
                localtimestamp = utcdatetime.timestamp()
        return localtimestamp
 
 
if __name__ == '__main__':
    host = 'imap.qq.com'  # 主机IP或者域名
    port = '993'  # 端口
    username = '********'  # 用户名
    password = '**************'  # 密码
    mail_box = '**************'  # 邮箱名
    eamil_util = EmailUtil(host=host, port=port)
    eamil_util.login(username=username, password=password)
    eamil_util.get_mail()
    print('done')

邮件展示类,主要用于邮件内容在前台页面的展示,如下所示:


from tkinter import *
from tkinterie.tkinterIE import WEBView
from test_email import EmailUtil
import time
import os
 
class Application(Frame):
    email_util = None
    total_line= 0
 
    def __init__(self, master=None):
        '''初始化方法'''
        super().__init__(master)  # 调用父类的初始化方法
        host = 'imap.qq.com'  # 主机IP或者域名
        port = '993'  # 端口
        username = '*********'  # 用户名
        password = '**************'  # 密码或授权码
        self.email_util = EmailUtil(host=host, port=port)
        self.email_util.login(username=username, password=password)
        self.master = master
        # self.pack(side=TOP, fill=BOTH, expand=1)  # 此处填充父窗体
        self.create_widget()
 
    def create_widget(self):
        self.img_loGo = PhotoImage(file="logo.png")
        self.btn_logo = Button(image=self.img_logo , bg='#222E3C')
        self.btn_logo.grid(row=0, column=0, sticky=N + E + W+S)
        # 收件箱初始化
        records = self.email_util.get_mail()
        for i in range(len(records)):
            # 时间特殊处理
            recv_date =  time.strftime("%Y-%m-%d", time.localtime(records[i]["recv_date"]))
            subject = "{0}   {1}".fORMat(recv_date, records[i]["subject"])
            print(subject)
            num = records[i]["num"]
            btn_subject = Button(self.master, text=subject,height=2, width=30, bg=("#F0FFFF" if i%2==0 else "#E6E6FA"), anchor='w',command=lambda num=num: self.get_email_content(num) )
            btn_subject.grid(row=(i + 1), column=0, padx=2, pady=1)
        # 明细
        self.total_line=i
        self.web_view = WebView(self.master, width=530, height=560)
        self.web_view.grid(row=0, column=1, rowspan=(i+2), padx=2, pady=5, sticky=N + E + W)
 
    def get_email_content(self,num):
        """获取邮件明细"""
        content = self.email_util.get_email_content(num)
        print(content)
        if content.find('GBK')>0 or content.find('gbk')>0 or content.find('cnblogs')>0:
            print('1-1111')
            # content = content.encode().decode('gbk')
        # print(content)
        self.save_data(content)
        abs_path =  os.path.abspath("content.html")
        self.web_view= WebView(self.master, width=530, height=560,url="file://"+abs_path)
        self.web_view.grid(row=0, column=1, rowspan=(self.total_line + 2), padx=5, pady=5, sticky=N + E + W)
 
 
    def save_data(self,content):
        """保存数据"""
        with open('content.html', 'w', encoding='utf-8') as f:
            f.write(content)
 
 
if __name__ == '__main__':
    root = Tk()
    root.title('个人邮箱')
    root.geometry('760x580+200+200')
    root.setvar("bg", "red")
    app = Application(master=root)
    root.mainloop()

邮箱设置

如果要使用IMAP协议访问邮箱服务进行收发邮件,则必须进行邮箱设置,路径:登录邮箱-->设置-->账户-->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,如下所示:

如果通过邮箱账户密码登录时,报如下错误,则表示需要通过授权码进行登录,如下所示:

 温馨提示:在第三方登录QQ邮箱,可能存在邮件泄露风险,甚至危害Apple ID安全,建议使用QQ邮箱手机版登录。

总结

到此这篇关于python如何利用IMAP实现邮箱客户端功能的文章就介绍到这了,更多相关Python IMAP实现邮箱客户端内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python如何利用IMAP实现邮箱客户端功能

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

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

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

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

下载Word文档
猜你喜欢
  • Python如何利用IMAP实现邮箱客户端功能
    目录概述什么是IMAP?IMAP和POP有什么区别?如何设置IMAP服务的SSL加密方式?涉及知识点示例效果图核心代码邮箱设置总结概述 在日常工作生活中,都是利用个人或公司的...
    99+
    2022-11-12
  • 如何利用C++实现一个简单的邮件客户端程序?
    如何利用C++实现一个简单的邮件客户端程序?随着互联网的快速发展,电子邮件已经成为人们日常生活中必不可少的一部分。作为一名程序员,掌握如何利用C++语言来实现一个简单的邮件客户端程序无疑是非常重要的。本文将以1500个字以内的篇幅,介绍如何...
    99+
    2023-11-04
    C++利用MQTT实现邮件客户端 C++邮件客户端编程指南 C++邮件客户端实现步骤
  • C#如何实现MQTT服务端与客户端通讯功能
    这期内容当中小编将会给大家带来有关C#如何实现MQTT服务端与客户端通讯功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。关于MQTTMQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 2...
    99+
    2023-06-29
  • nodejs如何实现TCP服务器端和客户端聊天功能
    这篇文章主要介绍了nodejs如何实现TCP服务器端和客户端聊天功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体如下:服务器端var&...
    99+
    2022-10-19
  • nodejs中如何实现socket服务端和客户端简单通信功能
    小编给大家分享一下nodejs中如何实现socket服务端和客户端简单通信功能,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!本文实例讲述了通过node.js的net模块实现nodejs s...
    99+
    2022-10-19
  • 如何利用ChatGPT和Python实现用户意图识别功能
    如何利用ChatGPT和Python实现用户意图识别功能引言:在当今的数字化时代,人工智能技术逐渐成为各个领域中不可或缺的一部分。其中,自然语言处理(Natural Language Processing,NLP)技术的发展使得机器能够理解...
    99+
    2023-10-27
    ChatGPT Python 意图识别
  • 如何利用ChatGPT和Python实现用户画像分析功能
    如何利用ChatGPT和Python实现用户画像分析功能引言:随着互联网的迅猛发展和普及,人们在网络上留下了大量的个人信息。对于企业来说,了解用户的兴趣和偏好,为其提供个性化的服务,已经成为提高用户黏性和市场竞争力的重要手段之一。本文将介绍...
    99+
    2023-10-27
    ChatGPT 用户画像 Python编程
  • 利用springMVC如何实现一个邮件发送功能
    这篇文章给大家介绍利用springMVC如何实现一个邮件发送功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。利用javax.mail发送邮件,图片与附件都可发送1,Controller类package com.web...
    99+
    2023-05-31
    springmvc 邮件发送
  • 如何使用Python完成SAP客户端的打开和系统登陆功能
    本篇内容介绍了“如何使用Python完成SAP客户端的打开和系统登陆功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!我们都知道,SAP原生...
    99+
    2023-06-30
  • python如何使用UDP实现客户端和服务器对话
    这篇文章主要介绍“python如何使用UDP实现客户端和服务器对话”,在日常操作中,相信很多人在python如何使用UDP实现客户端和服务器对话问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python如何使...
    99+
    2023-07-05
  • 如何利用python实现词频统计功能
    目录功能要求方法如下运行结果总结功能要求 这是我们老师的作业 代码中都有注释 要求 词频统计软件: 1)从文本中读入数据:(文件的输入输出) 2)不区分大小写,去除特殊字符。 3)&...
    99+
    2022-11-12
  • python如何使用pywinauto驱动微信客户端实现公众号爬虫
    这篇文章主要介绍了python如何使用pywinauto驱动微信客户端实现公众号爬虫,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。pywinauto简介pywinauto是一...
    99+
    2023-06-15
  • 如何利用ChatGPT和Python实现情感分析功能
    如何利用ChatGPT和Python实现情感分析功能介绍ChatGPTChatGPT是OpenAI于2021年发布的一种基于强化学习的生成式预训练模型,它采用了强大的语言模型来生成连贯的对话。ChatGPT可以用于各种任务,包括情感分析。导...
    99+
    2023-10-24
    ChatGPT Python 情感分析
  • 如何利用ChatGPT和Python实现自动问答功能
    如何利用ChatGPT和Python实现自动问答功能引言:随着自然语言处理和人工智能的快速发展,自动问答系统成为各个领域中的热门应用之一。通过使用ChatGPT和Python,我们可以快速实现一个自动问答系统,从而提供高效的问答服务。本文将...
    99+
    2023-10-25
    ChatGPT - ChatGPT 自动问答 - Auto QA Python - Python编程
  • 如何利用ChatGPT和Python实现语义匹配功能
    如何利用ChatGPT和Python实现语义匹配功能引言:随着人工智能技术的快速发展,自然语言处理(Natural Language Processing, NLP)的应用领域正在不断扩大。ChatGPT作为一种强大的自然语言生成模型,已经...
    99+
    2023-10-25
    ChatGPT Python 语义匹配
  • 如何利用ChatGPT和Python实现个人助理功能
    如何利用ChatGPT和Python实现个人助理功能概述:在现代社会,随着人们生活节奏的加快,个人助理的需求也变得日益重要。ChatGPT 是一种基于深度学习的对话生成模型,它可以帮助我们实现个人助理的功能。在本文中,我们将介绍如何使用 C...
    99+
    2023-10-24
    ChatGPT Python 个人助理
  • Vue如何利用flex布局实现TV端城市列表功能
    目录前言1.实现搜索布局代码:2.搜索布局css样式代码:3.城市列表布局代码:4.城市列表css样式代码:5.城市列表获取焦点的事件:6.设置焦点背景颜色和字体效果:7.搜索框输入...
    99+
    2023-01-03
    vue 城市列表 vue 城市选择 vue 城市列表选择
  • 如何利用ChatGPT和Python实现多模态对话功能
    如何利用ChatGPT和Python实现多模态对话功能概述:随着人工智能技术的发展,多模态对话逐渐成为了研究和应用的热点。多模态对话不仅包括文本对话,还可以通过图像、音频和视频等多种媒体形式进行交流。本文将介绍如何利用ChatGPT和Pyt...
    99+
    2023-10-26
    ChatGPT Python 多模态对话
  • python如何利用字典与函数实现switch case功能
    python如何利用字典与函数实现switch case功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 Python不像C/C++,J...
    99+
    2022-10-18
  • 如何利用ChatGPT和Python实现情景生成对话功能
    如何利用ChatGPT和Python实现情景生成对话功能引言:近年来,自然语言处理技术发展迅猛,其中一项重要技术就是对话模型。OpenAI的ChatGPT是一种非常强大的对话模型,它可以理解和生成人类语言。本文将介绍如何利用ChatGPT和...
    99+
    2023-10-25
    ChatGPT Python 情景生成对话
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作