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

公司把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 datetimeclass 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.translatefrmPOP3Mail.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_strdef 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.mzph.cn/news/70619.shtml

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

相关文章

创建2个线程并执行(STL/Windows/Linux)

C并发编程入门 目录 STL 写法 #include <thread> #include <iostream> using namespace std;void thread_fun1(void) {cout << "one STL thread 1!" << endl; }void thread_fun2(void) {cout << "one STL thread 2!" <…

uni-app之android离线自定义基座

一 为什么要自定义基座 1&#xff0c;基座其实就是一个app&#xff0c;然后新开发的页面可以直接在手机上面显示&#xff0c;查看效果。 2&#xff0c;默认的基座就是uniapp帮我们打包好的基座app&#xff0c;然后我们可以进行页面的调试。 3&#xff0c;自定义基座主要用来…

【Java SE】抽象类与接口

目录 【1】抽象类 【1.1】抽象类概念 【1.2】抽象类语法 【1.3】抽象类特性 【1.4】抽象类的作用 【2】接口 【2.1】接口的概念 【2.2】语法规则 【2.3】接口使用 【2.4】接口特性 【2.5】实现多个接口 【2.6】接口间的继承 【2.7】接口使用实例 【2.8】Clonable …

SVPWM的原理及法则推导和控制算法详解

空间电压矢量调制 SVPWM 技术 SVPWM是近年发展的一种比较新颖的控制方法&#xff0c;是由三相功率逆变器的六个功率开关元件组成的特定开关模式产生的脉宽调制波&#xff0c;能够使输出电流波形尽 可能接近于理想的正弦波形。空间电压矢量PWM与传统的正弦PWM不同&#xff0c;它…

通讯软件017——分分钟学会Kepware OPC UA Server配置

本文介绍如何配置Kepware OPC UA Server&#xff0c;通过本文可以对OPC UA的基本概念有所了解&#xff0c;掌握OPC UA的本质。更多通信资源请登录网信智汇(wangxinzhihui.com)。 1. 创建OPC UA Server 点击“OPC UA Configuration”&#xff0c;弹出配置界面。 点击“添加”&a…

java八股文面试[数据库]——explain

使用 EXPLAIN 关键字可以模拟优化器来执行SQL查询语句&#xff0c;从而知道MySQL是如何处理我们的SQL语句的。分析出查询语句或是表结构的性能瓶颈。 MySQL查询过程 通过explain我们可以获得以下信息&#xff1a; 表的读取顺序 数据读取操作的操作类型 哪些索引可以被使用 …

正中优配:政策预期叠加资金面压制 债市回调至“降息”前

地产方针利好和资金面边沿收紧的压制之下&#xff0c;债券商场出现了回调。 到9月6日收盘&#xff0c;10年期国债收益率上行2.4个基点报2.665%&#xff0c;已回到降息之前的点位。 资金面也在收敛&#xff0c;到6日收盘&#xff0c;DR001加权均匀利率报1.51%&#xff0c;较前…

一文讲解Linux内核内存管理架构

内存管理子系统可能是linux内核中最为复杂的一个子系统&#xff0c;其支持的功能需求众多&#xff0c;如页面映射、页面分配、页面回收、页面交换、冷热页面、紧急页面、页面碎片管理、页面缓存、页面统计等&#xff0c;而且对性能也有很高的要求。本文从内存管理硬件架构、地址…

mac制作ssl证书|生成自签名证书,nodejs+express在mac上搭建https+wss(websocket)服务器

注意 mac 自带 openssl 所以没必要像 windows 一样先安装 openssl&#xff0c;直接生成即可 生成 ssl/自签名 证书 生成 key # 生成rsa私钥&#xff0c;des3算法&#xff0c;server_ssl.key是秘钥文件名 1024位强度 openssl genrsa -des3 -out server_ssl.key 1024让输入两…

【前端】Vue2 脚手架模块化开发 -快速入门

&#x1f384;欢迎来到边境矢梦的csdn博文&#x1f384; &#x1f384;本文主要梳理Vue2 脚手架模块化开发 &#x1f384; &#x1f308;我是边境矢梦&#xff0c;一个正在为秋招和算法竞赛做准备的学生&#x1f308; &#x1f386;喜欢的朋友可以关注一下&#x1faf0;&#x…

iOS逆向进阶:iOS进程间通信方案深入探究与local socket介绍

在移动应用开发中&#xff0c;进程间通信&#xff08;Inter-Process Communication&#xff0c;IPC&#xff09;是一项至关重要的技术&#xff0c;用于不同应用之间的协作和数据共享。在iOS生态系统中&#xff0c;进程和线程是基本的概念&#xff0c;而进程间通信方案则为应用的…

【已解决】pycharm 突然每次点击都开新页面,关不掉怎么办?

今天在 pycharm 中写代码&#xff0c;突然发现&#xff0c;新开的文件不再原来的页面上&#xff0c;而是新增了页面&#xff0c;导致整个屏幕全都是新开的页面&#xff0c;最难受的是&#xff0c;关不掉&#xff01; 无奈&#xff0c;我只能关闭 pycharm&#xff0c;重新双击…

openGauss学习笔记-55 openGauss 高级特性-全密态数据库

文章目录 openGauss学习笔记-55 openGauss 高级特性-全密态数据库55.1 连接全密态数据库55.2 创建用户密钥55.3 创建加密表55.4 向加密表插入数据并进行查询 openGauss学习笔记-55 openGauss 高级特性-全密态数据库 全密态数据库意在解决数据全生命周期的隐私保护问题&#xf…

Java LinkedList

简介 链表&#xff08;Linked list&#xff09;是一种常见的基础数据结构&#xff0c;是一种线性表&#xff0c;但是并不会按线性的顺序存储数据&#xff0c;而是在每一个节点里存到下一个节点的地址。 链表可分为单向链表和双向链表。 在Java程序设计语言中&#xff0c;所有…

RabbtiMQ的安装与在Springboot中的使用!!!

一、安装Erlang与Rabbitmq 安装教程本教程是在centos8下试验的&#xff0c;其实linux系统的都差不多RabbitMQ官方&#xff1a;Messaging that just works — RabbitMQRabbitMQ是开源AMQP实现&#xff0c;服务器端用Erlang语言编写&#xff0c;Python、Ruby、 NET、Java、JMS、c…

机器学习笔记:轨迹驻留点 staypoint

1 定义 在轨迹数据分析中&#xff0c;"停留点"&#xff08;Staypoint&#xff09;是一个非常关键的概念&#xff0c;它反映了个体或物体在某一地点的停留行为。通常&#xff0c;在一段时间内&#xff0c;如果一个人或物体在一个较小的地理区域内的移动距离低于某个阈…

攻防世界-WEB-ics-05

打开靶机 只有设备维护中心可以点开 点标签得到新的url pageindex 想到文件包含漏洞&#xff08;URL中出现path、dir、file、pag、page、archive、p、eng、语言文件等相关关键字眼 利用php伪协议查看源码 出现一段base64源码&#xff0c;进行转码得出源码 ?pagephp://filter…

Agisoft Metashape相机标定笔记

Lens Calibration(镜头标定) 使用Metashape进行自动相机标定是可能的。Metashape使用LCD显示屏作为标定目标&#xff08;可选&#xff1a;使用打印的棋盘格图案&#xff0c;但需保证它是平坦的且单元格是正方形&#xff09;。 相机标定步骤支持全相机标定矩阵的估计&#xff…

蓝桥杯打卡Day3

文章目录 吃糖果递推数列 一、吃糖果IO链接 本题思路:本题题意就是斐波那契数列&#xff01; #include <bits/stdc.h>typedef uint64_t i64;i64 f(i64 n) {if(n1) return 1;if(n2) return 2;return f(n-1)f(n-2); }signed main() {std::ios::sync_with_stdio(false);s…

kubernetes——ingress

简介 ingress: 是k8s内部的一个资源对象ingress controller -> ingress控制器&#xff1a; 是k8s里启动的一个pod&#xff0c;运行的是nginx的镜像&#xff0c;实现k8s内部的service&#xff08;ClusterIP类型&#xff09;的负载均衡 ingress 和ingress controller 的关…