[Python][Flask]Web提交测试申请,触发自动化测试流程,测试报告以邮件形式发送到邮箱

Flask服务器的逻辑:接收前端传来的邮箱地址,启动程序,返回程序运行状态

from flask import Flask, render_template, jsonify, request
import time
import threading
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders

def send_email(sender, receiver, subject, body, attachment_path):
    # 创建 MIMEMultipart 对象
    message = MIMEMultipart()
    message['From'] = sender
    message['To'] = receiver
    message['Subject'] = subject

    # 添加正文
    message.attach(MIMEText(body, 'plain'))

    # 添加附件
    with open(attachment_path, 'rb') as attachment:
        part = MIMEBase('application', 'octet-stream')
        part.set_payload(attachment.read())
        encoders.encode_base64(part)
        part.add_header('Content-Disposition', f'attachment; filename="{attachment_path}"')
        message.attach(part)

    # 连接 QQ 邮箱的 SMTP 服务器并发送邮件
    smtp_server = 'smtp.qq.com'
    smtp_port = 465
    smtp_username = ''  # 请替换为实际的 QQ 邮箱用户名
    smtp_password = ''  # 请替换为实际的 QQ 邮箱授权码

    with smtplib.SMTP_SSL(smtp_server, smtp_port) as server:
        server.login(smtp_username, smtp_password)
        server.send_message(message)

    print('邮件发送成功')

# 示例用法
sender = ''  # 发件人 QQ 邮箱地址
receiver = ''  # 收件人邮箱地址
subject = '邮件主题'  # 邮件主题
body = '邮件正文'  # 邮件正文
attachment_path = 'D:\WorkSpace\PythonProject\\file_versions.xlsx'  # 要发送的附件路径
app = Flask(__name__)

# 用于保存执行状态的标志
execute_flag = False

# 用于保存执行状态的邮件地址
email_address = ""


def long_running_task():
    # 模拟一个耗时任务
    global execute_flag
    execute_flag = True
    time.sleep(5)  # 假设任务执行需要 5 秒钟
    execute_flag = False

    # TODO: 在这里可以添加发送邮件的逻辑
    # 使用 email_address 变量获取用户输入的邮件地址
    print(email_address)


send_email(sender, receiver, subject, body, attachment_path)
@app.route('/')
def index():
    return render_template('index.html')


@app.route('/execute', methods=['GET', 'POST'])
def execute():
    global email_address

    if request.method == 'POST':
        email_address = request.args.get('email')

        # 启动一个新线程执行耗时任务
        threading.Thread(target=long_running_task).start()

        return jsonify({'message': '执行请求已提交'})
    else:
        return jsonify({'message': 'GET 方法已响应'})
    print(email_address)

@app.route('/status')
def status():
    global execute_flag
    return jsonify({'execute_flag': execute_flag})


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

网页资源放置到项目下一级的templates目录下面
在这里插入图片描述

<!DOCTYPE html>
<html>
<head>
    <title>执行函数示例</title>
</head>
<body>
    <h1>执行函数示例</h1>
    <label for="email">邮件地址:</label>
    <input type="email" id="email" required>
    <button onclick="executeFunction()">执行函数</button>
    <div id="status">无任务</div>

    <script>
    function executeFunction() {
        var email = document.getElementById("email").value;
        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function() {
            if (xhr.readyState === XMLHttpRequest.DONE) {
                if (xhr.status === 200) {
                    var response = JSON.parse(xhr.responseText);
                    alert(response.message);
                } else {
                    alert("请求执行失败");
                }
            }
        };

        xhr.open("POST", "/execute?email=" + email, true);
        xhr.send();
    }

    function checkStatus() {
        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function() {
            if (xhr.readyState === XMLHttpRequest.DONE) {
                if (xhr.status === 200) {
                    var response = JSON.parse(xhr.responseText);
                    if (response.execute_flag) {
                        document.getElementById("status").innerText = "执行中";
                    } else {
                        document.getElementById("status").innerText = "无任务";
                    }
                } else {
                    alert("获取状态失败");
                }
            }
        };

        xhr.open("GET", "/status", true);
        xhr.send();
    }

    setInterval(checkStatus, 1000);
</script>

</body>
</html>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值