基于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写的windows服务不能启动的问题
Apr 15 Python
Python的包管理器pip更换软件源的方法详解
Jun 20 Python
Python设置默认编码为utf8的方法
Jul 01 Python
解决pip install xxx报错SyntaxError: invalid syntax的问题
Nov 30 Python
Python基于BeautifulSoup和requests实现的爬虫功能示例
Aug 02 Python
python基于gevent实现并发下载器代码实例
Nov 01 Python
DJango的创建和使用详解(默认数据库sqlite3)
Nov 18 Python
Pandas 解决dataframe的一列进行向下顺移问题
Dec 27 Python
python实现银行实战系统
Feb 26 Python
浅析pip安装第三方库及pycharm中导入第三方库的问题
Mar 10 Python
python实现数据结构中双向循环链表操作的示例
Oct 09 Python
python如何编写类似nmap的扫描工具
Nov 06 Python
Python&Matlab实现樱花的绘制
Python OpenCV形态学运算示例详解
4种方法python批量修改替换列表中元素
Apr 07 #Python
Python+OpenCV实现图片中的圆形检测
Python中文分词库jieba(结巴分词)详细使用介绍
基于Python实现对比Exce的工具
Apr 07 #Python
pytorch分类模型绘制混淆矩阵以及可视化详解
You might like
判“新”函数:得到今天与明天的秒数
2006/10/09 PHP
php ZipArchive压缩函数详解实例
2013/11/06 PHP
PHP eval函数使用介绍
2013/12/08 PHP
php实现斐波那契数列的简单写法
2014/07/19 PHP
php中限制ip段访问、禁止ip提交表单的代码分享
2014/08/22 PHP
php防止sql注入之过滤分页参数实例
2014/11/03 PHP
一个非常完美的读写ini格式的PHP配置类分享
2015/02/12 PHP
Laravel学习教程之从入口到输出过程详解
2017/08/27 PHP
laravel 实现上传图片到本地和前台访问示例
2019/10/21 PHP
使用原生javascript创建通用表单验证——更锋利的使用dom对象
2011/09/13 Javascript
javascript重复绑定事件造成的后果说明
2013/03/02 Javascript
jquery中插件实现自动添加用户的具体代码
2013/11/15 Javascript
js中判断对象是否为空的三种实现方法
2013/12/23 Javascript
JavaScript中创建对象和继承示例解读
2014/02/12 Javascript
jQuery多级弹出菜单插件ZoneMenu
2014/12/18 Javascript
angular2使用简单介绍
2016/03/01 Javascript
Bootstrap模态框禁用空白处点击关闭
2016/10/20 Javascript
js模糊查询实例分享
2016/12/26 Javascript
Vue项目组件化工程开发实践方案
2018/01/09 Javascript
使用NestJS开发Node.js应用的方法
2018/12/03 Javascript
javascript 原型与原型链的理解及实例分析
2019/11/23 Javascript
[01:02:45]完美世界DOTA2联赛 LBZS vs Forest 第三场 11.07
2020/11/09 DOTA
微信跳一跳自动运行python脚本
2018/01/08 Python
Python实现检测文件MD5值的方法示例
2018/04/11 Python
详解python中list的使用
2019/03/15 Python
python pymysql链接数据库查询结果转为Dataframe实例
2020/06/05 Python
Keras: model实现固定部分layer,训练部分layer操作
2020/06/28 Python
tensorflow下的图片标准化函数per_image_standardization用法
2020/06/30 Python
Python从文件中读取数据的方法步骤
2020/11/18 Python
阿联酋最好的手机、电子产品和家用电器网上商店:Eros Digital Home
2020/08/09 全球购物
如何整合JQuery和Prototype
2014/01/31 面试题
营销总经理岗位职责
2014/02/02 职场文书
陈欧的广告词
2014/03/18 职场文书
2014年最新版离婚协议书范本
2014/11/25 职场文书
资产移交协议书
2016/03/24 职场文书
Java 定时任务技术趋势简介
2022/05/04 Java/Android