基于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中封装GObject模块进行图形化程序编程的教程
Apr 14 Python
python使用nntp读取新闻组内容的方法
May 08 Python
Python内置函数——__import__ 的使用方法
Nov 24 Python
python list删除元素时要注意的坑点分享
Apr 18 Python
查看TensorFlow checkpoint文件中的变量名和对应值方法
Jun 14 Python
详解python异步编程之asyncio(百万并发)
Jul 07 Python
python 定时器,轮询定时器的实例
Feb 20 Python
Django网络框架之创建虚拟开发环境操作示例
Jun 06 Python
Python for循环与getitem的关系详解
Jan 02 Python
Python调用Windows API函数编写录音机和音乐播放器功能
Jan 05 Python
Python 创建TCP服务器的方法
Jul 28 Python
python3通过subprocess模块调用脚本并和脚本交互的操作
Dec 05 Python
Python&Matlab实现樱花的绘制
Python OpenCV形态学运算示例详解
4种方法python批量修改替换列表中元素
Apr 07 #Python
Python+OpenCV实现图片中的圆形检测
Python中文分词库jieba(结巴分词)详细使用介绍
基于Python实现对比Exce的工具
Apr 07 #Python
pytorch分类模型绘制混淆矩阵以及可视化详解
You might like
php自定义urlencode,urldecode函数实例
2015/03/24 PHP
[原创]php简单防盗链验证实现方法
2016/07/09 PHP
PHP5.5新特性之yield理解与用法实例分析
2019/01/11 PHP
PHP 枚举类型的管理与设计知识点总结
2020/02/13 PHP
javascript取消文本选定的实现代码
2010/11/14 Javascript
初学js插入节点appendChild insertBefore使用方法
2011/07/04 Javascript
当自定义数据属性为json格式字符串时jQuery的data api问题探讨
2013/02/18 Javascript
JavaScript的String字符串对象常用操作总结
2016/05/26 Javascript
JS DOMReady事件的六种实现方法总结
2016/11/23 Javascript
Bootstrap选项卡动态切换效果
2016/11/28 Javascript
微信小程序开发之圆形菜单 仿建行圆形菜单实例
2016/12/12 Javascript
[Bootstrap-插件使用]Jcrop+fileinput组合实现头像上传功能实例代码
2016/12/20 Javascript
canvas实现钟表效果
2017/02/13 Javascript
js代码延迟一定时间后执行一个函数的实例
2017/02/15 Javascript
分享十三个最佳JavaScript数据网格库
2017/04/07 Javascript
原生nodejs使用websocket代码分享
2018/04/07 NodeJs
js实现选项卡效果
2020/03/07 Javascript
JS中类的静态方法,静态变量,实例方法,实例变量区别与用法实例分析
2020/03/14 Javascript
[00:09]DOTA2新版本PA至宝特效动作展示
2014/11/19 DOTA
python字符串的常用操作方法小结
2016/05/21 Python
Python ldap实现登录实例代码
2016/09/30 Python
Python中动态创建类实例的方法
2017/03/24 Python
PyCharm代码整体缩进,反向缩进的方法
2018/06/25 Python
python 多线程中子线程和主线程相互通信方法
2018/11/09 Python
python 多线程重启方法
2019/02/18 Python
Python语言进阶知识点总结
2019/05/28 Python
numpy:np.newaxis 实现将行向量转换成列向量
2019/11/30 Python
python闭包、深浅拷贝、垃圾回收、with语句知识点汇总
2020/03/11 Python
PyQt5中向单元格添加控件的方法示例
2020/03/24 Python
完美解决pycharm 不显示代码提示问题
2020/06/02 Python
中国电子产品外贸网站:MiniIntheBox
2017/02/06 全球购物
澳大利亚家具和家居用品在线商店:Interiors Online
2018/03/05 全球购物
英国家用电器折扣网站:Electrical Discount UK
2018/09/17 全球购物
后勤园长自我鉴定
2013/10/17 职场文书
乡镇挂职心得体会
2014/09/04 职场文书
通过feDisplacementMap和feImage实现水波特效
2022/04/24 HTML / CSS