基于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的requests网络编程包使用教程
Jul 11 Python
Python3简单实例计算同花的概率代码
Dec 06 Python
selenium获取当前页面的url、源码、title的方法
Jun 12 Python
Python字典对象实现原理详解
Jul 01 Python
用Python抢火车票的简单小程序实现解析
Aug 14 Python
django重新生成数据库中的某张表方法
Aug 28 Python
wxPython实现列表增删改查功能
Nov 19 Python
python orm 框架中sqlalchemy用法实例详解
Feb 02 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
May 26 Python
python subprocess pipe 实时输出日志的操作
Dec 05 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
Jan 25 Python
如何判断pytorch是否支持GPU加速
Jun 01 Python
Python&Matlab实现樱花的绘制
Python OpenCV形态学运算示例详解
4种方法python批量修改替换列表中元素
Apr 07 #Python
Python+OpenCV实现图片中的圆形检测
Python中文分词库jieba(结巴分词)详细使用介绍
基于Python实现对比Exce的工具
Apr 07 #Python
pytorch分类模型绘制混淆矩阵以及可视化详解
You might like
关于PHP中的Class的几点个人看法
2006/10/09 PHP
把PHP安装为Apache DSO
2006/10/09 PHP
php解压文件代码实现php在线解压
2014/02/13 PHP
基于PHP+jQuery+MySql实现红蓝(顶踩)投票代码
2015/08/25 PHP
PHP去除字符串最后一个字符的三种方法实例
2017/03/01 PHP
PHP设计模式之状态模式定义与用法详解
2018/04/02 PHP
javascript radio 联动效果
2009/03/04 Javascript
javascript Prototype 对象扩展
2009/05/15 Javascript
js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
2012/12/27 Javascript
jQuery实现可展开合拢的手风琴面板菜单
2015/09/15 Javascript
js倒计时简单实现代码
2016/08/11 Javascript
微信JS-SDK自定义分享功能实例详解【分享给朋友/分享到朋友圈】
2016/11/25 Javascript
Vue.js在使用中的一些注意知识点
2017/04/29 Javascript
详解JavaScript数组过滤相同元素的5种方法
2017/05/23 Javascript
详解vue中使用express+fetch获取本地json文件
2017/10/10 Javascript
vue实现前进刷新后退不刷新效果
2018/01/26 Javascript
Nginx设置为Node.js的前端服务器方法总结
2019/03/27 Javascript
vue-cli history模式实现tomcat部署报404的解决方式
2019/09/06 Javascript
[47:02]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS paiN
2018/03/30 DOTA
零基础写python爬虫之使用Scrapy框架编写爬虫
2014/11/07 Python
Django应用程序中如何发送电子邮件详解
2017/02/04 Python
python实现决策树C4.5算法详解(在ID3基础上改进)
2017/05/31 Python
python merge、concat合并数据集的实例讲解
2018/04/12 Python
解读python logging模块的使用方法
2018/04/17 Python
详解Python locals()的陷阱
2019/03/26 Python
CSS3中媒体查询结合rem布局适配手机屏幕
2019/06/10 HTML / CSS
HTML5中实现拖放效果无须借助javascript
2012/12/26 HTML / CSS
HTML5新增属性data-*和js/jquery之间的交互及注意事项
2017/08/08 HTML / CSS
职业技术学校毕业生推荐信
2013/12/03 职场文书
青年文明号事迹材料
2014/01/18 职场文书
企业出纳岗位职责
2014/03/12 职场文书
审计班子对照检查材料
2014/08/27 职场文书
2014年幼儿园安全工作总结
2014/11/10 职场文书
详解PHP设计模式之依赖注入模式
2021/05/25 PHP
MySQL中int (10) 和 int (11) 的区别
2022/01/22 MySQL
JavaScript实现音乐播放器
2022/08/14 Javascript