C#向多个收件人发送邮件失败,单收件人可正常发送如何解决
问题根源
你使用的SendGrid类库中,MailHelper.CreateSingleEmail()方法仅支持单个收件人,你将多个邮箱用逗号/分号拼接后传入,方法会将整段字符串识别为一个非法邮箱地址,因此发送失败。同时你的原有代码还存在两处隐性问题:异步方法未加await、bodyString拼接存在语法错误。
可行解决方案
方案1:兼容逗号/分号分隔的多邮箱传参写法
此方案不需要修改你传参的习惯,仅调整内部逻辑即可:
- 修正
ExecuteLargeOrder方法,拆分收件人并调用多收件人构造接口
public async Task<Response> ExecuteLargeOrder(string bodyString) { var fromAddr = new EmailAddress(from, "Info"); subject = "large order"; plainTextContent = ""; htmlContent = bodyString; // 拆分多邮箱地址,支持逗号、分号分隔,自动过滤空格和空项 var toAddrList = to.Split(new[] {',', ';'}, StringSplitOptions.RemoveEmptyEntries) .Select(addr => new EmailAddress(addr.Trim(), "User")) .ToList(); // 调用支持多收件人的构造方法 var msg = MailHelper.CreateSingleEmailToMultipleRecipients(fromAddr, toAddrList, subject, plainTextContent, htmlContent); var response = await client.SendEmailAsync(msg); return response; }
- 修正接口方法的语法错误和异步调用逻辑
[HttpGet("largeorderemail")] public async Task<IActionResult> LargeOrderEmail() { try { var bodyString = $"<h3>email body</h3><br/>"; // 逗号/分号分隔的多邮箱写法现在可正常识别 var emailService = new Email { To = "info@tel.net, info@gmail.com" }; var response = await emailService.ExecuteLargeOrder(bodyString); return Ok(); } catch (Exception e) { Log.Error(e); return NotFound(); } }
方案2:更规范的列表传参写法
避免分隔符解析的潜在问题,直接用列表存储收件人:
- 修改
Email类的To属性定义
public class Email { // 其余属性保持不变 public List<string> To { get; set; } }
- 传参时直接赋值邮箱列表
var emailService = new Email { To = new List<string> { "info@tel.net", "info@gmail.com" } };
- 调整
ExecuteLargeOrder方法的收件人构造逻辑,不需要拆分字符串,直接将To列表转为EmailAddress列表即可。
内容的提问来源于stack exchange,提问作者Cucko
相关产品推荐
相关产品推荐

