C# WinForm通过SMTP协议发送邮件(含完整源码)
本文将介绍如何使用 C# 的 System.Net.Mail 命名空间中的 SmtpClient 类实现 SMTP 邮件发送功能。示例包含表单界面布局、发件人登录凭证设置、Base64 编码以支持中文乱码问题,以及针对多收件人的循环发送逻辑。
环境准备
实现 SMTP 邮件发送需要以下基本条件:
- 运行环境:.NET Framework 或 .NET Core/.NET 5+,使用 Visual Studio 创建 Windows Forms 项目。
- 依赖库:主要涉及
System.Net.Mail(发送邮件)、System.Net(DNS获取)和System.Text.RegularExpressions(正则验证)。 - 网络配置:确保服务器端口(如 25, 465, 587)在出站方向未被防火墙拦截。
核心实现步骤
第1步:创建邮件窗口并定义控件
首先需要构建一个 WinForm 窗口用于输入发件人信息、收件人列表、主题、内容以及 SMTP 服务器参数。控件包括 TextBox(文本框)、Label(标签)和 Button(按钮)。
主要字段对应关系如下:
txtSend: 发件人邮箱地址txtName: 发件人显示名称txtPwd: 发件人密码或授权码txtServer: SMTP 服务器地址(如 smtp.qq.com)txtPort: 端口号(通常为 25 或 465)txtTo: 收件人邮箱(支持逗号分隔多个地址)txtSubject: 邮件主题txtContent: 邮件正文
第2步:实现 Base64 编码函数
由于 SMTP 协议在处理非 ASCII 字符(如中文)时可能会产生乱码,通常需要对 Subject 和 Body 进行 Base64 编码处理。
/// <summary>
/// 对字符串进行Base64编码
/// </summary>
private static string Base64Encode(string str)
{
return Convert.ToBase64String(Encoding.UTF8.GetBytes(str));
}
第3步:封装邮件发送方法
将 MailMessage 的配置与 SmtpClient 的发送逻辑封装在一起。注意 client.Credentials 的设置,若对方服务器要求身份验证,必须传入合法的 NetworkCredential。
private void SendEmail(MailMessage message)
{
// 设置主题和内容,并应用Base64编码防止乱码
message.Subject = Base64Encode(txtSubject.Text);
message.Body = Base64Encode(txtContent.Text);
// 实例化SmtpClient,传入服务器地址和端口
SmtpClient client = new SmtpClient(txtServer.Text, Convert.ToInt32(txtPort.Text));
// 设置凭据
client.Credentials = new System.Net.NetworkCredential(txtName.Text, txtPwd.Text);
// 执行同步发送
client.Send(message);
}
第4步:处理多收件人与触发发送
当 txtTo 中包含逗号时,需要拆分字符串并逐个创建邮件对象进行发送。同时利用正则表达式校验邮箱格式。
private void btnSend_Click(object sender, EventArgs e)
{
try
{
// 基础邮箱格式验证
if (validateEmail(txtSend.Text))
{
// 判断是否为多收件人
if (txtTo.Text.IndexOf(",") != -1)
{
string[] emails = txtTo.Text.Split(',');
foreach (string email in emails)
{
var msg = new MailMessage(new MailAddress(txtSend.Text), new MailAddress(email.Trim()));
SendEmail(msg); // 此处建议加入延时,避免被反垃圾系统拦截
}
}
else
{
var msg = new MailMessage(new MailAddress(txtSend.Text), new MailAddress(txtTo.Text));
SendEmail(msg);
}
MessageBox.Show("发送成功");
}
}
catch (Exception ex)
{
MessageBox.Show($"发送失败: {ex.Message}");
}
}
第5步:辅助功能完善
邮箱正则验证:
public static bool validateEmail(string str)
{
return Regex.IsMatch(str, @"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*");
}
默认服务器填充: 在窗体加载时,可以尝试获取本机主机名作为默认服务器占位。
private void frmSend_Load(object sender, EventArgs e)
{
txtServer.Text = Dns.GetHostName();
}
注意事项
- 授权码机制:目前主流邮箱(QQ、网易、Gmail等)不再允许使用登录密码直接作为 SMTP 密码,需在邮箱设置中开启“SMTP服务”并生成专用“授权码”或“App Password”填入
txtPwd。 - 异步发送:上述示例使用
client.Send()为同步调用,在大并发或大附件场景下会阻塞 UI 线程。生产环境建议使用client.SendAsync()` 或 `async/await` 模式。 - SSL/TLS:如果使用 465 端口,需在
SmtpClient实例化后设置client.EnableSsl = true;。
总结
以上是基于 C# WinForm 调用 SMTP 协议发送邮件的核心逻辑与代码实现。该方案适用于简单的内部通知、报表推送等场景。更多关于 C# 邮件组件集成的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













