MENU

PyQt5+poplib+smtplib+python3.6邮件客户端Demo

December 27, 2019 • 阅读: 1781 • 笔记&折腾



目录:

准备

安装库:PyQt5,poplib,smtplib

邮件客户端主要功能包括接收邮件、发送邮件、邮件分类.........,时间有限,只做出了发送邮件和接收邮件。

接收邮件主要依赖 pop 服务器,发送邮件依赖 smtp 服务器,例如网易 163 邮箱的 pop 服务器为 pop.163.com,smtp 服务器为 smtp.163.com,发送端口为 465。

目前测试网易邮箱没有问题,但是使用前确保打开了 163 的 POP3/SMTP/IMAP 服务,及开启 客户端授权密码

代码

包含三个界面,可使用 QTdesigner 设计 GUI,也可直接使用我生成的界面 py 文件。三个界面如下:

ui 生成的代码分别是:

主界面 ui --> pop3.py

  • # -*- coding: utf-8 -*-
  • # Form implementation generated from reading ui file 'pop3.ui'
  • #
  • # Created by: PyQt5 UI code generator 5.13.0
  • #
  • # WARNING! All changes made in this file will be lost!
  • from PyQt5 import QtCore, QtGui, QtWidgets
  • class Ui_MainWindow(object):
  • def setupUi(self, MainWindow):
  • MainWindow.setObjectName("MainWindow")
  • MainWindow.resize(551, 716)
  • self.centralwidget = QtWidgets.QWidget(MainWindow)
  • self.centralwidget.setObjectName("centralwidget")
  • self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
  • self.tableWidget.setGeometry(QtCore.QRect(30, 70, 501, 231))
  • self.tableWidget.setObjectName("tableWidget")
  • self.tableWidget.setColumnCount(5)
  • self.tableWidget.setRowCount(0)
  • item = QtWidgets.QTableWidgetItem()
  • self.tableWidget.setHorizontalHeaderItem(0, item)
  • item = QtWidgets.QTableWidgetItem()
  • self.tableWidget.setHorizontalHeaderItem(1, item)
  • item = QtWidgets.QTableWidgetItem()
  • self.tableWidget.setHorizontalHeaderItem(2, item)
  • item = QtWidgets.QTableWidgetItem()
  • self.tableWidget.setHorizontalHeaderItem(3, item)
  • item = QtWidgets.QTableWidgetItem()
  • self.tableWidget.setHorizontalHeaderItem(4, item)
  • self.tableWidget.horizontalHeader().setDefaultSectionSize(150)
  • self.label = QtWidgets.QLabel(self.centralwidget)
  • self.label.setGeometry(QtCore.QRect(30, 30, 61, 21))
  • self.label.setObjectName("label")
  • self.pushButton = QtWidgets.QPushButton(self.centralwidget)
  • self.pushButton.setGeometry(QtCore.QRect(360, 20, 81, 31))
  • self.pushButton.setObjectName("pushButton")
  • self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
  • self.pushButton_2.setGeometry(QtCore.QRect(110, 20, 81, 31))
  • self.pushButton_2.setObjectName("pushButton_2")
  • self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
  • self.pushButton_3.setGeometry(QtCore.QRect(454, 20, 81, 31))
  • self.pushButton_3.setObjectName("pushButton_3")
  • self.label_2 = QtWidgets.QLabel(self.centralwidget)
  • self.label_2.setGeometry(QtCore.QRect(50, 320, 41, 21))
  • self.label_2.setObjectName("label_2")
  • self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
  • self.lineEdit.setGeometry(QtCore.QRect(90, 320, 441, 21))
  • self.lineEdit.setObjectName("lineEdit")
  • self.label_3 = QtWidgets.QLabel(self.centralwidget)
  • self.label_3.setGeometry(QtCore.QRect(40, 360, 51, 21))
  • self.label_3.setObjectName("label_3")
  • self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
  • self.lineEdit_2.setGeometry(QtCore.QRect(90, 360, 441, 21))
  • self.lineEdit_2.setObjectName("lineEdit_2")
  • self.label_4 = QtWidgets.QLabel(self.centralwidget)
  • self.label_4.setGeometry(QtCore.QRect(30, 440, 61, 21))
  • self.label_4.setObjectName("label_4")
  • self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget)
  • self.lineEdit_3.setGeometry(QtCore.QRect(90, 440, 441, 21))
  • self.lineEdit_3.setObjectName("lineEdit_3")
  • self.label_5 = QtWidgets.QLabel(self.centralwidget)
  • self.label_5.setGeometry(QtCore.QRect(50, 480, 41, 21))
  • self.label_5.setObjectName("label_5")
  • self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
  • self.textEdit.setGeometry(QtCore.QRect(90, 480, 441, 131))
  • self.textEdit.setObjectName("textEdit")
  • self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
  • self.pushButton_4.setGeometry(QtCore.QRect(230, 20, 81, 31))
  • self.pushButton_4.setObjectName("pushButton_4")
  • self.label_6 = QtWidgets.QLabel(self.centralwidget)
  • self.label_6.setGeometry(QtCore.QRect(50, 400, 41, 21))
  • self.label_6.setObjectName("label_6")
  • self.lineEdit_4 = QtWidgets.QLineEdit(self.centralwidget)
  • self.lineEdit_4.setGeometry(QtCore.QRect(90, 400, 441, 21))
  • self.lineEdit_4.setObjectName("lineEdit_4")
  • MainWindow.setCentralWidget(self.centralwidget)
  • self.menubar = QtWidgets.QMenuBar(MainWindow)
  • self.menubar.setGeometry(QtCore.QRect(0, 0, 551, 23))
  • self.menubar.setObjectName("menubar")
  • MainWindow.setMenuBar(self.menubar)
  • self.statusbar = QtWidgets.QStatusBar(MainWindow)
  • self.statusbar.setObjectName("statusbar")
  • MainWindow.setStatusBar(self.statusbar)
  • self.retranslateUi(MainWindow)
  • QtCore.QMetaObject.connectSlotsByName(MainWindow)
  • def retranslateUi(self, MainWindow):
  • _translate = QtCore.QCoreApplication.translate
  • MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
  • item = self.tableWidget.horizontalHeaderItem(0)
  • item.setText(_translate("MainWindow", "标题"))
  • item = self.tableWidget.horizontalHeaderItem(1)
  • item.setText(_translate("MainWindow", "发送者"))
  • item = self.tableWidget.horizontalHeaderItem(2)
  • item.setText(_translate("MainWindow", "时间"))
  • item = self.tableWidget.horizontalHeaderItem(3)
  • item.setText(_translate("MainWindow", "发送邮箱"))
  • item = self.tableWidget.horizontalHeaderItem(4)
  • item.setText(_translate("MainWindow", "内容"))
  • self.label.setText(_translate("MainWindow", "收信箱:"))
  • self.pushButton.setText(_translate("MainWindow", "登录"))
  • self.pushButton_2.setText(_translate("MainWindow", "发送邮件"))
  • self.pushButton_3.setText(_translate("MainWindow", "退出"))
  • self.label_2.setText(_translate("MainWindow", "标题:"))
  • self.label_3.setText(_translate("MainWindow", "发送者:"))
  • self.label_4.setText(_translate("MainWindow", "发送邮箱:"))
  • self.label_5.setText(_translate("MainWindow", "正文:"))
  • self.pushButton_4.setText(_translate("MainWindow", "刷新信箱"))
  • self.label_6.setText(_translate("MainWindow", "时间:"))

发送邮件界面 ui --> smtp.py

  • # -*- coding: utf-8 -*-
  • # Form implementation generated from reading ui file 'smtp.ui'
  • #
  • # Created by: PyQt5 UI code generator 5.13.0
  • #
  • # WARNING! All changes made in this file will be lost!
  • from PyQt5 import QtCore, QtGui, QtWidgets
  • class Ui_MainWindow(object):
  • def setupUi(self, MainWindow):
  • MainWindow.setObjectName("MainWindow")
  • MainWindow.resize(938, 405)
  • self.centralwidget = QtWidgets.QWidget(MainWindow)
  • self.centralwidget.setObjectName("centralwidget")
  • self.label = QtWidgets.QLabel(self.centralwidget)
  • self.label.setGeometry(QtCore.QRect(70, 50, 81, 41))
  • self.label.setObjectName("label")
  • self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
  • self.lineEdit.setGeometry(QtCore.QRect(150, 60, 321, 21))
  • self.lineEdit.setObjectName("lineEdit")
  • self.label_2 = QtWidgets.QLabel(self.centralwidget)
  • self.label_2.setGeometry(QtCore.QRect(90, 100, 61, 41))
  • self.label_2.setObjectName("label_2")
  • self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
  • self.lineEdit_2.setGeometry(QtCore.QRect(150, 110, 321, 21))
  • self.lineEdit_2.setObjectName("lineEdit_2")
  • self.label_3 = QtWidgets.QLabel(self.centralwidget)
  • self.label_3.setGeometry(QtCore.QRect(70, 10, 81, 41))
  • self.label_3.setObjectName("label_3")
  • self.label_4 = QtWidgets.QLabel(self.centralwidget)
  • self.label_4.setGeometry(QtCore.QRect(70, 150, 81, 41))
  • self.label_4.setObjectName("label_4")
  • self.lineEdit_4 = QtWidgets.QLineEdit(self.centralwidget)
  • self.lineEdit_4.setGeometry(QtCore.QRect(150, 160, 321, 21))
  • self.lineEdit_4.setObjectName("lineEdit_4")
  • self.label_5 = QtWidgets.QLabel(self.centralwidget)
  • self.label_5.setGeometry(QtCore.QRect(70, 200, 81, 41))
  • self.label_5.setObjectName("label_5")
  • self.lineEdit_5 = QtWidgets.QLineEdit(self.centralwidget)
  • self.lineEdit_5.setGeometry(QtCore.QRect(150, 210, 321, 21))
  • self.lineEdit_5.setObjectName("lineEdit_5")
  • self.label_6 = QtWidgets.QLabel(self.centralwidget)
  • self.label_6.setGeometry(QtCore.QRect(500, 0, 71, 41))
  • self.label_6.setObjectName("label_6")
  • self.lineEdit_6 = QtWidgets.QLineEdit(self.centralwidget)
  • self.lineEdit_6.setGeometry(QtCore.QRect(570, 10, 321, 20))
  • self.lineEdit_6.setObjectName("lineEdit_6")
  • self.label_7 = QtWidgets.QLabel(self.centralwidget)
  • self.label_7.setGeometry(QtCore.QRect(500, 40, 61, 41))
  • self.label_7.setObjectName("label_7")
  • self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
  • self.textEdit.setGeometry(QtCore.QRect(570, 50, 321, 191))
  • self.textEdit.setObjectName("textEdit")
  • self.pushButton = QtWidgets.QPushButton(self.centralwidget)
  • self.pushButton.setGeometry(QtCore.QRect(650, 270, 81, 31))
  • self.pushButton.setObjectName("pushButton")
  • self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
  • self.pushButton_2.setGeometry(QtCore.QRect(780, 270, 81, 31))
  • self.pushButton_2.setObjectName("pushButton_2")
  • self.label_8 = QtWidgets.QLabel(self.centralwidget)
  • self.label_8.setGeometry(QtCore.QRect(150, 10, 211, 41))
  • self.label_8.setObjectName("label_8")
  • MainWindow.setCentralWidget(self.centralwidget)
  • self.menubar = QtWidgets.QMenuBar(MainWindow)
  • self.menubar.setGeometry(QtCore.QRect(0, 0, 938, 23))
  • self.menubar.setObjectName("menubar")
  • MainWindow.setMenuBar(self.menubar)
  • self.statusbar = QtWidgets.QStatusBar(MainWindow)
  • self.statusbar.setObjectName("statusbar")
  • MainWindow.setStatusBar(self.statusbar)
  • self.retranslateUi(MainWindow)
  • QtCore.QMetaObject.connectSlotsByName(MainWindow)
  • def retranslateUi(self, MainWindow):
  • _translate = QtCore.QCoreApplication.translate
  • MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
  • self.label.setText(_translate("MainWindow", "SMTP服务器:"))
  • self.lineEdit.setText(_translate("MainWindow", "smtp.163.com"))
  • self.label_2.setText(_translate("MainWindow", "端口号:"))
  • self.lineEdit_2.setText(_translate("MainWindow", "465"))
  • self.label_3.setText(_translate("MainWindow", "发件人账号:"))
  • self.label_4.setText(_translate("MainWindow", "发件人昵称:"))
  • self.label_5.setText(_translate("MainWindow", "收件人邮箱:"))
  • self.label_6.setText(_translate("MainWindow", "邮件主题:"))
  • self.label_7.setText(_translate("MainWindow", "邮件正文:"))
  • self.pushButton.setText(_translate("MainWindow", "发送"))
  • self.pushButton_2.setText(_translate("MainWindow", "取消"))
  • self.label_8.setText(_translate("MainWindow", "TextLabel"))

登录界面 ui-->idenfy.py

  • # -*- coding: utf-8 -*-
  • # Form implementation generated from reading ui file 'idenfy.ui'
  • #
  • # Created by: PyQt5 UI code generator 5.13.0
  • #
  • # WARNING! All changes made in this file will be lost!
  • from PyQt5 import QtCore, QtGui, QtWidgets
  • class Ui_MainWindow(object):
  • def setupUi(self, MainWindow):
  • MainWindow.setObjectName("MainWindow")
  • MainWindow.resize(384, 263)
  • self.centralwidget = QtWidgets.QWidget(MainWindow)
  • self.centralwidget.setObjectName("centralwidget")
  • self.label = QtWidgets.QLabel(self.centralwidget)
  • self.label.setGeometry(QtCore.QRect(70, 50, 61, 41))
  • self.label.setObjectName("label")
  • self.label_2 = QtWidgets.QLabel(self.centralwidget)
  • self.label_2.setGeometry(QtCore.QRect(70, 90, 61, 41))
  • self.label_2.setObjectName("label_2")
  • self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
  • self.lineEdit.setGeometry(QtCore.QRect(140, 60, 171, 21))
  • self.lineEdit.setText("")
  • self.lineEdit.setObjectName("lineEdit")
  • self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
  • self.lineEdit_2.setGeometry(QtCore.QRect(140, 100, 171, 21))
  • self.lineEdit_2.setText("")
  • self.lineEdit_2.setObjectName("lineEdit_2")
  • self.label_3 = QtWidgets.QLabel(self.centralwidget)
  • self.label_3.setGeometry(QtCore.QRect(60, 10, 71, 41))
  • self.label_3.setObjectName("label_3")
  • self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget)
  • self.lineEdit_3.setGeometry(QtCore.QRect(140, 20, 171, 21))
  • self.lineEdit_3.setObjectName("lineEdit_3")
  • self.pushButton = QtWidgets.QPushButton(self.centralwidget)
  • self.pushButton.setGeometry(QtCore.QRect(100, 150, 71, 31))
  • self.pushButton.setObjectName("pushButton")
  • self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
  • self.pushButton_2.setGeometry(QtCore.QRect(230, 150, 71, 31))
  • self.pushButton_2.setObjectName("pushButton_2")
  • MainWindow.setCentralWidget(self.centralwidget)
  • self.menubar = QtWidgets.QMenuBar(MainWindow)
  • self.menubar.setGeometry(QtCore.QRect(0, 0, 384, 23))
  • self.menubar.setObjectName("menubar")
  • MainWindow.setMenuBar(self.menubar)
  • self.statusbar = QtWidgets.QStatusBar(MainWindow)
  • self.statusbar.setObjectName("statusbar")
  • MainWindow.setStatusBar(self.statusbar)
  • self.retranslateUi(MainWindow)
  • QtCore.QMetaObject.connectSlotsByName(MainWindow)
  • def retranslateUi(self, MainWindow):
  • _translate = QtCore.QCoreApplication.translate
  • MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
  • self.label.setText(_translate("MainWindow", "邮箱账号:"))
  • self.label_2.setText(_translate("MainWindow", "邮箱密码:"))
  • self.label_3.setText(_translate("MainWindow", "pop3服务器:"))
  • self.lineEdit_3.setText(_translate("MainWindow", "pop.163.com"))
  • self.pushButton.setText(_translate("MainWindow", "登录"))
  • self.pushButton_2.setText(_translate("MainWindow", "取消"))

主函数 emailServer.py

  • import idenfy
  • import pop3
  • import smtp
  • import sys
  • from PyQt5.QtWidgets import QMessageBox,QLineEdit,QApplication,QMainWindow,QAbstractItemView,QTableWidgetItem
  • import _thread
  • from PyQt5.QtCore import QCoreApplication
  • import poplib
  • import base64
  • from email.parser import Parser
  • from email.header import decode_header
  • from email.utils import parseaddr
  • import datetime
  • import smtplib
  • from email.mime.text import MIMEText
  • from email.utils import formataddr
  • app = QApplication(sys.argv)
  • is_Idenfy = False
  • user = {
  • 'pop3':None,
  • 'user':None,
  • 'pass':None
  • }
  • class Email_Server(object):
  • def __init__(self,user_dic):
  • # print(user_dic)
  • self.user_mail = user_dic['user']
  • self.password = user_dic['pass']
  • self.pop_server = user_dic['pop3'] # pop.163.com
  • self.Connect_Server()
  • def Connect_Server(self):
  • # 连接服务
  • self.server = poplib.POP3(self.pop_server)
  • self.server.user(self.user_mail)
  • self.server.pass_(self.password)
  • def _close_(self):
  • # 关闭服务器资源
  • self.server.close()
  • def Get_Email_Count(self):
  • # 获取邮件数目
  • email_num, email_size = self.server.stat()
  • # print("邮件数量: {0}, 消息大小:{1}Byte".format(email_num,email_size))
  • return email_num
  • def Get_Email_Data(self,email_row = None):
  • rsp, msglines, msgsiz = self.server.retr(email_row)
  • # print("服务器的响应: {0},\n原始邮件内容: {1},\n该封邮件所占字节大小: {2}".format(rsp, msglines, msgsiz))
  • # 解析
  • msg_content = b'\r\n'.join(msglines).decode('gbk')
  • # print(msg_content)
  • msg = Parser().parsestr(text=msg_content)
  • # print(msg)
  • self.msg = msg
  • # 标题
  • subject = self.msg['Subject']
  • value, charset = decode_header(subject)[0]
  • if charset:
  • value = value.decode(charset)
  • self.email_title = value
  • print("标题: ",self.email_title)
  • # 发送方
  • hdr, addr = parseaddr(self.msg['From'])
  • name, charset = decode_header(hdr)[0]
  • if charset:
  • name = name.decode(charset)
  • self.email_name = name
  • self.email_addr = addr
  • print("发送方: ",name,addr)
  • # 时间
  • date = decode_header(self.msg.get('date'))
  • utcstr = date[0][0].replace('+00:00', '')
  • self.email_time = str(utcstr)
  • # print(utcdatetime)
  • # 内容
  • try:
  • content = self.msg.get_payload()
  • content_charset = content[0].get_content_charset() # 获取编码格式
  • print(content_charset)
  • text = content[0].as_string().split('base64')[-1]
  • try:
  • text_content = base64.b64decode(text).decode(content_charset) # base64解码
  • except:
  • text_content = base64.b64decode(text).decode('gbk','ignore') # base64解码
  • # print(text_content)
  • self.content = text_content
  • except:
  • self.content = " "
  • mail_Server = None
  • class Send_email(QMainWindow):
  • def __init__(self):
  • QMainWindow.__init__(self)
  • self.send_ui = smtp.Ui_MainWindow()
  • self.send_ui.setupUi(self)
  • self.send_ui.pushButton_2.clicked.connect(self.close)
  • self.send_ui.pushButton.clicked.connect(self.Send)
  • def Send(self):
  • global mail_Server
  • try:
  • smtp_server = self.send_ui.lineEdit.text()
  • smtp_port = self.send_ui.lineEdit_2.text()
  • send_name = self.send_ui.lineEdit_4.text()
  • recv_mail = self.send_ui.lineEdit_5.text()
  • send_title = self.send_ui.lineEdit_6.text()
  • send_text = self.send_ui.textEdit.toPlainText()
  • except:
  • QMessageBox.about(self, "Message", "填写完整信息")
  • _thread.start_new_thread(self.Send_Email, (smtp_server,smtp_port,send_name,recv_mail,send_title,send_text,))
  • def Send_Email(self,smtp_server,smtp_port,send_name,recv_mail,send_title,send_text):
  • global mail_Server
  • try:
  • msg = MIMEText(send_text,'plain','utf-8')
  • msg['From'] = formataddr([send_name,mail_Server.user_mail])#发件人邮箱昵称、发件人邮箱
  • msg['To'] = formataddr(["star", recv_mail]) # 收件人邮箱昵称、收件人邮箱账号
  • msg['Subject'] = send_title # 邮件主题(标题
  • server = smtplib.SMTP_SSL(smtp_server, int(smtp_port)) # 发送人邮箱SMTP服务器,端口号
  • server.login(mail_Server.user_mail, mail_Server.password) # 发件人邮箱账号、密码
  • server.sendmail(mail_Server.user_mail, [recv_mail, ], msg.as_string())
  • server.quit()
  • QMessageBox.about(self, "Message", "发送成功!")
  • self.close()
  • except:
  • QMessageBox.critical(self, "失败", "pop验证失败", QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
  • sendUi = None
  • class mainWin(QMainWindow):
  • def __init__(self):
  • QMainWindow.__init__(self)
  • self.main_ui = pop3.Ui_MainWindow()
  • self.main_ui.setupUi(self)
  • self.main_ui.pushButton_2.clicked.connect(self.Send)
  • self.main_ui.pushButton_4.clicked.connect(self.Update)
  • self.main_ui.tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)
  • self.main_ui.tableWidget.itemClicked.connect(self.itemclick)
  • self.main_ui.textEdit.document().setMaximumBlockCount(100)
  • def itemclick(self):
  • # print("嘤嘤嘤")
  • now_current_row = self.main_ui.tableWidget.currentIndex().row()
  • print(now_current_row)
  • rowtitle = self.main_ui.tableWidget.item(now_current_row,0).text()
  • # print(rowdata)
  • rowsender = self.main_ui.tableWidget.item(now_current_row,1).text()
  • etime = self.main_ui.tableWidget.item(now_current_row,2).text()
  • rowaddr = self.main_ui.tableWidget.item(now_current_row,3).text()
  • contents = self.main_ui.tableWidget.item(now_current_row,4).text()
  • self.main_ui.textEdit.clear()
  • self.main_ui.lineEdit.clear()
  • self.main_ui.lineEdit_2.clear()
  • self.main_ui.lineEdit_3.clear()
  • self.main_ui.lineEdit_4.clear()
  • _thread.start_new_thread(self.Dis_mail_data, (rowtitle,rowsender,rowaddr,contents,etime))
  • def Dis_mail_data(self, title, sender, addr, cont,etime):
  • self.main_ui.lineEdit.setText(title)
  • self.main_ui.lineEdit_2.setText(sender)
  • self.main_ui.lineEdit_3.setText(addr)
  • self.main_ui.lineEdit_4.setText(etime)
  • # print(len(cont))
  • if len(cont) > 5000:
  • self.main_ui.textEdit.append(" ")
  • else:
  • self.main_ui.textEdit.append(cont)
  • def Update(self):
  • global is_Idenfy,mail_Server
  • if not is_Idenfy:
  • QMessageBox.about(self, "Message", "请先登录")
  • else:
  • _thread.start_new_thread(self.Upthread, ())
  • def Upthread(self):
  • global mail_Server
  • #清空列表
  • allrownum = self.main_ui.tableWidget.rowCount()
  • for i in range(allrownum):
  • self.main_ui.tableWidget.removeRow(0)
  • # 获取邮箱邮件数
  • mail_count = mail_Server.Get_Email_Count()
  • # 获取最新10条邮件
  • for i in range(mail_count,mail_count-10,-1):
  • mail_Server.Get_Email_Data(i)
  • _thread.start_new_thread(self.Display, (mail_Server.email_title,mail_Server.email_name,mail_Server.email_addr,mail_Server.content,mail_Server.email_time,))
  • def Display(self,title,name,addr,content,etime):
  • rrow = self.main_ui.tableWidget.rowCount()
  • self.main_ui.tableWidget.insertRow(rrow)
  • self.main_ui.tableWidget.setItem(rrow, 0, QTableWidgetItem(title))
  • self.main_ui.tableWidget.setItem(rrow, 1, QTableWidgetItem(name))
  • self.main_ui.tableWidget.setItem(rrow, 2, QTableWidgetItem(str(etime)))
  • self.main_ui.tableWidget.setItem(rrow, 3, QTableWidgetItem(addr))
  • self.main_ui.tableWidget.setItem(rrow, 4, QTableWidgetItem(content))
  • def Send(self):
  • global is_Idenfy,user,sendUi
  • if not is_Idenfy:
  • QMessageBox.about(self, "Message", "请先登录")
  • else:
  • sendUi = Send_email()
  • sendUi.send_ui.label_8.setText(user['user'])
  • sendUi.show()
  • class loginWin(QMainWindow):
  • def __init__(self):
  • QMainWindow.__init__(self)
  • self.login_ui = idenfy.Ui_MainWindow()
  • self.login_ui.setupUi(self)
  • self.login_ui.pushButton_2.clicked.connect(self.close)
  • self.login_ui.pushButton.clicked.connect(self.Login)
  • self.login_ui.lineEdit_2.setEchoMode(QLineEdit.Password)
  • def Login(self):
  • print("login....")
  • global user,mail_Server,is_Idenfy
  • user['user'] = str(self.login_ui.lineEdit.text())
  • user['pass'] = str(self.login_ui.lineEdit_2.text())
  • user['pop3'] = str(self.login_ui.lineEdit_3.text())
  • # print(user)
  • try:
  • mail_Server = Email_Server(user)
  • print("连接成功.......")
  • QMessageBox.about(self, "连接成功", "验证成功!")
  • self.close()
  • is_Idenfy = True
  • except:
  • print("pop验证失败!")
  • QMessageBox.critical(self, "失败", "pop验证失败", QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
  • if __name__ == '__main__':
  • ui = mainWin()
  • loginui = loginWin()
  • ui.main_ui.pushButton.clicked.connect(loginui.show)
  • ui.main_ui.pushButton_3.clicked.connect(QApplication.quit)
  • ui.show()
  • sys.exit(app.exec_())

运行演示

运行 emailServer.py 后出现主界面,在进行操作前请先登录。

登录后点击刷新信箱将会显出最新的 10 封邮件,点击表格任意行将会在下方显示邮件详情

点击发送邮件可弹出发送邮件窗口,填写必要信息后点击发送,稍作等待会有弹窗提示发送成功或失败:

发送成功后收件人会收到邮件。

目前客户端存在一些问题:1) 无法添加图片或附件。2) 发送邮件成功后客户端可能会被关闭。

Last Modified: February 6, 2021