C# 如何在AWS-SDK-NET中正确使用SES发出的SendBulkTemplatedEmailRequest?

C# 如何在AWS-SDK-NET中正确使用SES发出的SendBulkTemplatedEmailRequest?,c#,.net,amazon-web-services,aws-cli,aws-sdk-net,C#,.net,Amazon Web Services,Aws Cli,Aws Sdk Net,我正试图通过AWS-SDK for.Net使用AmazonSimpleEmailService客户机发送发送BulkTempateDeMailRequest。我已经实现了一个专门的处理程序,用于实际构建请求并进行sendbulkTemplateDemailsync调用。它没有像我预期的那样工作。我认为请求对象是如何序列化并传递给API的,存在一个bug 以下是一些示例代码: using System; using System.Collections.Generic; using System.

我正试图通过AWS-SDK for.Net使用AmazonSimpleEmailService客户机发送发送BulkTempateDeMailRequest。我已经实现了一个专门的处理程序,用于实际构建请求并进行sendbulkTemplateDemailsync调用。它没有像我预期的那样工作。我认为请求对象是如何序列化并传递给API的,存在一个bug

以下是一些示例代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Amazon.SimpleEmail;
using Amazon.SimpleEmail.Model;
using Newtonsoft.Json;

namespace Sample.AWS.SES
{
  public class SendEmailService
  {   
    private readonly IAmazonSimpleEmailService _sesClient;

    public SendEmailService(IAmazonSimpleEmailService sesClient)
    {
      _sesClient = sesClient;
    }

    public async Task<string> SendBulkEmailAsync(SesOrderCreatedBulkTemplate data)
    {
      var result = string.Empty;
      var request = new SendBulkTemplatedEmailRequest
      {
        Template = data.Template,
        ConfigurationSetName = data.ConfigurationSet,
        DefaultTemplateData = JsonConvert.SerializeObject(data.DefaultTemplateData),
        Source = data.Source,
        Destinations = data.Destinations
          .Select(d => new BulkEmailDestination
          {
            Destination = new Destination
            {
              ToAddresses = d.ToAddresses.ToList(),
            },
            ReplacementTemplateData = string.Empty
          })
          .ToList(),
        ReplyToAddresses = data.ReplyToAddresses.ToList()
      };

      try
      {
        var resp = await _sesClient.SendBulkTemplatedEmailAsync(request);
      }
      catch (Exception ex)
      {
        var msgEx = new Exception("Error sending message to SES.", ex);
        throw msgEx;
      }
      return result;
    }

    public class SesOrderCreatedBulkTemplate
    {
      public string Source { get; set; }
      public string Template { get; set; }
      public string ConfigurationSet { get; set; }
      public IEnumerable<Destination> Destinations { get; set; }
      public MyTemplateData DefaultTemplateData { get; set; }
      public IEnumerable<string> ReplyToAddresses { get; set; }
      public string ReturnPath { get; set; } = string.Empty;
    }

    public class DestinationObj
    {
      public IEnumerable<string> ToAddresses { get; set; }
      public MyTemplateData ReplacementTemplateData { get; set; }

      public DestinationObj() {}
    }

    public class MyTemplateData
    {
      public List<Person> Tenants { get; set; }
    }

    public class Person
    {
      public string PersonName { get; set; }
      public List<object> PersonData { get; set; }
    }
  }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Threading.Tasks;
使用Amazon.SimpleEmail;
使用Amazon.SimpleEmail.Model;
使用Newtonsoft.Json;
名称空间Sample.AWS.SES
{
公共类发送电子邮件服务
{   
私有只读IAmazonSimpleEmailService\u sesClient;
公共发送电子邮件服务(IAmazonSimpleEmailService客户端)
{
_sesClient=sesClient;
}
公共异步任务SendBulkEmailAsync(SesOrderCreatedBulkTemplate数据)
{
var result=string.Empty;
var request=新的SendBulkTemplatedEmailRequest
{
Template=data.Template,
ConfigurationSetName=data.ConfigurationSet,
DefaultTemplateData=JsonConvert.SerializeObject(data.DefaultTemplateData),
Source=data.Source,
目的地=数据。目的地
.选择(d=>new BulkEmailDestination
{
目的地=新目的地
{
ToAddresses=d.ToAddresses.ToList(),
},
ReplacementTemplateData=string.Empty
})
.ToList(),
ReplyToAddresses=data.ReplyToAddresses.ToList()
};
尝试
{
var resp=wait_sesClient.sendbulkTemplateDemailsync(请求);
}
捕获(例外情况除外)
{
var msgEx=新异常(“向SES发送消息时出错。”,ex);
抛出msgEx;
}
返回结果;
}
公共类SesOrderCreatedBulkTemplate
{
公共字符串源{get;set;}
公共字符串模板{get;set;}
公共字符串配置集{get;set;}
公共IEnumerable目的地{get;set;}
公共MyTemplateData DefaultTemplateData{get;set;}
公共IEnumerable ReplyToAddresses{get;set;}
公共字符串ReturnPath{get;set;}=string.Empty;
}
公共类目的地
{
公共IEnumerable到地址{get;set;}
公共MyTemplateData替换TemplateData{get;set;}
公共目的地bj(){}
}
公共类MyTemplateData
{
公共列表租户{get;set;}
}
公共阶层人士
{
公共字符串PersonName{get;set;}
公共列表PersonData{get;set;}
}
}
}
有意省略
SourceArn
TemplateArn
ReturnPathArn
的属性。根据,SDK将Amazon SES API的低级功能包装为更高级的数据类型和函数调用,为您提供详细信息。当我查看时,ARN属性都列为不需要。当我看到一些,它是相同的。当我查看的文档时,它是不明确的(没有标记为必需或可选)

因为SDK应该包装API的低级功能,所以我不认为需要ARN值(API和CLI都不需要)。但是,当我试图实际使用在代码段中创建的请求对象时,我得到一个错误,它是
InvalidTemplateData

如果将请求对象序列化为JSON,然后从字符串中删除3个ARN字段,则可以使用API或CLI成功发送消息。

除了没有为ARN指定值之外,我还尝试过(针对所有3个ARN值):

specialArn=string.empty
specialArn=new{}
specificArn=”“

我还尝试过在初始化属性的同时显式地更新对象:
var request=new SendBulkTemplatedEmailRequest(),然后分别填充属性

如果我没有初始化ARN值,当调用send方法时,我会得到一个关于NoneTypevsStringType的错误。我尝试的字符串初始化变体导致InvalidTemplateData错误

注意,我知道Source和ReturnPath的ARN值。我没有我们使用的模板的ARN值。据推测,使用CLI创建模板时,您应该会收到一个响应,其中包括模板的ARN。创建模板时,我没有从CLI获得响应,但每次尝试时都会创建该模板。指定SES时,
descripe template
CLI命令无效,如果我未指定工作空间(无论您称之为SES空间)值,则会以错误响应


有人对如何解决这个问题有什么建议吗?

从提供的代码中很难说您传递给API的是什么

这就是我发送批量电子邮件的方式:

SES配置
  • 创建模板(取自AWS SES
docs)并将其保存到文件-
my template.json
{
“模板”:{
“模板名称”:“我的模板”,
“主题部分”:“问候,{{name}}!”,
“HtmlPart”:“你好{{name},你最喜欢的动物是{{favoriteanimal}”。

”, “TextPart”:“亲爱的{{name},\r\n您最喜欢的动物是{{favoritealm}。” } }
  • 通过CLI
    aws ses创建模板--CLI输入json创建模板file://my-template.json
SES.NETSDKAPI 异步任务SendAsync(字符串[]接收器) { var目的地=接收器 .选择(接收者=>新目的地 { 目的地=新目的地(新