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

这篇具有很好参考价值的文章主要介绍了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 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())        

截图:

Python Qt学习(十)一个简易的POP3邮件客户端,学习文章来源地址https://www.toymoban.com/news/detail-697687.html

到了这里,关于Python Qt学习(十)一个简易的POP3邮件客户端的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SMTP 和 POP3 协议的区别和联系

    SMTP(Simple Mail Transfer Protocol)和POP3(Post Office Protocol 3)是两种常用的电子邮件协议,用于发送和接收电子邮件。虽然它们都涉及到电子邮件的传输,但在功能和使用方式上有一些区别。下面将详细介绍SMTP和POP3协议的区别和联系。 SMTP:SMTP是一种用于发送电子邮件的协议。它

    2024年02月12日
    浏览(38)
  • TCP/IP详解——POP3协议,SMTP协议

    POP3: 邮局协议 版本3(Post Office Protocol Version 3) POP3 的作用是将存储在邮件服务器上的邮件离线下载到本地。 使用C/S架构工作在 TCP 的 110 端口。 邮件在发出的时候使用的是SMTP协议的,在接受的时候使用的是POP3协议。 POP3协议是接受邮件的一种,还有一种是IMAP协议。 POP3服

    2024年02月02日
    浏览(51)
  • QQ邮箱 网易邮箱及企业邮箱开通SMTP/POP3及设置授权码

    一 、什么是 POP3/IMAP/SMTP 服务 POP3 (Post Office Protocol - Version 3)协议用于支持使用电子邮件客户端获取并删除在服务器上的电子邮件。 IMAP (Internet Message Access Protocol)协议用于支持使用电子邮件客户端交互式存取服务器上的邮件。 SMTP (Simple Mail Transfer Protocol)协议用于支持

    2024年02月04日
    浏览(95)
  • 邮箱如何配置?如何查看各种邮箱的服务SMTP/POP3地址及端口号

    1、登录或注册网易邮箱 https://mail.163.com/ 2、登录邮箱后,点击顶部设置,选择POP3/SMTP/IMAP 3、进入后点击开启POP3/ SMTP 服务 4、遇到提示点击继续 5、可能会让发送验证码,按提示,使用邮箱绑定的手机号扫码发送验证码(微信扫码即可),发送完毕点击已发送 6、将授权码复制

    2024年02月16日
    浏览(45)
  • outlook 设置POP3/IMAP/SMTP服务 (账号密码-授权码)发送、获取授权码

    在弹框后点击 左侧 “同步电子邮件”,右侧选 “是” ,“允许应用和设备删除来自Outlook的邮件\\\",注意:如果不需要在其它应用删除邮件可不选 [图 3-2 链接] 右上角 点击 头像 - 我的个人资料 此时左边会出现如下图所示,点击安全 点击 “立即开始” 开启双重验证,开启后

    2024年02月03日
    浏览(43)
  • QT学习TCP/IP通信(一个服务端对多个客户端)

    QT学习TCP/IP通信(一个服务端对多个客户端) 一、服务端: 1.创建QTcpServer对象 2.启动服务器(监听)调用成员方法listen(QHostAddress::Any,端口号) 3.定义一个QLis容器对象存储客户信息; 4.当有客户端链接时候会发送newConnection信号,触发槽函数接受链接(得到一个与客户端通信的

    2024年02月11日
    浏览(47)
  • 100天精通Python丨办公效率篇 —— 11、Python自动化操作 Email(发送邮件、收邮件、邮箱客户端)

    大家好,我是你们的好朋友西红柿!今天咱们聊一聊关于Python怎么操作邮件的问题。这可是十分有用的技能啊,偏偏很多小伙伴们并不知道,还得费尽周折地查找资料呢。幸好我这个聪明伶俐的小家伙会给你们支招,让你们又快又好地掌握这门技能! 首先,你要掌握以SMTP协

    2023年04月17日
    浏览(46)
  • 常见应用层协议端口号及简介【HTTP80、FTP20(数据连接)21(控制连接)、POP3 110、DNS 53、TFTP文件传输协议 69】、http无状态、http的压缩传输

    目录 一、常见应用层协议 我们先看一下其常用协议的端口号: HTTP(hypertext transfer protocol)超文本传输协议(80) HTTPS(secure hypertext transfer protocol)安全文本传输协议(443) FTP(file transfer protocol)文件传输协议(21) TELNET(terminal NETwork)远程登录(端口号23) SMTP简单邮件

    2023年04月08日
    浏览(52)
  • Qt 制作一个简易的计算器

    1.通过UI界面封装出计算器的大致模型 进入设计页面后,左侧会有各种控件,可以将他们拖拽到你想编辑的窗口中,我们要做的是计算器,所以只用到很少几个控件,我们最主要用到Push Button这个控件来做我们计算器的按钮,lineEdit显示数字,我们可以将它拖拽到窗口,然后就

    2024年02月05日
    浏览(126)
  • 用Python搭建非常简易的TCP客户端和服务器

    以下属于Python Socket网络编程的基础,单纯为了测试学习 只要运行就会将内容发送至服务器 只要运行就会开始监听客户端请求 我们先运行TCP服务器(打开cmd,使用netstat命令可查看对应端口),然后运行TCP客户端,结果如下: 服务端: 客户端: 过几天写一篇用 C语言 搭建TCP服务

    2024年02月16日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包