基于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进阶教程之函数对象(函数也是对象)
Aug 30 Python
Python实现过滤单个Android程序日志脚本分享
Jan 16 Python
Django框架中方法的访问和查找
Jul 15 Python
Windows环境下python环境安装使用图文教程
Mar 13 Python
python中itertools模块zip_longest函数详解
Jun 12 Python
详解Python字典小结
Oct 20 Python
python监控nginx端口和进程状态
Sep 06 Python
Python爬虫之urllib基础用法教程
Oct 12 Python
在Python中实现函数重载的示例代码
Dec 12 Python
如何使用Python抓取网页tag操作
Feb 14 Python
Python使用re模块验证危险字符
May 21 Python
详细介绍python类及类的用法
May 31 Python
Python&Matlab实现樱花的绘制
Python OpenCV形态学运算示例详解
4种方法python批量修改替换列表中元素
Apr 07 #Python
Python+OpenCV实现图片中的圆形检测
Python中文分词库jieba(结巴分词)详细使用介绍
基于Python实现对比Exce的工具
Apr 07 #Python
pytorch分类模型绘制混淆矩阵以及可视化详解
You might like
PHP缓冲区用法总结
2016/02/14 PHP
Zend Framework教程之动作的基类Zend_Controller_Action详解
2016/03/07 PHP
Yii2分页的使用及其扩展方法详解
2016/05/23 PHP
php文件操作之文件写入字符串、数组的方法分析
2019/04/15 PHP
使用laravel的migrate创建数据表的方法
2019/09/30 PHP
使用laravel根据用户类型来显示或隐藏字段
2019/10/17 PHP
PHP tp5中使用原生sql查询代码实例
2020/10/28 PHP
JS trim去空格的最佳实践
2011/10/30 Javascript
FireFox下XML对象转化成字符串的解决方法
2011/12/09 Javascript
浅析ajax请求json数据并用js解析(示例分析)
2013/07/13 Javascript
escape编码与unescape解码汉字出现乱码的解决方法
2014/07/02 Javascript
JS功能代码集锦
2016/05/04 Javascript
JS 清除字符串数组中,重复元素的实现方法
2016/05/24 Javascript
jQuery中的on与bind绑定事件区别实例详解
2017/02/28 Javascript
JS实现移动端判断上拉和下滑功能
2017/08/07 Javascript
使用Node搭建reactSSR服务端渲染架构
2018/08/30 Javascript
express 项目分层实践详解
2018/12/10 Javascript
vue的列表交错过渡实现代码示例
2019/05/05 Javascript
小程序中手机号识别的示例
2020/12/14 Javascript
跟老齐学Python之复习if语句
2014/10/02 Python
Python虚拟环境virtualenv的安装与使用详解
2017/05/28 Python
对python3中的RE(正则表达式)-详细总结
2019/07/23 Python
在python中logger setlevel没有生效的解决
2020/02/21 Python
python GUI库图形界面开发之PyQt5输入对话框QInputDialog详细使用方法与实例
2020/02/27 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
2020/06/24 Python
简单了解Python字典copy与赋值的区别
2020/09/16 Python
Python Web项目Cherrypy使用方法镜像
2020/11/05 Python
python利用appium实现手机APP自动化的示例
2021/01/26 Python
VSCode中autopep8无法运行问题解决方案(提示Error: Command failed,usage)
2021/03/02 Python
基于html5 canvas做批改作业的小插件
2020/05/20 HTML / CSS
Nike澳大利亚官网:Nike.com (AU)
2019/06/03 全球购物
如何打开WebSphere远程debug
2014/10/10 面试题
一句话工作感言
2014/03/01 职场文书
优秀的应届生自荐信
2014/05/23 职场文书
golang内置函数len的小技巧
2021/07/25 Golang
使用MybatisPlus打印sql语句
2022/04/22 SQL Server