C# 如何在AWS-SDK-NET中正确使用SES发出的SendBulkTemplatedEmailRequest?
我正试图通过AWS-SDK for.Net使用AmazonSimpleEmailService客户机发送发送BulkTempateDeMailRequest。我已经实现了一个专门的处理程序,用于实际构建请求并进行sendbulkTemplateDemailsync调用。它没有像我预期的那样工作。我认为请求对象是如何序列化并传递给API的,存在一个bug 以下是一些示例代码: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.
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目的地=接收器
.选择(接收者=>新目的地
{
目的地=新目的地(新