Используя SendGrid для библиотеки C # и SendGrid API v3, если вы случайно включили один и тот же адрес электронной почты дважды, это приводит к тому, что электронное письмо вообще не отправляется.

Согласно документации SendGrid:

Все получатели в одном объекте персонализации (в полях «Кому», «Копия» или «Скрытая копия») будут видеть одно и то же электронное письмо, как определено данными в этой персонализации, поэтому мы не допускаем дублирования электронных писем между этими 3 массивами в единая персонализация.

Например:

        var msg = new SendGridMessage();
        msg.AddTo("test@example.com");
        msg.AddBcc("test@example.com"); // duplicate email address, nothing will be sent

Перед отправкой писем я хотел бы проверить SendGrid Personalizations и удалить все повторяющиеся письма.

Вот код, который у меня есть:

        var msg = new SendGridMessage();
        msg.AddTo("test@example.com");
        msg.AddBcc("test@example.com"); //has a duplicate email address, nothing will be sent

        foreach (var p in msg.Personalizations)
        {
            var emails = new List<EmailAddress>();
            emails.AddRange(p.Tos);
            emails.AddRange(p.Ccs);
            emails.AddRange(p.Bccs);

            // find duplicates
            var duplicates = emails.GroupBy(x => x.Email)
                            .Where(g => g.Count() > 1)
                            .Select(y => y.Key)
                            .ToList();

            // remove all but one...
            // remove duplicates from Bccs first, then Ccs, then Tos
            foreach (var d in duplicates)
            {

            }
        }

Я застрял на поиске лучшего способа уменьшить количество повторяющихся адресов электронной почты до одного уникального. Кто-нибудь нашел хороший способ обеспечить отсутствие повторяющихся адресов электронной почты с помощью SendGrid?

0
Daniel Congrove 4 Дек 2018 в 00:51

1 ответ

Лучший ответ

Лучше не добавлять их, ведя список всех уже добавленных писем, начиная со списка Кому. Если вы не можете этого сделать, и вам нужно удалить их постфактум, создайте этот список uber выше, а затем пройдите CC, а затем BCC, удалив те, которые уже находятся в списке uber.

var existingEmails = new HashSet<String>();

foreach (String email in MyToList)
{
   if(!existingEmails.ContainsKey(email)
   {
       msg.AddTo(email);
       existingEmails.Add(email);
   }
}

foreach (String email in MyCCList)
{
   if(!existingEmails.ContainsKey(email)
   {
       msg.AddCC(email);
       existingEmails.Add(email);
   }
}

foreach (String email in MyBCCList)
{
   if(!existingEmails.ContainsKey(email)
   {
       msg.AddBCC(email);
       existingEmails.Add(email);
   }
}

Если вы хотите сделать это с помощью приведенного выше кода, вам придется foreach каждый из p.Tos и p.CCs и т. Д. После получения списка дубликатов. Затем проверьте список дубликатов для текущего адреса электронной почты. Если это дубликат, удалите его из списка. Вам никогда не придется проверять список To, поскольку вы всегда этого хотите.

2
Andrew T Finnell 3 Дек 2018 в 22:44