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

Angular 5中使用AWS SDK调用SES发邮件遇跨域无Access-Control-Allow-Origin头问题

解决Angular 5调用AWS SES出现CORS错误的问题

嘿,我来帮你搞定这个问题!你遇到的请求的资源上不存在'Access-Control-Allow-Origin'头错误,本质上有两个核心原因,咱们一步步拆解解决:

为什么会出现这个问题?

  1. AWS SES的SMTP端点不支持CORS:你用的email-smtp.us-east-1.amazonaws.com是SMTP协议的端点,它本身就不是为前端浏览器的跨域请求设计的,所以不会返回CORS所需的响应头。
  2. 前端硬编码密钥极度危险:你直接在Angular代码里写accessKeyId和secretAccessKey,任何人都能通过浏览器开发者工具看到这些密钥,这会导致你的AWS账号被滥用,产生不必要的费用甚至数据泄露!

正确的解决方案:用后端代理调用SES

最安全也最能解决CORS问题的方式,是把SES的调用逻辑放到你的后端服务里,前端通过API接口和后端通信,由后端去调用AWS SES。

举个Node.js后端的示例

// 后端代码(Node.js + Express)
const AWS = require('aws-sdk');
const express = require('express');
const app = express();
app.use(express.json());

// 建议用环境变量存储密钥,不要硬编码!
AWS.config.update({
  region: 'us-east-1',
  accessKeyId: process.env.AWS_ACCESS_KEY,
  secretAccessKey: process.env.AWS_SECRET_KEY
});

const ses = new AWS.SES({ apiVersion: '2010-12-01' });

// 暴露给前端的邮件发送接口
app.post('/api/send-email', async (req, res) => {
  try {
    const emailParams = {
      Destination: req.body.destination,
      Message: req.body.message,
      Source: req.body.source // 必须是你在SES里验证过的邮箱/域名
    };
    const result = await ses.sendEmail(emailParams).promise();
    res.status(200).json({ success: true, messageId: result.MessageId });
  } catch (err) {
    res.status(500).json({ success: false, error: err.message });
  }
});

app.listen(3000, () => console.log('后端服务运行在3000端口'));

对应的Angular前端代码

// Angular组件代码
import { HttpClient } from '@angular/common/http';
import { Component } from '@angular/core';

@Component({
  selector: 'app-email-sender',
  template: '<button (click)="sendTestEmail()">发送测试邮件</button>'
})
export class EmailSenderComponent {
  constructor(private http: HttpClient) {}

  sendTestEmail() {
    const emailData = {
      source: 'your-verified-email@example.com',
      destination: { ToAddresses: ['recipient@example.com'] },
      message: {
        Subject: { Data: '测试邮件' },
        Body: { Text: { Data: '这是通过后端代理发送的SES邮件' } }
      }
    };

    this.http.post('/api/send-email', emailData)
      .subscribe({
        next: (res) => console.log('邮件发送成功!', res),
        error: (err) => console.error('发送失败:', err)
      });
  }
}

其他可选方案

如果你不想自己写后端,可以考虑用AWS Amplify:它封装了AWS服务的调用逻辑,自动处理CORS和安全认证。你可以通过Amplify创建一个Lambda函数来调用SES,然后前端调用这个Lambda的API端点,这样既安全又不用自己维护后端服务器。

重要提醒

无论用哪种方式,绝对不要在前端代码里硬编码AWS密钥!正确的做法是:

  • 后端用IAM角色(如果部署在AWS EC2、EBS等服务上)或者环境变量存储密钥
  • 前端用Amplify或OAuth等方式获取临时凭证,间接调用服务

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:35:17