首页 > 解决方案 > 防止 SendGrid 消息中出现重复的电子邮件地址?

问题描述

使用用于 C# 库和 SendGrid API v3 的 SendGrid,如果您不小心包含两次相同的电子邮件地址,则会导致根本无法发送电子邮件。

根据 SendGrid文档

单个个性化对象(在 to、cc 或 bcc 字段中)中的所有收件人将看到完全相同的电子邮件,正如该个性化中的数据所定义的那样,因此我们不允许在这 3 个数组之间重复电子邮件单一的个性化。

例如:

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

在发送电子邮件之前,我想检查 SendGridPersonalizations并删除任何重复的电子邮件。

这是我到目前为止的代码:

        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 没有重复的电子邮件地址?

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

解决方案


最好不要通过维护您已添加的所有电子邮件的列表来添加它们,从“收件人”列表开始。如果您不能这样做并且您必须在事后删除它们,请在上面创建该超级列表,然后通过抄送,然后通过密件抄送删除已经在超级列表中的那些。

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列表,因为您总是想要这些。


推荐阅读