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

时间:2017-12-15 15:46:33

标签: node.js amazon-web-services aws-sdk amazon-ses

我正在使用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

请帮忙!谢谢!

2 个答案:

答案 0 :(得分:2)

AWS troubleshooting documentation

  

未验证电子邮件地址。以下身份未通过签入区域(区域):( identity1),(identity2),(identity3) - 您尝试从尚未通过Amazon SES验证的电子邮件地址或域发送电子邮件。此错误可能适用于“发件人”,“来源”,“发件人”或“退货路径”地址。

     

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

     

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

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

检查以下配置:

  • “来源”地址必须是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请求的电子邮件。

进一步阅读

答案 1 :(得分:0)

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

上面已经提到了解决方案,但是很容易错过。这是第三部分,在密钥和秘密之后,是对亚马逊的回调-URL必须存在并且需要针对您所在的地区进行自定义,在我的例子中为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));
            }
         });
    });