使用SendGrid for 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
在发送电子邮件之前,我想检查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没有重复的电子邮件地址吗?
最好不要添加它们,方法是从"收件人"列表开始,维护已添加的所有电子邮件的列表。如果你不能做到这一点,并且你必须在事后删除它们,那么在上面创建超级列表,然后通过CC,然后通过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);
}
}
如果你想用上面的代码来做这件事,那么在获得重复列表后,你必须p.Tos
和p.CCs
中的每一个都foreach
。然后检查当前电子邮件地址的重复列表。如果它是重复的,则将其从列表中删除。你永远不应该检查To
列表,因为你总是想要这些。
我认为,如果您为他们的API构建自己的客户端,并在实现中执行以下操作,则会更容易处理此问题:
var personalization = new Personalization();
personalization.To = GetEmailAddresses(emails);
personalization.Cc = GetEmailAddresses(emails, personalization.To);
personalization.Bcc = GetEmailAddresses(emails, personalization.To.Concat(personalization.Cc));
private IEnumerable<EmailAddress> GetEmailAddresses(IEnumerable<string> emails, IEnumerable<EmailAddress> existingReceptients){
return emails?.Select(email => new EmailAddress{ Email = email })
.Where(new => existingReceptients?.Any(existing => existing.Email == new.Email) != true);
}