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>