Node.Js AWS SES - 发送电子邮件时的 ETIMEDOUT

Posted

技术标签:

【中文标题】Node.Js AWS SES - 发送电子邮件时的 ETIMEDOUT【英文标题】:Node.Js AWS SES - ETIMEDOUT when sending Email 【发布时间】:2019-03-23 13:41:11 【问题描述】:

我想向通过 Node.js 中的 AWS SES 注册的新用户发送验证电子邮件:

var params = 
    Destination: 
        ToAddresses: [
            '...',
        ]
    ,
    Message: 
        Body: 
            html: 
                Data: '...',
                Charset: 'utf-8'
            ,
            Text: 
                Data: '...',
                Charset: 'utf-8'
            
        ,
        Subject: 
            Data: '...',
            Charset: 'utf-8'
        
    ,
    Source: '...',
    ReturnPath: '...',
;
const ses = new AWS.SES(
    my_accessKeyId,
    my_secretAccessKey,
    my_region,
)
ses.sendEmail(params, function (err, data) 
    // ...
);

不幸的是,没有任何反应,大约一分钟后我收到以下错误:

 Error: connect ETIMEDOUT 35.157.44.176:443
    at Object._errnoException (util.js:992:11)
    at _exceptionWithHostPort (util.js:1014:20)
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1186:14)
  message: 'connect ETIMEDOUT 35.157.44.176:443',
  code: 'NetworkingError',
  errno: 'ETIMEDOUT',
  syscall: 'connect',
  address: '35.157.44.176',
  port: 443,
  region: 'eu-central-1',
  hostname: 'email.eu-central-1.amazonaws.com',
  retryable: true,
  time: 2018-10-18T16:52:00.803Z 

我不确定该错误是否是由于我的代码中的错误导致的,因为我目前只使用沙盒环境。但是我验证了发送和接收电子邮件,即使在沙盒模式下也应该可以正常工作。


附:我不太确定在沙盒模式下如何正确测试我的应用程序,因为我不允许发送到未经验证的电子邮件。是否可以在未运行适当的应用程序的情况下请求生产访问权限?

【问题讨论】:

你在哪里运行这个? Lambda、EC2、其他? 目前在本地,但我打算在 EC2 实例上运行它 尝试使用 ListIdentities 排除网络连接:docs.aws.amazon.com/AWSjavascriptSDK/latest/AWS/… 【参考方案1】:

您需要将区域从 eu-central-1 更改为端点存在的区域(例如 eu-west-1)才能发送电子邮件

https://docs.aws.amazon.com/ses/latest/DeveloperGuide/regions.html

【讨论】:

【参考方案2】:

这并不明显,因此我们需要进行一些故障排除。

首先,让我们看看您是否可以使用 AWS CLI 从本地计算机连接到 SES API。确保您已使用aws configure 设置aws credentials 并尝试:

aws ses list-identities

如果可行,您应该会看到经过验证的电子邮件地址列表。 如果没有,您将看到错误(可能是权限),或者超时表明存在网络连接问题。

关于凭据的注意事项:不要在代码中包含您的凭据,configure a .credentials file,当您使用上面的 aws configure、load it from a shared json file 或使用环境变量(AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY)时会发生这种情况。

接下来,尝试在代码中做同样的事情:

// Load the AWS SDK for Node.js
var AWS = require('aws-sdk');
// Set the region 
AWS.config.update(region: 'eu-central-1');
// Create SES Client
const ses = new AWS.SES(apiVersion: '2010-12-01')
// Create params
var params = 
  IdentityType: "EmailAddress", 
  MaxItems: 123, 
  NextToken: ""
;
ses.listIdentities(params, function(err, data) 
   if (err) console.log(err, err.stack); // an error occurred
   else     console.log(data);           // successful response
);

如上所述设置凭据后,在发送电子邮件代码中使用它来创建 ses 客户端:

// Load the AWS SDK for Node.js
var AWS = require('aws-sdk');
// Set the region 
AWS.config.update(region: myregion);
// Create SES Client
const ses = new AWS.SES(apiVersion: '2010-12-01')

其他需要检查的事项:

确保所有电子邮件地址均为verified(“发件人”、“来源”、“发件人”或“返回路径”) 确保您拥有正确的SES Access Keys 如果使用 EC2,请确保安全组允许访问 AWS API。 我希望它现在可以正常工作,如果没有,我只能说转到 this page 并确保您没有遗漏任何明显的信息。

【讨论】:

修复非常简单:我使用了错误的区域。但我真的很感谢你的详细回答,它也很有帮助! 最好先检查 cli。【参考方案3】:

您需要确保您的用户用于发送电子邮件

my_accessKeyId,
    my_secretAccessKey,

具有正确的 IAM 权限(附加到它的角色)以使用 ses 发送电子邮件。使用我相信的角色 SES 完全访问权限进行测试。

【讨论】:

我已将AmazonSESFullAccess 添加到用户,但在大约一分钟内什么也没发生后,我仍然收到超时错误

以上是关于Node.Js AWS SES - 发送电子邮件时的 ETIMEDOUT的主要内容,如果未能解决你的问题,请参考以下文章

通过 aws ses 在 node.js 中发送带有附件的邮件

使用来自 node.js 的 AWS SES 在邮件中上传 .jpg 图像附件

如何使用 node.js 动态设置 aws ses TemplateData?

发送电子邮件时如何向 Amazon SES 服务提供 AWS 密钥?

在 Node.js 中发送电子邮件? [关闭]

使用没有自定义域的 AWS SES 发送电子邮件