节点 AWS-SDK SES 电子邮件发送验证失败

Posted

技术标签:

【中文标题】节点 AWS-SDK SES 电子邮件发送验证失败【英文标题】:Node AWS-SDK SES email send verification fail 【发布时间】:2018-05-29 20:37:49 【问题描述】:

我正在使用 aws-sdk 和 Node 发送 AWS SES 电子邮件,并且我能够使用 AWS CLI 成功发送电子邮件。但是,在我的 Node 脚本中,由于某种原因,我的电子邮件验证失败。

下面是代码:

const aws = require('aws-sdk')
const ses = new aws.SES()

const message = 
        Destination: 
            ToAddresses: ['example@example.com]
        ,
        Message: 
            Body: 
                Text: 
                    Charset: 'UTF-8',
                    Data: 'Test body'
                
            ,
            Subject: 
                Charset: 'UTF-8',
                Data: 'Test subject'
            
        ,
        Source: 'example@example.com'
    

ses.sendEmail(message, function (err, data) 
    if (err) console.log(err);
    else console.log(data);
);

以下是错误:

message: 'Email address is not verified. The following identities failed the check in region US-EAST-1: example@example.com',
  code: 'MessageRejected',
  time: 2017-12-15T15:37:26.312Z,
  requestId: 'random-id',
  statusCode: 400,
  retryable: false,
  retryDelay: 15.030260565173382

请帮忙!谢谢!

【问题讨论】:

健全性检查:我想您并没有真正使用example@example.com——您的实际电子邮件地址是在 us-east-1 地区经过 SES 验证的发件人吗? @AnthonyNeace 感谢您的提问!是的,它是 use-east-1,我能够从终端使用 AWS CLI 成功发送一封电子邮件。 下一个故障排除步骤:您是否仍处于 SES 沙盒模式,在该模式下,收件人电子邮件地址可能还需要是该地区的 SES 验证发件人? @AnthonyNeace 我为发件人和收件人设置了相同的电子邮件地址,并且使用 AWS CLI,我能够收到电子邮件。 【参考方案1】:

每AWS troubleshooting documentation:

电子邮件地址未经验证。以下身份未能通过区域 (region) 签入:(identity1)、(identity2)、(identity3) — 您正在尝试从尚未使用 Amazon SES 验证的电子邮件地址或域发送电子邮件。此错误可能适用于“From”、“Source”、“Sender”或“Return-Path”地址。

如果您的账户仍在沙盒中,您还必须验证每个收件人电子邮件地址,Amazon SES 邮箱模拟器提供的收件人除外。如果 Amazon SES 无法显示所有失败的身份,则错误消息以省略号结尾。

注意:Amazon SES 在多个 AWS 区域具有终端节点,并且每个 AWS 区域的电子邮件地址验证状态是不同的。您必须为您要使用的 AWS 区域中的每个发件人完成验证过程。

我强烈怀疑您的应用程序配置与您用于通过 CLI 成功发送测试电子邮件的配置不是 100% 匹配。

检查以下配置:

“源”地址必须是 us-east-1 区域中经过 SES 验证的发件人。检查您希望从中发送电子邮件的源地址是否是您打算发送电子邮件的每个区域中经过验证的发件人。 如果启用了 SES 沙盒模式,电子邮件收件人(“ToAddresses”值)也必须是 us-east-1 区域中经过 SES 验证的发件人。有关如何删除此限制的说明,请参阅“Moving Out of the Amazon SES Sandbox”。 确保您正在测试的所有客户端都在同一区域中进行测试,因为每个区域的配置都需要不同。错误消息提到应用程序试图在 us-east-1 中命中 SES,因此请使用 --region 选项再次明确地在 us-east-1 区域中执行 CLI 测试。如果使用 CLI 默认区域,则初始 CLI 测试可能存在缺陷,而该区域恰好不是 us-east-1。 如果以上所有内容都正确,请仔细检查您的节点应用程序。确保 SES 客户端已针对您希望使用的区域进行配置,并且客户端正在正确地将您希望发送到 SES 请求的电子邮件写入。

进一步阅读

AWS Documentation - Verifying Email Addresses and Domains in Amazon SES AWS Documentation - Sending Email Using Amazon SES

【讨论】:

非常感谢!我一定会检查所有这些步骤【参考方案2】:

这是我使用 node.js 和 express、ejs 和 npm 包 node-ses 的代码

上面提到了解决方案,但很容易错过。这是第三部分,在密钥和秘密之后,对亚马逊的回调 - 网址需要在那里并且需要为您的地区定制,在我的例子中是 eu-west-1,另外两个选择是 us-east-1或 us-west-2。

在 IAM - 用户中找到了密钥和密钥。一旦您设置了具有编程访问权限和 AmazonSESFullAccess 权限的用户。选择您的用户,然后选择“安全凭据”选项卡。向下滑动并单击创建访问密钥。

您只能访问一次您的秘密密码。当您获得访问权限时,突出显示秘密密码,将其复制并与您的密钥一起安全地粘贴到某处。

您的发件人电子邮件必须与在 AWS SES 页面上注册的域相关。如果您不使用 Route 53 进行托管,您还需要在 AWS SES 页面上注册并验证电子邮件。

这是路由器代码:

app.post('/email', function(req, res) 
        var ses = require('node-ses'), 
          client = ses.createClient( 
             key: 'xxx', 
             secret: 'xxx',
             amazon: 'https://email.eu-west-1.amazonaws.com');
        client.sendEmail(
            to: 'xxx'
          , from: 'xxx'
          , cc: ''
          , bcc: ''
          , subject: 'greetings'
          , message: 'your <b>message</b> goes here'
          , altText: 'plain text'
         , function (err, data, res) 
            if (err) 
                console.log('Email send Error: ',JSON.stringify(err, null, 2));
             else 
                console.log('Email send Success: ', JSON.stringify(data,null,2));
            
         );
    );

【讨论】:

以上是关于节点 AWS-SDK SES 电子邮件发送验证失败的主要内容,如果未能解决你的问题,请参考以下文章

电子邮件已验证,但我仍然无法使用 Amazon SES 发送电子邮件

AWS SES 计划发送电子邮件(节点 SDK)

电子邮件地址未验证 (AWS SES)

如何将 AWS SES 电子邮件发送到已验证的同一域

无法使用 python SDK 在 ECS fargate 作业上发送邮件,并在另一个 aws 帐户中使用经过验证的 SES 的凭据

Amazon SES 电子邮件地址未验证