基于PyQt5制作一个群发邮件工具
作者:Python 发布时间:2022-09-04 01:46:46
标签:PyQt5,群发,邮件
演示示例使用QQ邮箱发送邮件,先获取自己的QQ邮箱的授权码。因为后面发送邮件时需要使用自己的授权码作为邮箱的密码登录邮箱最后达到发送邮件的目的。
将UI处理的相关的界面包导入进来
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
# 应用操作相关的库
import sys
# 邮件发送相关的库
import smtplib
from email.mime.text import MIMEText
为了不和邮件发送的UI界面主线程产生冲突,使用QThread子线程的方式制作邮件发送。
class EmailWork(QThread):
trigger = pyqtSignal(str)
finished = pyqtSignal(bool)
def __init__(self, parent=None):
super(EmailWork, self).__init__(parent)
self.parent = parent
self.working = True
def __del__(self):
self.working = False
self.wait()
def run(self):
email_subject_text = self.parent.email_subject_text.text().strip()
recipient_text = self.parent.recipient_text.text().strip()
current_text = self.parent.current_text.toPlainText().strip()
print(email_subject_text)
print(recipient_text)
print(current_text)
self.trigger.emit("邮件信息读取完成!")
# 发件人邮箱
send_email_name = '1342929047@qq.com'
# 发件人授权码
passwd = 'fjyjqlzxprzihcii'
self.trigger.emit(send_email_name)
self.trigger.emit("发件人信息初始化完成!")
# 收件人邮箱
msg_to = recipient_text.split(';')
self.trigger.emit(recipient_text)
self.trigger.emit("收件人信息初始化完成!")
print(msg_to)
# 设置邮件
msg = MIMEText(current_text)
msg['subject'] = email_subject_text
# 设置发件人
msg['From'] = '一匹来自北方的狼'
# 设置收件人
msg['To'] = ';'.join(msg_to)
# 连接服务器
smtp = smtplib.SMTP_SSL('smtp.qq.com', 465)
self.trigger.emit("服务器连接成功!")
# 登录邮箱
smtp.login(send_email_name, passwd)
self.trigger.emit("邮箱登录成功!")
# 发送邮件
smtp.sendmail(send_email_name, msg_to, msg.as_string())
self.trigger.emit("邮件发送成功!")
self.finished.emit(True)
下面是主页面的UI布局及信号量的代码块。
class StmpEmail(QWidget):
def __init__(self):
super(StmpEmail, self).__init__()
self.init_ui()
def init_ui(self):
self.setWindowTitle('批量邮件工具 公众号:[Python 集中营]')
self.setWindowIcon(QIcon('邮件.ico'))
self.setFixedSize(500, 400)
hbox = QHBoxLayout()
self.send_btn = QPushButton()
self.send_btn.setText('发送')
self.send_btn.clicked.connect(self.send_btn_click)
self.brower = QTextBrowser()
self.brower.setFont(QFont('宋体', 8))
self.brower.setReadOnly(True)
self.brower.setPlaceholderText('执行进度显示区域...')
self.brower.ensureCursorVisible()
hbox.addWidget(self.send_btn)
self.email_subject_text = QLineEdit()
self.email_subject_text.setPlaceholderText('请输入主题')
self.recipient_text = QLineEdit()
self.recipient_text.setPlaceholderText('请输入收件人,示例:134047@qq.com;092837@163.com')
self.current_text = QTextEdit()
self.current_text.setPlaceholderText('请输入邮件正文')
self.thread_ = EmailWork(self)
self.thread_.trigger.connect(self.update_log)
self.thread_.finished.connect(self.finished)
vbox = QVBoxLayout()
vbox.addWidget(self.email_subject_text)
vbox.addWidget(self.recipient_text)
vbox.addWidget(self.current_text)
vbox.addWidget(self.brower)
vbox.addLayout(hbox)
self.setLayout(vbox)
def update_log(self, text):
'''
槽函数:向文本浏览器中写入内容
:param text:
:return:
'''
cursor = self.brower.textCursor()
cursor.movePosition(QTextCursor.End)
self.brower.append(text)
self.brower.setTextCursor(cursor)
self.brower.ensureCursorVisible()
def finished(self, finished):
if finished is True:
self.send_btn.setEnabled(True)
def send_btn_click(self):
self.send_btn.setEnabled(False)
self.thread_.start()
最后,通过main函数将页面布局加入主体循环即可。
if __name__ == '__main__':
app = QApplication(sys.argv)
main = StmpEmail()
main.show()
sys.exit(app.exec_())
来源:https://www.cnblogs.com/lwsbc/p/16113978.html


猜你喜欢
- 本文实例讲述了Django框架用户注销功能实现方法。分享给大家供大家参考,具体如下:HttpResponse()里有个delete_cook
- 废话不多说了,直接给大家分享java操作sql数据库常见的连接问题。1.连接,查询,更新,关闭这几个数据基础操作,所以放到一起,写成一个工具
- 问题问题1Python是一种动态语言,不支持类型检查。当需要对一个对象执行类型检查时,可能会采用下面的方式:class Foo(object
- 这是支持的下载版本,去官网下载2020.3及以上(2021-03-18测试破解有效)官网下载地址:https://www.jetbrains
- 本文实例为大家分享了JavaScript实现前端倒计时效果的具体代码,供大家参考,具体内容如下代码:<!DOCTYPE html>
- 一、问题描述SQL Server 的master数据库不能像其他用户或 系统数据库一样恢复, 因为没有活动的master数据库 SQL Se
- Oracle中表的外键是保证系统参照完整性的手段,而参照完整性是指分布在两个表中的列所满足的具有主从性质的约束关系。外键涉及到两个表,其中一
- 本文实例讲述了Python3实现获取图片文字里中文的方法。分享给大家供大家参考,具体如下:一、运行环境(1) win10(2) pychar
- 很多开发人员在使用MySQL时经常会在部分列上进行函数计算等,导致无法走索引,在数据量大的时候,查询效率低下。针对此种情况本文从MySQL5
- 这篇文章主要介绍了postman和python mock测试过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- 随着传统的数据库、计算机网络和数字通信技术的飞速发展,以数据分布存储和分布处理为主要特征的分布式数据库系统的研究和开发越来越受到人们的关注。
- 在ACCESS数据库中可以用MSSQL的形式定义操作字符串,也可以采用OLEDB的形式。MSSQL 形式string sqlText = @
- 什么是循环呢?简单理解,循环就是反复的去做某一件事情。生活中的例子:比如我们听歌的时候,在歌曲的页面就会出现单曲循环、列表循环、随机播放以及
- 前言上回在 用 Go 写一个轻量级的 ssh 批量操作工具 里提及过,我们做 Golang 并发的时候要对并发进行限制,对 goroutin
- python 远程统计文件#!/usr/bin/python#encoding=utf-8import timeimport osimpor
- 详解MySQL导出指定表中的数据要求:1. 不导出创表的语句,因为表已经建好:默认会导出,先drop table然后create table
- 一、安装 wordcloudpip install wordcloud二、加载包、设置路径import osfrom wordcloud i
- 我们常见的RGB图像通常只有R、G、B三个通道,在图像处理的过程中会遇到往往需要向图像中添加透明度信息,如公司logo的设计,其输出图像文件
- 在SQL SERVER下跟踪sql采用事件探查器,而在mysql下如何跟踪sql呢? 其实方法很简单,开启mysql的日志log功能,通过查
- 目录深度遍历递归用栈来遍历磁盘广度遍历磁盘用队列遍历磁盘深度遍历递归import osdef get_files(path):