Я пытаюсь использовать AmazonSimpleEmailService через AWS -SDK для клиента. Net, чтобы отправить SendBulkTempatedEmailRequest . Я реализовал специальный обработчик для фактического построения запроса и выполнения вызова SendBulkTemplatedEmailAsyn c. Это не работает, как я ожидаю. Я думаю, что есть ошибка в том, как объект запроса сериализуется и передается в API.
Вот пример кода:
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; }
}
}
}
Свойства SourceArn
, TemplateArn
и ReturnPathArn
опущены специально. Согласно документации SES , SDK объединяет низкоуровневую функциональность API Amazon SES с высокоуровневыми типами данных и вызовами функций, которые позаботятся о вас. Когда я просматриваю документацию API для отправки массовой электронной почты , все свойства ARN отображаются в виде , не требуется . Когда я смотрю на некоторые примеры CLI , это то же самое. Когда я просматриваю документацию для SDK для. Net v3 , он неоднозначен (не помечен как обязательный или необязательный).
Поскольку SDK должен был обернуть низкоуровневый Функциональность API, я не верю, что значения ARN требуются (ни API, ни CLI не требуют их). Однако, когда я пытаюсь фактически использовать объект запроса, созданный во фрагменте кода, я получаю сообщение об ошибке InvalidTemplateData
.
Если я сериализую объект запроса в JSON, затем удалите 3 поля ARN из строки, я могу использовать API или CLI для успешной отправки сообщения.
В дополнение к тому, что я не указал значение для ARN, у меня есть пробовал (для всех 3 значений ARN):
specificArn = string.empty;
specificArn = new {};
specificArn = "";
Я также попытался явно обновить объект отдельно от инициализации свойств:
var request = new SendBulkTemplatedEmailRequest();
, а затем индивидуально заполняя свойства.
Если я не инициализирую значения ARN, я получаю сообщение об ошибке NoneType vs StringType при методе отправки называется. Испытанные варианты инициализации строки приводят к InvalidTemplateData ошибкам.
Обратите внимание, я знаю значения ARN для Source и ReturnPath. У меня нет значения ARN для шаблона, который мы используем. Предположительно, используя CLI, при создании шаблона вы должны получить ответ обратно, включающий ARN для шаблона. Я не получаю ответа от CLI при создании шаблона, но он создается каждый раз, когда я пытаюсь. Команда describe-template
CLI недопустима, когда вы указываете SES, и выдает ошибку, если я не указываю значение рабочей области (как вы называете пространство SES).
У кого-нибудь есть предложения о том, как решить это?