Как правильно использовать SendBulkTemplatedEmailRequest от SES в AWS -SDK- NET? - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь использовать 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).

У кого-нибудь есть предложения о том, как решить это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...