【问题标题】:Is it possible to send emails via AWS SES on AWS LightSail instance?是否可以通过 AWS LightSail 实例上的 AWS SES 发送电子邮件?
【发布时间】:2023-02-02 03:29:12
【问题描述】:

我已尝试使用以下 Node.js JavaScript AWS SDK 代码通过 AWS SES 在我的 LightSail 实例上发送电子邮件,但失败并显示以下错误消息。电子邮件发送代码在我的开发计算机上运行良好。 (邮件发送码来自https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/ses-examples-sending-email.html.

(代码在这里)

import { readFile } from 'fs/promises';
import * as path from 'path';
import { SESClient } from "@aws-sdk/client-ses";

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

const awsConfigFileFullName = "aws_config.json";

let awsConfigFileFullPath = path.join(__dirname, awsConfigFileFullName);

const awsConfig = await readFile(awsConfigFileFullPath).then(json => JSON.parse(json)).catch(() => null);

aws_ses_client = new SESClient({ region: awsConfig.region, accessKeyId: awsConfig.accessKeyId, secretAccessKey: awsConfig.secretAccessKey });

const createSendEmailCommand = (toAddress, fromAddress, htmlContent, textContent, emailSubject) => {
  return new SendEmailCommand({
    Destination: {
      /* required */
      CcAddresses: [
        /* more items */
      ],
      ToAddresses: [
        toAddress,
        /* more To-email addresses */
      ],
    },
    Message: {
      /* required */
      Body: {
        /* required */
        Html: {
          Charset: "UTF-8",
          Data: htmlContent,
        },
        Text: {
          Charset: "UTF-8",
          Data: textContent,
        },
      },
      Subject: {
        Charset: "UTF-8",
        Data: emailSubject,
      },
    },
    Source: emailSenderName + '<' + fromAddress + '>',
    ReplyToAddresses: [
      /* more items */
    ],
  });
};

const sendEmailCommand = createSendEmailCommand(
recipientEmailAddress,
senderEmailAddress,
htmlEmailContent,
textEmailContent,
emailSubject
);

try {
await aws_ses_client.send(sendEmailCommand);
} catch (e) {
console.error("Failed to send email.", e);
}

(此处错误)

拒绝访问:资源上的用户 arn:aws:sts::(some number):assumed-role/AmazonLightsailInstanceRole/i-(some alphanumeric number)is not authorized to perform ses:SendEmail' `arn:aws:ses:us-east-1:(一些数字):身份/(收件人电子邮件 地址)'

在网上搜索了一下这个问题后,以为错误是由于Lightsail实例限制(https://aws.amazon.com/premiumsupport/knowledge-center/lightsail-port-25-throttle/)的25端口限制导致的,我向AWS发送限制删除请求,但请求被拒绝,告诉我“考虑寻找”进入简单电子邮件服务”。我发送了一条回复,询问是否可以在 LightSail 实例上通过 AWS SES 发送电子邮件,但收到的回复是“我们无法批准您的请求”;我觉得第二个回复要么是自动回复的,要么甚至没有被查看电子邮件的人仔细阅读过。

我在我的 LightSail 网络服务器上安装了一个多站点 WordPress,它可以使用 WP Mail SMTP 插件通过 AWS SES 发送电子邮件,使用 SMTP 端口 587 进行 TLS 加密。我认为这证明可以通过 AWS SES 在 LightSail 实例上发送电子邮件.我的 WordPress 每天都会使用我的 AWS SES SMTP 凭证在我的 LightSail 网络服务器上发送电子邮件;因此,也许必须在 LightSail 实例电子邮件发送代码中直接联系 AWS SES SMTP 服务器才能发送电子邮件,而不是在代码中使用经过身份验证的 SES 客户端对象?

我在想,也许假定的角色 AmazonLightsailInstanceRole 不允许发送 AWS SES 电子邮件。我检查了我的 AWS IAM Web 控制台,没有名为 AmazonLightsailInstanceRole 的角色;看起来我无法修改代入角色 AmazonLightsailInstanceRole 的策略。

是否可以将 AWS SES 电子邮件发送权限授予代入角色 AmazonLightsailInstanceRole?如果是这样,如何?

是否可以在 AWS LightSail 实例上通过 AWS SES 发送电子邮件?如果是这样,如何在 Node.js JavaScript AWS SDK 代码中完成?任何验证、参考和/或指示都会非常有帮助。

【问题讨论】:

    标签: amazon-web-services amazon-ses amazon-lightsail


    【解决方案1】:

    听起来像是 IAM 问题 - 如果您不传递自己的凭据,则实例角色是后备选项。代码的第 6..8 行正在寻找一个包含 API 密钥和秘密以及默认区域的文件 (aws_config.json),然后在第 9 行将这些值传递给SESClient。当您最终致电 aws_ses_client.send(sendEmailCommand) 时,它将使用 lightsail 提供的实例默认凭据,它无法访问您的 aws 帐户中的资源,如 SES。检查以下内容:

    • 文件aws_config.json是否存在?
    • 它是否包含您 AWS 账户中有效用户的 api 密钥/秘密/区域?
    • 该用户是否有合适的 IAM 策略,包括 ses:SendEmail 和可能的其他 iam 权限?

    仅供参考 catch(() =&gt; null) 可能隐藏了一个错误 - 您应该在 catch() 语句中使用 console.log 来写入错误(至少在调试时)。

    【讨论】:

      猜你喜欢
      • 2020-11-25
      • 2016-11-17
      • 1970-01-01
      • 2015-12-13
      • 2014-07-12
      • 2018-07-18
      • 1970-01-01
      • 2020-06-11
      • 2022-05-23
      相关资源
      最近更新 更多