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

在C#应用中调用SQL Server存储过程获取邮箱填充mail.To.Add

解决方案

1. 创建SQL Server存储过程

先在你的SQL Server数据库中创建一个根据工号查询用户邮箱的存储过程:

CREATE PROCEDURE GetEmployeeEmailByManNo
    @ManNo VARCHAR(50) -- 工号参数,根据数据库实际字段类型调整
AS
BEGIN
    SET NOCOUNT ON;
    -- 替换为你实际存储用户信息的表名和字段名
    SELECT Email 
    FROM Employees 
    WHERE ManNo = @ManNo;
END

2. 修改C#代码调用存储过程动态获取邮箱

在原邮件发送代码中添加数据库调用逻辑,替换硬编码的收件人邮箱部分。注意要先确保项目引用了对应的数据库驱动(.NET Framework用System.Data.SqlClient,.NET Core/.NET 5+用Microsoft.Data.SqlClient)。

修改后的完整代码:

using System.Data.SqlClient; // .NET Core/.NET 5+替换为 Microsoft.Data.SqlClient

// 原有邮件配置代码保留
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;

SmtpClient SmtpServer = new SmtpClient("smtp.office365.com", 25);
SmtpServer.EnableSsl = true;
SmtpServer.Timeout = 10000000;
SmtpServer.DeliveryMethod = SmtpDeliveryMethod.Network;
SmtpServer.UseDefaultCredentials = false;

SmtpServer.Credentials = new System.Net.NetworkCredential(email, password, domain);

MailMessage mail = new MailMessage();
mail.From = new MailAddress(email);
mail.Subject = "MAIL TEST";
mail.Body = "Mail code working";
mail.IsBodyHtml = true;

// --- 新增:调用存储过程获取邮箱 ---
string targetManNo = "这里替换为用户提交的实际工号"; // 比如从表单控件取值
string dbConnStr = "你的SQL Server连接字符串"; // 格式示例:Server=服务器地址;Database=库名;User Id=账号;Password=密码;
string targetEmail = null;

using (SqlConnection conn = new SqlConnection(dbConnStr))
{
    using (SqlCommand cmd = new SqlCommand("GetEmployeeEmailByManNo", conn))
    {
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@ManNo", targetManNo);

        conn.Open();
        object result = cmd.ExecuteScalar();
        if (result != null)
        {
            targetEmail = result.ToString();
        }
    }
}

// 验证邮箱是否获取成功
if (!string.IsNullOrEmpty(targetEmail))
{
    mail.To.Add(targetEmail);
}
else
{
    WebMessageBox.Show("未找到该工号对应的邮箱");
    return; // 终止邮件发送流程
}
// --- 新增部分结束 ---

// 注意:SendCompleted事件要在Send前注册,否则无法触发
SmtpServer.SendCompleted += (s, x) => {
    SmtpServer.Dispose();
    mail.Dispose();
};

SmtpServer.Send(mail);
WebMessageBox.Show("Mail sent");

关键注意点

  • 替换dbConnStr为你的实际数据库连接字符串
  • targetManNo要替换为用户提交表单时传入的工号(比如从表单输入框的Text属性获取)
  • .NET Core/.NET 5+版本需要先安装Microsoft.Data.SqlClient NuGet包
  • 建议给数据库操作和邮件发送添加try-catch异常处理,避免程序崩溃
  • 原代码中SendCompleted事件注册顺序错误,已调整到Send方法之前

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 10:37:55