Python Qt学习(十)一个简易的POP3邮件客户端

news2024/12/29 9:44:46

公司把126这类的邮箱网站都封了,正好现在无事,加之,算是一个对这俩周学习Qt的一个总结吧。遂写了这么一个简易的通过POP3协议接收126邮件的客户端。

源代码:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'pop3_mail_client.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr
from email.policy import default
import sys
import json
import poplib
import datetime


class Ui_frmPOP3Mail(object):
    def setupUi(self, frmPOP3Mail):
        frmPOP3Mail.setObjectName("frmPOP3Mail")
        frmPOP3Mail.resize(1176, 718)
        self.centralwidget = QtWidgets.QWidget(frmPOP3Mail)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(10, 10, 101, 81))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.lblPOP3Addr = QtWidgets.QLabel(self.verticalLayoutWidget)
        self.lblPOP3Addr.setObjectName("lblPOP3Addr")
        self.verticalLayout.addWidget(self.lblPOP3Addr)
        self.lblMailAcct = QtWidgets.QLabel(self.verticalLayoutWidget)
        self.lblMailAcct.setObjectName("lblMailAcct")
        self.verticalLayout.addWidget(self.lblMailAcct)
        self.lblMailPwd = QtWidgets.QLabel(self.verticalLayoutWidget)
        self.lblMailPwd.setObjectName("lblMailPwd")
        self.verticalLayout.addWidget(self.lblMailPwd)
        self.verticalLayoutWidget_2 = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget_2.setGeometry(QtCore.QRect(110, 10, 461, 85))
        self.verticalLayoutWidget_2.setObjectName("verticalLayoutWidget_2")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_2)
        self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.txtPOP3Addr = QtWidgets.QLineEdit(self.verticalLayoutWidget_2)
        self.txtPOP3Addr.setObjectName("txtPOP3Addr")
        self.verticalLayout_2.addWidget(self.txtPOP3Addr)
        self.txtMailAcct = QtWidgets.QLineEdit(self.verticalLayoutWidget_2)
        self.txtMailAcct.setObjectName("txtMailAcct")
        self.verticalLayout_2.addWidget(self.txtMailAcct)
        self.txtMailPwd = QtWidgets.QLineEdit(self.verticalLayoutWidget_2)
        self.txtMailPwd.setObjectName("txtMailPwd")
        self.verticalLayout_2.addWidget(self.txtMailPwd)
        self.btnRefresh = QtWidgets.QPushButton(self.centralwidget)
        self.btnRefresh.setGeometry(QtCore.QRect(620, 40, 93, 28))
        self.btnRefresh.setObjectName("btnRefresh")
        self.tblMail = QtWidgets.QTableView(self.centralwidget)
        self.tblMail.setGeometry(QtCore.QRect(10, 110, 1151, 541))
        self.tblMail.setObjectName("tblMail")
        self.tblMail.horizontalHeader().setStretchLastSection(False)
        self.tblMail.setEditTriggers(QAbstractItemView.SelectedClicked)
        self.btnNewEmail = QtWidgets.QPushButton(self.centralwidget)
        self.btnNewEmail.setGeometry(QtCore.QRect(810, 40, 93, 28))
        self.btnNewEmail.setObjectName("btnNewEmail")

        frmPOP3Mail.setCentralWidget(self.centralwidget)


        self.retranslateUi(frmPOP3Mail)
        QtCore.QMetaObject.connectSlotsByName(frmPOP3Mail)

        self.mailModel = QtGui.QStandardItemModel()        
        self.mailModel.setHorizontalHeaderLabels(['From', 'Subject', 'Received Date', 'Message ID'])
        self.tblMail.setModel(self.mailModel)
        self.tblMail.setColumnWidth(0,335)
        self.tblMail.setColumnWidth(1,552)
        self.tblMail.setColumnWidth(2,247)
        self.tblMail.setColumnWidth(3,0)
        
        self.btnRefresh.clicked.connect(self.loadNewMails)

        self.mailList = {}

        self.setMailDetailDialog_UI()

        self.tblMail.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.ActionsContextMenu)
        self.maildetailAction = QAction("Mail Detail", self.tblMail)
        self.maildetailAction.triggered.connect(self.showMailDetail)
        self.tblMail.addAction(self.maildetailAction)

    def setMailDetailDialog_UI(self):
        self.frmMailDetail = QtWidgets.QDialog(self.centralwidget)          
        self.frmMailDetail.resize(763, 492)
        self.frmMailDetail.setModal(True)
        self.frmMailDetail.hide()

        self.btnDialogOK = QDialogButtonBox(self.frmMailDetail)
        self.btnDialogOK.setObjectName(u"btnDialogOK")
        self.btnDialogOK.setGeometry(QRect(350, 450, 71, 32))
        self.btnDialogOK.setOrientation(Qt.Horizontal)
        self.btnDialogOK.setStandardButtons(QDialogButtonBox.Ok)
        self.verticalLayoutWidget = QWidget(self.frmMailDetail)
        self.verticalLayoutWidget.setObjectName(u"verticalLayoutWidget")
        self.verticalLayoutWidget.setGeometry(QRect(10, 10, 91, 80))
        self.vlytDialogLabel = QVBoxLayout(self.verticalLayoutWidget)
        self.vlytDialogLabel.setObjectName(u"vlytDialogLabel")
        self.vlytDialogLabel.setContentsMargins(0, 0, 0, 0)
        self.lblDialogFrom = QLabel(self.verticalLayoutWidget)
        self.lblDialogFrom.setObjectName(u"lblDialogFrom")

        self.vlytDialogLabel.addWidget(self.lblDialogFrom)

        self.lblDialogSubject = QLabel(self.verticalLayoutWidget)
        self.lblDialogSubject.setObjectName(u"lblDialogSubject")

        self.vlytDialogLabel.addWidget(self.lblDialogSubject)

        self.verticalLayoutWidget_2 = QWidget(self.frmMailDetail)
        self.verticalLayoutWidget_2.setObjectName(u"verticalLayoutWidget_2")
        self.verticalLayoutWidget_2.setGeometry(QRect(100, 10, 511, 80))
        self.vlytDialogText = QVBoxLayout(self.verticalLayoutWidget_2)
        self.vlytDialogText.setObjectName(u"vlytDialogText")
        self.vlytDialogText.setContentsMargins(0, 0, 0, 0)
        self.txtDialogFrom = QLineEdit(self.verticalLayoutWidget_2)
        self.txtDialogFrom.setObjectName(u"txtDialogFrom")
        self.txtDialogFrom.setReadOnly(True)

        self.vlytDialogText.addWidget(self.txtDialogFrom)

        self.txtDialogSubject = QLineEdit(self.verticalLayoutWidget_2)
        self.txtDialogSubject.setObjectName(u"txtDialogSubject")
        self.txtDialogSubject.setReadOnly(True)

        self.vlytDialogText.addWidget(self.txtDialogSubject)

        self.txtDialogMailDetail = QTextEdit(self.frmMailDetail)
        self.txtDialogMailDetail.setObjectName(u"txtDialogMailDetail")
        self.txtDialogMailDetail.setGeometry(QRect(10, 100, 741, 341))

        self.btnDialogOK.clicked.connect(self.hideMailDetailDialog)

        self.frmMailDetail.setWindowTitle(QCoreApplication.translate("frmMailDetail", u"Mail Detail", None))
        self.lblDialogFrom.setText(QCoreApplication.translate("frmMailDetail", u"From", None))
        self.lblDialogSubject.setText(QCoreApplication.translate("frmMailDetail", u"Subject", None)) 

        QtCore.QMetaObject.connectSlotsByName(self.frmMailDetail)

    def retranslateUi(self, frmPOP3Mail):
        _translate = QtCore.QCoreApplication.translate
        frmPOP3Mail.setWindowTitle(_translate("frmPOP3Mail", "POP3 Mail Client"))
        self.lblPOP3Addr.setText(_translate("frmPOP3Mail", "POP3 Address"))
        self.lblMailAcct.setText(_translate("frmPOP3Mail", "Mail Account"))
        self.lblMailPwd.setText(_translate("frmPOP3Mail", "Password"))
        self.btnRefresh.setText(_translate("frmPOP3Mail", "Refresh"))
        self.btnNewEmail.setText(_translate("frmPOP3Mail", "New Email"))

    def show(self, Form):
        Form.show()
    
    def loadNewMails(self):
        
        user = self.txtMailAcct.text()
        password=self.txtMailPwd.text()
        address=self.txtPOP3Addr.text()

        Mailbox = poplib.POP3_SSL(address, '995') 
        Mailbox.user(user) 
        Mailbox.pass_(password) 
        NumofMessages = len(Mailbox.list()[1])
        for i in range(NumofMessages):
            Mailbox.rset()
            lines=Mailbox.retr(i+1)[1]
            msg=b'\n'.join(lines).decode('utf-8')

            msg_formatted=Parser(policy=default).parsestr(msg)
            email_id=msg_formatted.get("message-id")
            email_from = msg_formatted.get('From')        
            email_subject = msg_formatted.get('Subject')
            email_receive_date = msg_formatted.get("date")
            email_receive_date_c=self.date_convert(email_receive_date)
            email_body=msg_formatted.get_body().get_content()
            
            self.mailList[email_id] = [email_from, email_subject, email_receive_date_c, email_body]

            self.mailModel.appendRow([QStandardItem(email_from), 
                                      QStandardItem(email_subject), 
                                      QStandardItem(str(email_receive_date_c)),
                                      QStandardItem(email_id)])


        Mailbox.quit()

    def date_convert(self, date_time):
        format = '%a, %d %b %Y %H:%M:%S %z'
        datetime_str = datetime.datetime.strptime(date_time, format)
 
        return datetime_str

    def hideMailDetailDialog(self):
        self.frmMailDetail.hide()
    
    def showMailDetail(self):
        select_item=self.tblMail.currentIndex()
        email_id=self.mailModel.item(select_item.row(),3).text()
        self.txtDialogFrom.setText(self.mailList[email_id][0])
        self.txtDialogSubject.setText(self.mailList[email_id][1])        
        self.txtDialogMailDetail.setHtml(self.mailList[email_id][3])
        self.frmMailDetail.show()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    Form=QtWidgets.QMainWindow()    
    main_win = Ui_frmPOP3Mail()    

    main_win.setupUi(Form)
    main_win.show(Form)
    
    sys.exit(app.exec())        

截图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/982203.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenCV图像处理——矩形(Rect)类的常用操作

1.Rect类 创建类 Rect类成员变量x、y、width、height,分别为左上角点的坐标和矩形的宽和高。 创建一个Rect对象Rect,并在图像上画该矩形框。 cv::Rect rect(100, 50, 500, 500);cv::Mat cv_src cv::imread("11.JPG");cv::rectangle(cv_src, rect, cv:…

每一座屎山代码背后,都藏着一堆熟读代码规范的研发

👉导读 韩寒在《他的国》中写道:“我们懂很多道理,却依然过不好这一生”,人们虽然知道很多道理,但并不一定能将这些道理应用到实际生活中。这种现象在生活中很常见,我们听了很多的成功学的道理,…

接入 NVIDIA A100、吞吐量提高 10 倍!Milvus GPU 版本使用指南

Milvus 2.3 正式支持 NVIDIA A100! 作为为数不多的支持 GPU 的向量数据库产品,Milvus 2.3 在吞吐量和低延迟方面都带来了显著的变化,尤其是与此前的 CPU 版本相比,不仅吞吐量提高了 10 倍,还能将延迟控制在极低的水准。…

ChatGLM2-6B 部署

引言 这是ChatGLM2-6B 部署的阅读笔记,主要介绍了ChatGLM2-6B模型的部署和一些原理的简单解释。 ChatGLM-6B 它是单卡开源的对话模型。 充分的中英双语预训练 较低的部署门槛 FP16半精度下,需要至少13G的显存进行推理,甚至可以进一步降低…

罕见病 对称性脂肪瘤(MSL) 马德龙病

如果你体内脂肪瘤分布大致如下 而且个数不断增多 这篇文章适合你 症状 脂肪瘤个数一直增加 而且很对称 比如: 左手臂一个 右手臂一个 别名 多发性对称性脂肪增多症 Multiple symmetric lipomatosis (MSL) 多发性对称性脂肪瘤(MSL) 脂肪瘤 马德龙病(…

大场景的倾斜摄影三维模型OBJ格式轻量化处理处理关键处理技术分析

大场景的倾斜摄影三维模型OBJ格式轻量化处理处理关键处理技术分析 大场景的倾斜摄影三维模型是指通过航空或地面摄影获取的大范围、高分辨率的地理环境数据。为了在虚拟环境中加载和渲染这些模型,需要对其进行OBJ格式的轻量化处理。本文将分析大场景的倾斜摄影三维模…

SSRF漏洞实战

文章目录 SSRF概述SSRF原理SSRF 危害PHP复现SSRF漏洞检测端口扫描内网Web应用指纹识别攻击内网应用读取本地文件 Weblogic SSRF--Getshell复现SSRF攻击Redis原理漏洞检测端口扫描复现翻车,请看官方复现教程注入HTTP头,利用Redis反弹shell SSRF防御过滤输…

软路由的负载均衡设置:优化网络性能和带宽利用率

在现代网络环境中,提升网络性能和最大化带宽利用率至关重要。通过合理配置软路由IP的负载均衡设置,可以有效地实现这一目标,并提高整体稳定性与效果。本文将详细介绍如何进行软路由IP的负载均衡设置,从而优化网络表现、增加带宽利…

软件架构设计(六) 软件架构风格-MDA(模型驱动架构)

概念 模型驱动架构MDA, 全称叫做Model Driven Architecture。 Model:表示客观事物的抽象表示Architecture:表示构成系统的部件,连接件及其约束的规约Model Driven: 使用模型完成软件的分析,设计,构建,部署和维护等 开发活动MDA起源于分离系统规约和平台实现的思想。之前…

Python入门学习13(面向对象)

一、类的定义和使用 类的使用语法: 创建类对象的语法: ​​​​​​​ class Student:name None #学生的名字age None #学生的年龄def say_hi(self):print(f"Hi大家好,我是{self.name}")stu Student() stu.name &q…

软件系统平台验收测试报告

验收测试 一、验收测试 软件项目验收测试依据招投标文件以及相关行业标准、国家标准、法律法规等对软件的功能性、易用性、可靠性、兼容性、维护性、可移植性和用户文档等进行检测,对软件项目的质量进行科学的评价,为项目验收提供依据。 1、服务内容 …

成功解决OSError: [WinError 1455] 页面文件太小,无法完成操作

最近写了个训练文件,昨天在运行的时候都是好好的,今天一运行就报错了,不得不说,有点点奇怪。 OSError: [WinError 1455] 页面文件太小,无法完成操作。 Error loading "D:\AI\Anaconda\anaconda3\envs\torch1.8\li…

嵌入式学习笔记(16)反汇编工具objdump

2.4.1反汇编的原理&为什么要用反汇编 arm-linux-objdump -D led.elf > led_elf.dis objdump是gcc工具链中的反汇编工具,作用是由编译链接好的elf格式的可执行程序反过来得到汇编源代码 -D表示反汇编 > 左边的是elf可执行程序(反汇编的源&am…

Linux RPM JDK升级

以JDK1.8升级JDK17为例 上传jdk17安装包到linux服务器 检查jdk版本 rpm -qa|grep jdk 删除查询到的jdk rpm -e --nodeps jdk1.8-1.8.0_201-fcs.x86_64 删除完毕后安装新的jdk rpm -ivh jdk-17_linux-x64_bin.rpm 检查jdk版本 java -version

Matlab信号处理3:fft(快速傅里叶变换)标准使用方式

Fs 1000; % 采样频率 T 1/Fs; % 采样周期:0.001s L 1500; % 信号长度 t (0:L-1)*T; % 时间向量. 时间向量从0开始递增,0s~1.499sS 0.7*sin(2*pi*50*t) sin(2*pi*120*t); % 模拟原信号 X S 2*randn(size(t)); …

jenkins快速跑通helloworld任务

jenkins新建helloworld示例 左上角“新建任务” 输入名称,选择第一个创建: 可以选择众多执行脚本,这里选择shell: 随后弹出一个窗口,将下面脚本填入: #!/bin/bashecho start... for i in {1..10}doecho $i…

什么是混合项目管理模式,以及价值

随着工作环境的不断变化,传统的项目管理方法(如瀑布模型)已经不能满足当前的需要,这也引发了对敏捷和瀑布式两种方法论之间优劣的新一轮讨论。瀑布模型是一种较为传统和结构化的项目管理方法,主要用于项目管理和软件开…

CH06_第一组重构(上)

提取函数(Extract Function |106) 曾用名:提炼函数(Extract Function) 反向重构:内联函数(115) 示例代码 function printOwing(invoice) {printBanner();let outstanding calcul…

git撤销还未push的的提交

怎样撤销掉上图中的提交呢 使用以下代码即可提交 git reset --soft HEAD^

如何在Ubuntu 20.04|18.04上安装 FreeSwitch

如何在Ubuntu 20.04|18.04上安装FreeSwitch 什么是 FreeSwitch PBX?FreeSwitch PBX 系统有哪些功能?开始部署部署前准备开始安装freeswitch 安装完成错误及问题FAQ常见配置文件及说明修改默认端口:防火墙配置账号密码配置/添加新用户freeswit…