C#使用System.Net.Mail发送HTML格式邮件实现

小满
小满
发布时间:2026-10-14 | 4人浏览过
原创

在C#开发中,`System.Net.Mail`是发送电子邮件的核心命名空间。本教程展示如何构建一个实用的`SendEmail`类,支持HTML正文、中文编码处理、抄送/密送及附件功能,解决常见的乱码与配置问题。

核心原理与准备工作

C#发送邮件主要依赖两个类:`MailMessage`用于构建邮件内容(收发件人、主题、正文、附件),`SmtpClient`负责连接SMTP服务器并执行传输。为确保邮件内容正常显示,需明确设置编码格式,特别是处理中文时。

关键参数说明:

  • Encoding.GetEncoding(936):代表GBK/GB2312编码,兼容大多数国内邮件客户端,防止中文乱码。
  • SmtpDeliveryMethod.Network:指定通过网络将邮件发送至指定SMTP服务器。
  • isBodyHtml = true:标记邮件正文为HTML格式,允许包含富文本样式。

第1步:引入必要命名空间

在开始编写代码前,确保文件头部引入了以下标准库,它们提供了创建邮件对象和进行网络通信的基础能力:

using System;
using System.Text;
using System.Net;
using System.Net.Mail;
using System.Net.Mime;

第2步:构建邮件实体类 SendEmail

创建一个名为SendEmail的类,通过构造函数初始化基本的邮件属性。该类将MailMessage实例化为核心成员,便于后续方法调用。

2.1 初始化收件人与发件人信息

提供两种构造函数重载: 1. 简易版:仅传入地址和标题,默认纯文本模式。 2. 完整版:支持姓名、HTML格式标记及详细编码设置。

在完整构造函数中,重点处理编码:mailMessage.From、mailMessage.To、Subject及Body均指定使用Encoding.GetEncoding(936),确保中文显示正确。

namespace LeeStudio.Basic
{
    public class SendEmail
    {
        private MailMessage mailMessage = new MailMessage();

        // 简易构造函数
        public SendEmail(string toAddresses, string fromAddress, string title, string body)
            : this(toAddresses, fromAddress, "", "", title, body, false)
        { }

        // 完整构造函数,支持HTML及中文名
        public SendEmail(string toAddress, string fromAddress, string toName, string fromName,
                         string title, string body, bool isBodyHtml)
        {
            // 设置发件人
            mailMessage.From = new MailAddress(fromAddress, fromName, Encoding.GetEncoding(936));
            
            // 设置收件人
            if (toName.Equals(""))
                mailMessage.To.Add(toAddress);
            else
                mailMessage.To.Add(new MailAddress(toAddress, toName, Encoding.GetEncoding(936)));

            // 设置主题与正文,指定编码
            mailMessage.Subject = title;
            mailMessage.SubjectEncoding = Encoding.GetEncoding(936);
            mailMessage.Body = body;
            mailMessage.IsBodyHtml = isBodyHtml;
            mailMessage.BodyEncoding = Encoding.GetEncoding(936);
        }
    }
}

2.2 配置SMTP服务器并发送

邮件内容准备好后,需通过SetSmtp方法配置连接参数。SmtpClient对象负责实际的网络传输。务必验证密码是否正确,否则服务器会拒绝连接。

        /// <summary>
        /// 设置SMTP并发送简单邮件
        /// </summary>
        public void SetSmtp(string password, string smtpHost)
        {
            SetSmtp(mailMessage.From.Address, password, smtpHost, 25, false, MailPriority.Normal);
        }

        /// <summary>
        /// 高级SMTP配置(含SSL、端口、优先级)
        /// </summary>
        public void SetSmtp(string address, string password, string smtpHost, int smtpPort, 
                            bool isEnableSsl, MailPriority priority)
        {
            SmtpClient smtp = new SmtpClient();
            smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
            smtp.Credentials = new NetworkCredential(address, password);
            smtp.Host = smtpHost;
            smtp.Port = smtpPort;
            smtp.EnableSsl = isEnableSsl;

            mailMessage.Priority = priority;
            smtp.Send(mailMessage); // 执行发送
        }

第3步:扩展功能(抄送、密送与附件)

在实际应用中,可能需要添加抄送(CC)、密送(BCC)或附件。以下是该类提供的扩展方法:

3.1 设置抄送与密送

注意原文中SetCarbonCopyFor(string ccAddress, string ccName)方法内部实际使用了mailMessage.Bcc,这在逻辑上属于密送而非抄送。若需真正抄送,应使用mailMessage.CC。下方代码保留了原始逻辑结构,但建议根据实际需求修正方法名或内部调用:

        // 设置多个抄送者
        public void SetCarbonCopyFor(string ccAddresses)
        {
            mailMessage.CC.Add(ccAddresses);
        }

        // 原文此处代码实际上添加到了Bcc(密送),需注意
        public void SetBlindCarbonCopyFor(string bccAddress, string bccName)
        {
            mailMessage.Bcc.Add(new MailAddress(bccAddress, bccName, Encoding.GetEncoding(936)));
        }

3.2 添加附件

利用Attachment类将本地文件加入邮件。系统可自动识别MIME类型,也可强制指定格式(如RTF)。

        // 普通附件
        public void Attachments(string fileName)
        {
            mailMessage.Attachments.Add(new Attachment(fileName));
        }

        // 指定RTF格式附件
        public void AttachmentsForRTF(string fileName)
        {
            mailMessage.Attachments.Add(new Attachment(fileName, MediaTypeNames.Application.Rtf));
        }

完成判断与注意事项

当smtp.Send(mailMessage)无异常抛出时,表示邮件已成功提交至SMTP服务器。若遇到超时或认证失败,请检查:
1. SMTP服务器地址与端口是否正确(如QQ邮箱通常为smtp.qq.com:465且需开启SSL)。
2. 发件人密码是否为授权码而非登录密码。
3. 目标邮箱是否允许接收来自该域名的邮件。

以上就是C#利用System.Net.Mail发送HTML格式邮件的详细内容,更多关于C#邮件开发的技术资料请关注本站其它相关文章!

相关标签:

本站声明

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

Python 相关产品和应用

全部下载

专题列表