在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.SqlClientNuGet包 - 建议给数据库操作和邮件发送添加
try-catch异常处理,避免程序崩溃 - 原代码中
SendCompleted事件注册顺序错误,已调整到Send方法之前
内容的提问来源于stack exchange,提问作者KayC
相关产品推荐
相关产品推荐

