在.NET中使用SendGrid群发邮件时隐藏其他收件人邮箱的方法
问题
我能在.NET中使用SendGrid给多人发送邮件,但收件人收到邮件时能看到所有其他收件人的邮箱地址。想实现从列表(数组)向收件人群发邮件,但不让收件人看到其他收件人。我尝试把msg.AddTos()改为msg.AddBccs(),但邮件似乎根本没发送出去,至少我没收到。
收件人打开邮件时的示例:能看到自己的邮箱“Test Roy”以及所有其他收件人。
我的邮件发送函数:
private async Task<Response> ExecuteTemplate(string[] toEmailAddresses, string subject, dynamic templateData) { var client = new SendGridClient(sendGridOptions.SendGridKey); var msg = new SendGridMessage(); msg.SetFrom(new EmailAddress("automated@mysite.com", "MySite")); msg.SetTemplateId(_config["SendGrid:TemplateId"]); templateData.subject = subject; msg.SetTemplateData(templateData); if (toEmailAddresses.Length > 1) { var emailAddresses = toEmailAddresses.Select(array => new EmailAddress(array)).ToList(); // msg.AddBccs(emailAddresses); msg.AddTos(emailAddresses); } else { msg.AddTo(toEmailAddresses[0]); } msg.SetClickTracking(false, false); msg.SetOpenTracking(false); msg.SetGoogleAnalytics(false); msg.SetSubscriptionTracking(false); var response = await client.SendEmailAsync(msg); return response; }
解决方案
用Bcc是正确的思路,但邮件没发送大概率是因为SendGrid的规则限制,以下是解决步骤:
- 必须设置至少一个主收件人(To)
SendGrid要求邮件必须包含至少一个To收件人,仅用Bcc会被拦截。你可以添加一个内部邮箱作为主收件人,把所有实际收件人放到Bcc里,这样收件人就看不到彼此的地址了。修改后的代码逻辑如下:
if (toEmailAddresses.Length > 1) { var emailAddresses = toEmailAddresses.Select(array => new EmailAddress(array)).ToList(); // 添加内部邮箱作为主收件人(仅用于满足SendGrid规则) msg.AddTo(new EmailAddress("internal@mysite.com", "Internal")); // 实际收件人全部加入Bcc msg.AddBccs(emailAddresses); } else { msg.AddTo(toEmailAddresses[0]); }
检查SendGrid控制台的发送日志
登录SendGrid后台查看邮件状态,确认是被退回、进入垃圾邮件还是有格式错误。比如收件人邮箱拼写错误、域名无效等,都会导致收不到邮件。验证邮箱格式
确保toEmailAddresses数组里的邮箱格式都正确,没有多余字符或拼写错误。先测试单个Bcc收件人
先给单个邮箱发Bcc测试,确认能收到后再批量发送,排除批量处理的问题。
另外还有一种方案:循环给每个收件人单独发邮件。遍历收件人数组,每次创建新的SendGridMessage并单独发送,这种方式每个收件人看到的都是自己的专属邮件,不会有其他收件人信息,但如果收件人数量过大,可能触发SendGrid的发送频率限制,你可以根据需求选择。
内容的提问来源于stack exchange,提问作者chuckd
相关产品推荐
相关产品推荐

