React项目调用Python邮件脚本及部署至Dreamhost的技术咨询
解决React婚礼网站调用Python邮件脚本并部署到Dreamhost的方案
首先肯定地说,Flask完全适合你的需求——它是轻量级的Python Web框架,刚好能帮你把邮件脚本包装成一个可被React调用的API接口,完美替代之前的Ajax+PHP方案。下面一步步来:
一、把邮件脚本改成Flask API接口
直接调用本地Python脚本在生产环境既不安全也不好传参,我们把它改成一个接收POST请求的接口,从请求里获取用户表单数据:
- 先创建Flask项目结构:
wedding-email-api/ ├── venv/ # 虚拟环境 ├── app.py # 主应用文件 └── wsgi.py # Dreamhost部署用的WSGI入口
- 编写
app.py代码:
#!/usr/bin/python # -*- coding: utf-8 -*- from flask import Flask, request, jsonify from flask_cors import CORS import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText import os app = Flask(__name__) CORS(app) # 解决React跨域问题 # 从环境变量取敏感信息,不要硬编码! FROM_EMAIL = os.getenv('FROM_EMAIL') TO_EMAIL = os.getenv('TO_EMAIL') EMAIL_PASSWORD = os.getenv('EMAIL_PASSWORD') SMTP_SERVER = os.getenv('SMTP_SERVER') SMTP_PORT = int(os.getenv('SMTP_PORT')) @app.route('/send-wedding-confirmation', methods=['POST']) def send_wedding_confirmation(): try: # 从React请求里获取表单数据 form_data = request.form guest_name = form_data.get('name') guest_phone = form_data.get('phone') attend_status = form_data.get('attendStatus') note = form_data.get('note', '') # 构建邮件内容 msg = MIMEMultipart() msg['From'] = FROM_EMAIL msg['To'] = TO_EMAIL msg['Subject'] = f"婚礼确认:{guest_name} {attend_status}" body = f""" 收到新的婚礼确认信息: 姓名:{guest_name} 电话:{guest_phone} 是否出席:{attend_status} 备注:{note} """ msg.attach(MIMEText(body, 'plain', 'utf-8')) # 发送邮件 server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT) server.starttls() server.login(FROM_EMAIL, EMAIL_PASSWORD) text = msg.as_string() server.sendmail(FROM_EMAIL, TO_EMAIL, text) server.quit() return jsonify({"status": "success", "message": "邮件发送成功"}) except Exception as e: return jsonify({"status": "error", "message": str(e)}), 500 if __name__ == '__main__': app.run(debug=True)
- 安装依赖:
先创建并激活虚拟环境:
python -m venv venv source venv/bin/activate # Linux/Mac # Windows用 venv\Scripts\activate
然后安装需要的包:
pip install flask flask-cors
二、React端调用这个API
在你的React表单提交函数里,用fetch或者axios发送POST请求:
示例用fetch的代码:
const handleSubmit = async (e) => { e.preventDefault(); const formData = new FormData(); formData.append('name', name); formData.append('phone', phone); formData.append('attendStatus', attendStatus); formData.append('note', note); try { const response = await fetch('https://your-dreamhost-domain.com/send-wedding-confirmation', { method: 'POST', body: formData }); const result = await response.json(); if (result.status === 'success') { alert('确认信息已提交!'); // 重置表单 } else { alert('提交失败,请稍后重试:' + result.message); } } catch (err) { alert('网络错误,请检查连接'); } };
三、部署到Dreamhost服务器
Dreamhost支持Python WSGI应用部署,步骤如下:
登录Dreamhost面板,找到「Domains」→「Manage Domains」,选择你的域名,点击「Edit」,在「Web Options」里开启「Passenger」(Dreamhost用Passenger托管WSGI应用)。
通过FTP或者SSH把你的
wedding-email-api文件夹上传到服务器的~/your-domain.com/目录下(比如~/wedding-site.com/email-api/)。创建
wsgi.py文件,内容如下:
import os import sys # 添加项目路径到Python路径 sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) # 导入Flask应用 from app import app as application # 设置环境变量(也可以在Dreamhost面板的「Shell Variables」里设置) os.environ['FROM_EMAIL'] = 'your-from-email@example.com' os.environ['TO_EMAIL'] = 'organizer-email@example.com' os.environ['EMAIL_PASSWORD'] = 'your-email-app-password' # 建议用邮箱的应用密码,不是登录密码 os.environ['SMTP_SERVER'] = 'smtp.example.com' os.environ['SMTP_PORT'] = '587'
- 设置虚拟环境:
SSH连接到服务器,进入你的项目目录,激活虚拟环境,然后把依赖安装到虚拟环境里(或者生成requirements.txt上传后安装):
cd ~/wedding-site.com/email-api/ source venv/bin/activate pip install flask flask-cors
- 重启Passenger:
在服务器上运行:
touch tmp/restart.txt
Passenger会自动检测到这个文件并重启应用。
- 测试接口:
用Postman或者浏览器发送POST请求到https://your-domain.com/send-wedding-confirmation,带上表单参数,看是否能成功发送邮件。
一些注意事项
- 安全问题:绝对不要把邮箱密码硬编码到代码里,用环境变量或者Dreamhost的秘密管理功能。
- 邮箱设置:很多邮箱(比如Gmail)需要开启「应用密码」或者允许低安全性应用(不推荐),建议用专门的企业邮箱或者支持SMTP的邮箱服务。
- 错误处理:在Flask接口里要捕获所有可能的异常,比如SMTP连接失败、参数缺失等,给React返回清晰的错误信息。
内容的提问来源于stack exchange,提问作者Sharpion




