You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

React项目调用Python邮件脚本及部署至Dreamhost的技术咨询

解决React婚礼网站调用Python邮件脚本并部署到Dreamhost的方案

首先肯定地说,Flask完全适合你的需求——它是轻量级的Python Web框架,刚好能帮你把邮件脚本包装成一个可被React调用的API接口,完美替代之前的Ajax+PHP方案。下面一步步来:

一、把邮件脚本改成Flask API接口

直接调用本地Python脚本在生产环境既不安全也不好传参,我们把它改成一个接收POST请求的接口,从请求里获取用户表单数据:

  1. 先创建Flask项目结构:
wedding-email-api/
├── venv/                  # 虚拟环境
├── app.py                 # 主应用文件
└── wsgi.py                # Dreamhost部署用的WSGI入口
  1. 编写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)
  1. 安装依赖:
    先创建并激活虚拟环境:
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应用部署,步骤如下:

  1. 登录Dreamhost面板,找到「Domains」→「Manage Domains」,选择你的域名,点击「Edit」,在「Web Options」里开启「Passenger」(Dreamhost用Passenger托管WSGI应用)。

  2. 通过FTP或者SSH把你的wedding-email-api文件夹上传到服务器的~/your-domain.com/目录下(比如~/wedding-site.com/email-api/)。

  3. 创建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'
  1. 设置虚拟环境:
    SSH连接到服务器,进入你的项目目录,激活虚拟环境,然后把依赖安装到虚拟环境里(或者生成requirements.txt上传后安装):
cd ~/wedding-site.com/email-api/
source venv/bin/activate
pip install flask flask-cors
  1. 重启Passenger:
    在服务器上运行:
touch tmp/restart.txt

Passenger会自动检测到这个文件并重启应用。

  1. 测试接口:
    用Postman或者浏览器发送POST请求到https://your-domain.com/send-wedding-confirmation,带上表单参数,看是否能成功发送邮件。

一些注意事项

  • 安全问题:绝对不要把邮箱密码硬编码到代码里,用环境变量或者Dreamhost的秘密管理功能。
  • 邮箱设置:很多邮箱(比如Gmail)需要开启「应用密码」或者允许低安全性应用(不推荐),建议用专门的企业邮箱或者支持SMTP的邮箱服务。
  • 错误处理:在Flask接口里要捕获所有可能的异常,比如SMTP连接失败、参数缺失等,给React返回清晰的错误信息。

内容的提问来源于stack exchange,提问作者Sharpion

火山引擎 最新活动