C# WinForm通过SMTP协议发送邮件(含完整源码)

Ruby
Ruby
发布时间:2026-10-15 | 3人浏览过
原创

本文将介绍如何使用 C# 的 System.Net.Mail 命名空间中的 SmtpClient 类实现 SMTP 邮件发送功能。示例包含表单界面布局、发件人登录凭证设置、Base64 编码以支持中文乱码问题,以及针对多收件人的循环发送逻辑。

环境准备

实现 SMTP 邮件发送需要以下基本条件:

  1. 运行环境:.NET Framework 或 .NET Core/.NET 5+,使用 Visual Studio 创建 Windows Forms 项目。
  2. 依赖库:主要涉及 System.Net.Mail(发送邮件)、System.Net(DNS获取)和 System.Text.RegularExpressions(正则验证)。
  3. 网络配置:确保服务器端口(如 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();
}

注意事项

  1. 授权码机制:目前主流邮箱(QQ、网易、Gmail等)不再允许使用登录密码直接作为 SMTP 密码,需在邮箱设置中开启“SMTP服务”并生成专用“授权码”或“App Password”填入 txtPwd。
  2. 异步发送:上述示例使用 client.Send() 为同步调用,在大并发或大附件场景下会阻塞 UI 线程。生产环境建议使用 client.SendAsync()` 或 `async/await` 模式。
  3. SSL/TLS:如果使用 465 端口,需在 SmtpClient 实例化后设置 client.EnableSsl = true;。

总结

以上是基于 C# WinForm 调用 SMTP 协议发送邮件的核心逻辑与代码实现。该方案适用于简单的内部通知、报表推送等场景。更多关于 C# 邮件组件集成的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表