基于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 相关文章推荐
linux系统使用python监控apache服务器进程脚本分享
Jan 15 Python
Python实现从订阅源下载图片的方法
Mar 11 Python
Python字典数据对象拆分的简单实现方法
Dec 05 Python
Python多进程multiprocessing.Pool类详解
Apr 27 Python
django多对多表的创建,级联删除及手动创建第三张表
Jul 25 Python
python实现静态服务器
Sep 05 Python
softmax及python实现过程解析
Sep 30 Python
Python numpy数组转置与轴变换
Nov 15 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
May 21 Python
使用python matploblib库绘制准确率,损失率折线图
Jun 16 Python
python 实现"神经衰弱"翻牌游戏
Nov 09 Python
2020年10款优秀的Python第三方库,看看有你中意的吗?
Jan 12 Python
Python&Matlab实现樱花的绘制
Python OpenCV形态学运算示例详解
4种方法python批量修改替换列表中元素
Apr 07 #Python
Python+OpenCV实现图片中的圆形检测
Python中文分词库jieba(结巴分词)详细使用介绍
基于Python实现对比Exce的工具
Apr 07 #Python
pytorch分类模型绘制混淆矩阵以及可视化详解
You might like
Laravel关联模型中过滤结果为空的结果集(has和with区别)
2018/10/18 PHP
基于jquery的兼容各种浏览器的iframe自适应高度的脚本
2010/08/13 Javascript
javascript Array.prototype.slice使用说明
2010/10/11 Javascript
表单切换,用回车键替换Tab健(不支持IE)
2011/07/20 Javascript
再谈JavaScript线程
2015/07/10 Javascript
jQuery代码实现发展历程时间轴特效
2015/07/30 Javascript
理解javascript中Map代替循环
2016/02/26 Javascript
深入理解事件冒泡(Bubble)和事件捕捉(capture)
2016/05/28 Javascript
JavaScript蒙板(model)功能的简单实现代码
2016/08/04 Javascript
详解使用vue-router进行页面切换时滚动条位置与滚动监听事件
2017/03/08 Javascript
JS实现的简单拖拽功能示例
2017/03/13 Javascript
微信小程序tabBar模板用法实例分析【附demo源码下载】
2017/11/28 Javascript
vue如何进行动画的封装
2018/09/26 Javascript
微信小程序template模板与component组件的区别和使用详解
2019/05/22 Javascript
基于vue实现图片验证码倒计时60s功能
2019/12/10 Javascript
Servlet返回的数据js解析2种方法
2019/12/12 Javascript
使用Python操作Elasticsearch数据索引的教程
2015/04/08 Python
python脚本内运行linux命令的方法
2015/07/02 Python
python linecache 处理固定格式文本数据的方法
2019/01/08 Python
用python写一个定时提醒程序的实现代码
2019/07/22 Python
python求质数列表的例子
2019/11/24 Python
TFRecord格式存储数据与队列读取实例
2020/01/21 Python
Python3 元组tuple入门基础
2020/02/09 Python
python数据预处理 :样本分布不均的解决(过采样和欠采样)
2020/02/29 Python
橄榄树药房:OLIVEDA
2019/09/01 全球购物
美国最大和最受信任的二手轮胎商店:Bestusedtires.com
2020/06/02 全球购物
日本AOKI官方商城:AOKI西装
2020/06/11 全球购物
高中毕业自我鉴定范文
2013/10/02 职场文书
公司人力资源的自我评价
2014/01/02 职场文书
社区学雷锋活动策划方案
2014/01/30 职场文书
同学会主持词
2014/03/18 职场文书
安全施工标语
2014/06/07 职场文书
学习优秀党务工作者先进事迹材料思想报告
2014/09/17 职场文书
学校光盘行动倡议书
2015/04/28 职场文书
Mysql MVCC机制原理详解
2021/04/20 MySQL
Python入门之使用pandas分析excel数据
2021/05/12 Python