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

如何在ASP.NET MVC中从SQL Server数据库给多个收件人发送邮件?

如何正确实现多收件人邮件发送?

嗨,我来帮你搞定多收件人邮件发送的问题!你已经成功从SQL Server数据库获取到了收件人邮箱数组,接下来有两种实用方案,你可以根据自己的需求选择:

方案1:一次性发送给所有收件人(效率优先,推荐)

这种方式只需要建立一次SMTP连接就能发给所有收件人,效率更高,也更符合邮件发送的最佳实践。核心思路是把所有邮箱地址添加到邮件的To集合里,然后一次性发送。

示例代码如下:

// 从数据库获取收件人邮箱数组
var students = (from u in db.Users where u.projectGroup == id select u.userEmail).ToArray();

// 创建邮件消息实例
var mailMessage = new MailMessage();
// 设置发件人(替换成你的实际发件邮箱)
mailMessage.From = new MailAddress("your-sender-email@example.com");

// 批量添加所有收件人
foreach (var email in students)
{
    mailMessage.To.Add(new MailAddress(email));
}

// 设置邮件主题和内容(替换成你的实际内容)
mailMessage.Subject = "项目组通知";
mailMessage.Body = string.Format("<p>Email From: {0} ({1})</p><p>Message:</p><p>{2}</p>", 
                                "你的名称", "your-sender-email@example.com", "这是发给项目组全体成员的通知内容");
mailMessage.IsBodyHtml = true; // 如果你用HTML格式的邮件内容,记得开启这个

// 配置并发送邮件
using (var smtpClient = new SmtpClient("your-smtp-server", 587))
{
    smtpClient.Credentials = new NetworkCredential("your-smtp-username", "your-smtp-password");
    smtpClient.EnableSsl = true; // 大部分SMTP服务器需要启用SSL/TLS

    try
    {
        smtpClient.Send(mailMessage);
        Console.WriteLine("所有收件人邮件发送成功!");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"邮件发送失败:{ex.Message}");
        // 这里可以添加日志记录,方便排查问题
    }
}

方案2:逐个发送邮件(支持个性化内容)

如果你的邮件需要给每个收件人展示不同的内容(比如称呼、专属信息),那逐个发送就更合适。你原来的for循环思路是对的,只需要补全邮件发送的核心逻辑即可:

var students = (from u in db.Users where u.projectGroup == id select u.userEmail).ToArray();

// 先统一配置SMTP参数(替换成你的实际信息)
var smtpConfig = new
{
    Server = "your-smtp-server",
    Port = 587,
    Username = "your-smtp-username",
    Password = "your-smtp-password"
};

for (int h = 0; h < students.Length; h++)
{
    var recipientEmail = students[h];
    try
    {
        // 为每个收件人单独创建邮件实例
        var mailMessage = new MailMessage();
        mailMessage.From = new MailAddress("your-sender-email@example.com");
        mailMessage.To.Add(new MailAddress(recipientEmail));
        
        // 个性化主题和内容(比如加入收件人邮箱或姓名)
        mailMessage.Subject = $"专属通知 - {recipientEmail}";
        var personalizedBody = string.Format("<p>Hi {0}!</p><p>Email From: {1} ({2})</p><p>Message:</p><p>{3}</p>",
                                            recipientEmail.Split('@')[0], // 取邮箱前缀当称呼
                                            "你的名称", "your-sender-email@example.com", "这是给你的专属通知内容");
        mailMessage.Body = personalizedBody;
        mailMessage.IsBodyHtml = true;

        // 发送当前收件人的邮件
        using (var smtpClient = new SmtpClient(smtpConfig.Server, smtpConfig.Port))
        {
            smtpClient.Credentials = new NetworkCredential(smtpConfig.Username, smtpConfig.Password);
            smtpClient.EnableSsl = true;
            smtpClient.Send(mailMessage);
            Console.WriteLine($"邮件已成功发送到:{recipientEmail}");
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"发送到 {recipientEmail} 失败:{ex.Message}");
        // 可以记录失败的收件人,后续手动重试或者自动重试
    }
}

额外注意事项

  • 如果你用的是.NET Core/.NET 5+版本,SmtpClient已经被标记为过时,推荐使用MailKit库(需要通过NuGet安装),它更稳定且功能更丰富,用法和上面的示例类似,只是API略有不同。
  • 部分邮件服务商(比如Gmail、Outlook)会限制单次发送的收件人数或发送频率,如果你的收件人数量很多,建议拆分批次发送,或者在逐个发送时添加短暂延迟(比如Thread.Sleep(1000)),避免被判定为垃圾邮件。
  • 异常处理尽量细化,比如捕获SmtpException可以区分是服务器连接问题还是收件人地址无效,方便针对性处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:37:50