使用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避免重复的电子邮件地址?
答案 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);
}
}
如果要使用上面的代码来执行此操作,则在获得重复列表之后,必须foreach
和p.Tos
中的每个p.CCs
。然后检查当前电子邮件地址的重复列表。如果重复,则将其从列表中删除。永远不需要检查To
列表。