目录:
准备
安装库: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) 发送邮件成功后客户端可能会被关闭。