You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#向多个收件人发送邮件失败,单收件人可正常发送如何解决

问题根源

你使用的SendGrid类库中,MailHelper.CreateSingleEmail()方法仅支持单个收件人,你将多个邮箱用逗号/分号拼接后传入,方法会将整段字符串识别为一个非法邮箱地址,因此发送失败。同时你的原有代码还存在两处隐性问题:异步方法未加await、bodyString拼接存在语法错误。

可行解决方案

方案1:兼容逗号/分号分隔的多邮箱传参写法

此方案不需要修改你传参的习惯,仅调整内部逻辑即可:

  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;
}
  1. 修正接口方法的语法错误和异步调用逻辑
[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:更规范的列表传参写法

避免分隔符解析的潜在问题,直接用列表存储收件人:

  1. 修改Email类的To属性定义
public class Email
{
    // 其余属性保持不变
    public List<string> To { get; set; }
}
  1. 传参时直接赋值邮箱列表
var emailService = new Email 
{ 
    To = new List<string> { "info@tel.net", "info@gmail.com" } 
};
  1. 调整ExecuteLargeOrder方法的收件人构造逻辑,不需要拆分字符串,直接将To列表转为EmailAddress列表即可。

内容的提问来源于stack exchange,提问作者Cucko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:39:03