C#使用System.Net.Mail发送HTML格式邮件实现
在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#邮件开发的技术资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









