基于PyQt5制作一个群发邮件工具


Posted in Python onApril 08, 2022

演示示例使用QQ邮箱发送邮件,先获取自己的QQ邮箱的授权码。因为后面发送邮件时需要使用自己的授权码作为邮箱的密码登录邮箱最后达到发送邮件的目的。

基于PyQt5制作一个群发邮件工具

基于PyQt5制作一个群发邮件工具

将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_())

以上就是邮件发送的主要代码块了,copy到自己的开发工具中运行即可(前提是你已经安装好了需要的python模块)。

最终效果图

基于PyQt5制作一个群发邮件工具

到此这篇关于基于PyQt5制作一个群发邮件工具的文章就介绍到这了,更多相关PyQt5群发邮件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python内置的字符串处理函数整理
Jan 29 Python
详解python中的文件与目录操作
Jul 11 Python
详解使用 pyenv 管理多个版本 python 环境
Oct 19 Python
Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
Feb 13 Python
Caffe均值文件mean.binaryproto转mean.npy的方法
Jul 09 Python
python进阶之多线程对同一个全局变量的处理方法
Nov 09 Python
python 重命名轴索引的方法
Nov 10 Python
Python中函数的基本定义与调用及内置函数详解
May 13 Python
Python3操作Excel文件(读写)的简单实例
Sep 02 Python
浅析python中while循环和for循环
Nov 19 Python
全网首秀之Pycharm十大实用技巧(推荐)
Apr 27 Python
python实现批处理文件
Jul 28 Python
Python&Matlab实现樱花的绘制
Python OpenCV形态学运算示例详解
4种方法python批量修改替换列表中元素
Apr 07 #Python
Python+OpenCV实现图片中的圆形检测
Python中文分词库jieba(结巴分词)详细使用介绍
基于Python实现对比Exce的工具
Apr 07 #Python
pytorch分类模型绘制混淆矩阵以及可视化详解
You might like
用PHP动态生成虚拟现实VRML网页
2006/10/09 PHP
劣质的PHP代码简化
2010/02/08 PHP
PHP imagecreatefrombmp 从BMP文件或URL新建一图像
2012/07/16 PHP
PHP curl 并发最佳实践代码分享
2012/09/05 PHP
php实现解析xml并生成sql语句的方法
2018/02/03 PHP
php实现快速对二维数组某一列进行组装的方法小结
2019/12/04 PHP
js中小数转换整数的方法
2014/01/26 Javascript
js动态创建及移除div的方法
2015/06/03 Javascript
对象题目的一个坑 理解Javascript对象
2015/12/22 Javascript
JavaScript实现的SHA-1加密算法完整实例
2016/02/02 Javascript
javascript实现延时显示提示框特效代码
2016/04/27 Javascript
javascript创建含数字字母的随机字符串方法总结
2016/08/01 Javascript
解决layui动态加载复选框无法选中的问题
2019/09/20 Javascript
再也不怕 JavaScript 报错了,怎么看怎么处理都在这儿
2020/12/09 Javascript
nodejs+express最简易的连接数据库的方法
2020/12/23 NodeJs
[00:12]DAC2018 Miracle-站上中单舞台,他能否再写奇迹?
2018/04/06 DOTA
[01:32]TI珍贵瞬间系列(一)
2020/08/26 DOTA
[35:55]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第一场 12.11
2020/12/13 DOTA
Python中的Numeric包和Numarray包使用教程
2015/04/13 Python
全面解析Python的While循环语句的使用方法
2015/10/13 Python
python dict 字典 以及 赋值 引用的一些实例(详解)
2017/01/20 Python
python中如何使用朴素贝叶斯算法
2017/04/06 Python
Django-Rest-Framework 权限管理源码浅析(小结)
2018/11/12 Python
python dataframe向下向上填充,fillna和ffill的方法
2018/11/28 Python
Python数据可视化实现多种图例代码详解
2020/07/14 Python
python 多线程共享全局变量的优劣
2020/09/24 Python
Python爬虫过程解析之多线程获取小米应用商店数据
2020/11/14 Python
Python 内存管理机制全面分析
2021/01/16 Python
HTML5 visibilityState属性详细介绍和使用实例
2014/05/03 HTML / CSS
旅游管理专业学生求职信
2013/09/28 职场文书
护理专业毕业生自荐信范文
2014/01/05 职场文书
我是特种兵观后感
2015/06/11 职场文书
2016年小学教师政治学习心得体会
2016/01/23 职场文书
分析Python感知线程状态的解决方案之Event与信号量
2021/06/16 Python
Springboot使用Spring Data JPA实现数据库操作
2021/06/30 Java/Android
特别篇动画《总之就是非常可爱 ~制服~》PV公开,2022年夏季播出
2022/04/04 日漫