防止在SendGrid消息中重复电子邮件地址?

时间:2018-12-03 21:51:55

标签: c# sendgrid asp.net-core-2.1 sendgrid-api-v3

使用SendGrid for C# library和SendGrid API v3,如果您不小心两次输入了相同的电子邮件地址,将导致该电子邮件完全无法发送。

根据SendGrid documentation

  

单个个性化对象中的所有收件人(在“收件人”,“抄送”或“密件抄送”字段中)将看到完全相同的电子邮件,这与该个性化数据中的定义相同,因此,我们不允许在这些个性化对象之间重复电子邮件单个个性化设置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避免重复的电子邮件地址?

1 个答案:

答案 0 :(得分:2)

最好不要通过维护“收件人”列表开始的所有已添加电子邮件的列表来添加它们。如果您不能这样做,则必须在事后将其删除,请在上方创建该超级用户列表,然后依次通过抄送和BCC删除超级用户列表中已经存在的超级用户。

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);
   }
}

如果要使用上面的代码来执行此操作,则在获得重复列表之后,必须foreachp.Tos中的每个p.CCs。然后检查当前电子邮件地址的重复列表。如果重复,则将其从列表中删除。永远不需要检查To列表。