You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React.js集成Amazon SES在Safari中无法运行的问题求助

解决Safari中使用AWS SES发送邮件的ReadableByteStreamController未实现错误

问题原因

这个错误源于Safari对现代Web Streams API的支持不完善,而AWS SDK v3(@aws-sdk/client-ses)依赖该API实现网络请求,导致在Safari环境下无法正常运行。

解决方案

方案1:添加Web Streams Polyfill

为Safari补充缺失的API支持:

  1. 安装polyfill包:
npm install web-streams-polyfill
  1. 在React项目的入口文件(如index.js或App.js)最顶部引入:
import 'web-streams-polyfill';

引入后重新构建项目,再在Safari中测试即可。

方案2:改用AWS SDK v2

AWS SDK v2对旧浏览器兼容性更好,不依赖Web Streams API:

  1. 卸载v3的SES客户端:
npm uninstall @aws-sdk/client-ses
  1. 安装v2的AWS SDK:
npm install aws-sdk
  1. 修改代码适配v2:
const AWS = require('aws-sdk');

// 配置AWS
AWS.config.update({
  region: regionVal,
  credentials: {
    accessKeyId: accessKey,
    secretAccessKey: secretKey,
  }
});

const ses = new AWS.SES();

// 表单组件内的handleSubmit逻辑调整
const handleSubmit = async e => {
  e.preventDefault();
  
  const emailHtml = await render(<Email data={emailData} />);
  
  const params = {
    Source: 'email@email.com',
    Destination: {
      ToAddresses: ['email@email.com'],
    },
    Message: {
      Body: {
        Html: {
          Charset: 'UTF-8',
          Data: emailHtml,
        },
      },
      Subject: {
        Charset: 'UTF-8',
        Data: 'Form',
      },
    },
  };

  try {
    await ses.sendEmail(params).promise(); // v2需调用.promise()获取Promise
    console.log('Email sent successfully');
  } catch (error) {
    console.error('Error sending email:', error);
  }
}

关键安全提醒

绝对不要在前端代码中暴露AWS的accessKey和secretKey! 当前代码直接把凭证写在前端,任何用户都能通过浏览器开发者工具获取这些密钥,进而滥用你的AWS资源(比如发送垃圾邮件、产生高额费用)。

正确的做法是:

  • 搭建一个后端接口(比如用Node.js/Express、Python/Flask等)
  • 前端将表单数据发送到这个后端接口
  • 后端使用AWS SES发送邮件,AWS凭证仅保存在后端环境变量中

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 05:52:42