列表取消订阅Aws-sdk nodejs

时间:2018-03-08 08:10:36

标签: javascript node.js amazon-ses aws-sdk-js aws-sdk-nodejs

使用Amazon SES(简单电子邮件服务)时,如何在外发电子邮件中添加List-Unsubsribe : <mailto:abc@cdf.com>标头?我正在使用AWS&#39; JavaScript SDK。

以下是我查看但未能找到答案的各种文档链接:Link1Link2Link3Link4

我尝试过使用SendMail和SendRawEmail API。

使用SendMail API

let params={
 Source: auth.host, 
 Destination: { ToAddresses: [email] },
 Headers:{ListUnsubscribe :'<mailto:abc@def.com>'},  //error unexpected key Headers
 Message: {Subject:{Data: subject },Body:{Text: {Data: mail}}} 
}

ses.sendEmail(params,(err, data)=>{
    if(err){
      console.error(err);
    }else{
      console.log('Email sent: ');
      console.log(data);

    }
});  

使用SendRawEmail API

var mailOptions = {
      from: auth.host,
      subject: subject,
      text: mail,
      to: email,
    };

    var mail = mailcomposer(mailOptions);

    mail.build(function (err, message){
      var req = ses.sendRawEmail({RawMessage: {Data: message}});

      req.on('build', function() {
          req.httpRequest.headers["List-Unsubscribe"] = "<mailto:abc@abc.com>";
      });

      req.send(function (err, data) {
          if(err) //code
          else  //code
      });
    });

2 个答案:

答案 0 :(得分:2)

根据AWS文档,您只能使用SendRawEmail API指定自定义标头:

  

SendRawEmail API为您提供格式化和发送的灵活性   您自己的原始电子邮件,通过指定标题,MIME部分和   内容类型。 SendRawEmail通常由高级用户使用。您   需要提供消息正文和所有标题字段   在Internet邮件格式规范中按要求指定   (RFC 5322)。有关更多信息,请参阅使用“发送原始电子邮件”   亚马逊SES API。

这解释了为什么你的第一个例子不起作用。凉。

这就是为什么第二个实际使用SendRawEmail API的示例无效。

不幸的是,为了在发送电子邮件时指定自定义标头,您必须在原始邮件的正文中内联指定它们。在制作此原始邮件时,您必须遵循一些非常严格的格式要求,否则您的投放可能会失败/输出错误。虽然它会非常有用,但是没有api方法可以让你使用键/值对来指定标题。

这个限制可能是因为AWS必须解码你的base64编码的原始消息(可以是Buffer,blob,typed数组,字符串中的任何一种),希望你正确格式化你的消息,并插入你的标题位于正确的位置。毫无疑问,这会对API的最终用户有所帮助,但绝对看起来像是他们必须要做的所有验证和错误处理的噩梦。

以下是使用SendRawEmail API发送电子邮件的详细要求:

  

RawMessage - (map)消息的原始文本。客户是   负责确保以下内容:

     

邮件必须包含标题和正文,用空行分隔。   必须存在所有必需的标题字段。多部分的每个部分   MIME邮件必须格式正确。 MIME内容类型必须是   亚马逊SES支持的那些。有关更多信息,请转到   Amazon SES开发人员指南。必须是base64编码的。根据RFC 5321,   每行文本的最大长度,包括,不得   超过1,000个字符。数据 - 必需 - (缓冲区,类型数组,Blob,   字符串)消息的原始数据。此数据需要base64编码   如果您通过HTTPS界面直接访问Amazon SES。   如果您使用AWS SDK访问Amazon SES,则SDK会照顾   你的64位编码。在所有情况下,客户必须确保   消息格式符合Internet电子邮件标准   关于电子邮件标题字段,MIME类型和MIME编码。

     

原始邮件中的收件人:,CC:和BCC:标头可以包含一个组   列表。

     

如果您使用SendRawEmail发送授权,则可以   在原始邮件中包含X-header以指定“来源”,“来自”   和“返回路径”地址。有关更多信息,请参阅   SendRawEmail的文档。

     

不要在DKIM签名中包含这些X-header,因为它们是   在发送电子邮件之前由Amazon SES删除。欲获得更多信息,   转到Amazon SES开发人员指南。

我的两分钱

这看起来非常不方便。我建议使用像Sendgrid这样的服务,它内置了诸如订阅管理(订阅/取消订阅),模板管理以及现代专用电子邮件服务应具备的一大堆功能。但是,如果您没有选择,那么可能会对SendRawEmail API为您提供大量自定义这一事实感到高兴,但这会让您感到有点单调乏味。

您可以从AWS SES Javascript API docs

访问此信息以及更多信息

答案 1 :(得分:0)

您的第二个示例中的问题是您向amazon添加了标头,而不是向自己发送电子邮件

请尝试使用以下代码示例:

var mailOptions = {
  from: auth.host,
  subject: subject,
  text: mail,
  to: email,
  headers: {
    'List-Unsubscribe': "<mailto:abc@abc.com>"
  }
};

var mail = mailcomposer(mailOptions);

mail.build(function (err, message){
  var req = ses.sendRawEmail({RawMessage: {Data: message}});

  req.send(function (err, data) {
      if(err) //code
      else  //code
  });
});