C#使用System.Net.Mail发送邮件:三种配置方式详解
在C#开发中,System.Net.Mail 命名空间提供了发送电子邮件的标准接口。本文将详细介绍三种常见的邮件发送场景:利用本地localhost服务测试、连接普通SMTP服务器进行常规收发,以及配置EnableSsl和特定端口以支持Gmail等安全SMTP服务。
一、准备环境与方法概述
C#发送邮件主要依赖 System.Net.Mail.SmtpClient 类。根据发送场景不同,配置策略有所区别:
- Localhost模式:适用于内部局域网或本地测试,无需外部身份验证。
- 普通SMTP模式:需指定外部SMTP主机地址(如企业邮箱),并提供用户名和密码认证。
- SSL SMTP模式:针对要求安全连接的现代邮箱服务(如Gmail),需启用SSL协议并设置特定端口(通常为587)。
二、通过Localhost发送
此方法适合在开发环境中模拟邮件发送,不涉及外部网络认证,直接通过本地Mail Transfer Agent (MTA)处理。
第1步:构建邮件消息对象
初始化 MailMessage,设置收件人、抄送人、发件人信息及正文内容。注意标题和内容的编码格式应保持一致,推荐UTF-8以防止乱码。
public void SendMailLocalhost()
{
System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage();
// 添加收件人(支持多人的Add操作)
msg.To.Add("a@a.com");
msg.To.Add("b@b.com");
// 添加抄送人
if (!string.IsNullOrEmpty("c@c.com"))
msg.CC.Add("c@c.com");
// 设置发件人信息:地址、显示名称、编码
msg.From = new MailAddress("sender@example.com", "SenderName", System.Text.Encoding.UTF8);
// 设置主题与正文
msg.Subject = "这是测试邮件";
msg.SubjectEncoding = System.Text.Encoding.UTF8;
msg.Body = "邮件内容";
msg.BodyEncoding = System.Text.Encoding.UTF8;
// 设置为纯文本(若为HTML内容需设为true)
msg.IsBodyHtml = false;
// 设置优先级
msg.Priority = MailPriority.High;
SmtpClient client = new SmtpClient();
client.Host = "localhost"; // 关键点:指向本地主机
object userState = msg;
try
{
// 使用异步发送,也可用同步 client.Send(msg)
client.SendAsync(msg, userState);
MessageBox.Show("发送成功");
}
catch (System.Net.Mail.SmtpException ex)
{
MessageBox.Show(ex.Message, "发送邮件出错");
}
}
三、通过普通SMTP发送
大多数企业邮箱或非Gmail服务商(如Outlook、QQ邮箱未开启SSL时等)采用标准SMTP协议。需要配置 Host 和 Credentials。
第2步:配置认证与非SSL连接
创建 NetworkCredential 对象填入账号密码,赋值给 SmtpClient.Credentials。此时无需开启SSL(默认false),使用默认端口25。
public void SendMailUseNormalSmtp()
{
System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage();
msg.To.Add("recipient@example.com");
msg.From = new MailAddress("account@provider.com", "User", System.Text.Encoding.UTF8);
msg.Subject = "通过普通SMTP发送";
msg.Body = "这是一封常规测试邮件";
msg.IsBodyHtml = false;
SmtpClient client = new SmtpClient();
// 设置认证凭证
client.Credentials = new System.Net.NetworkCredential(
"account@provider.com",
"your_password"
);
// 设置SMTP主机地址
client.Host = "smtp.provider.com";
try
{
client.Send(msg);
Console.WriteLine("发送成功");
}
catch (System.Net.Mail.SmtpException ex)
{
Console.WriteLine($"错误: {ex.Message}");
}
}
四、通过SSL加密SMTP发送
Gmail等主流云服务强制要求加密传输。必须设置 EnableSsl = true 并使用正确端口(Gmail通常使用587用于STARTTLS或465用于implicit SSL,代码示例中以587为例)。
第3步:配置SSL与安全端口
除了基本的账号密码外,关键步骤是启用SSL并确保Host和Port匹配服务商规范。
public void SendMailUseGmailSsl()
{
System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage();
msg.To.Add("target@example.com");
// 注意:发件人地址必须与Credentials中的邮箱一致
msg.From = new MailAddress("myid@gmail.com", "My Name", System.Text.Encoding.UTF8);
msg.Subject = "Gmail SSL测试";
msg.Body = "通过SSL加密的安全邮件";
msg.IsBodyHtml = false;
SmtpClient client = new SmtpClient();
// Gmail凭据
client.Credentials = new System.Net.NetworkCredential(
"myid@gmail.com",
"app_password_or_account_password"
);
// 配置Gmail专属参数
client.Port = 587; // Gmail常用端口
client.Host = "smtp.gmail.com"; // Gmail SMTP服务器
client.EnableSsl = true; // 开启SSL加密
try
{
client.Send(msg);
Console.WriteLine("Gmail发送成功");
}
catch (System.Net.Mail.SmtpException ex)
{
Console.WriteLine($"SSL发送失败: {ex.Message}");
}
}
五、排错与注意事项
在实际部署中,邮件发送失败常见原因如下:
- 端口限制:部分云服务器(如AWS、阿里云轻量级应用服务器)默认封锁了25端口。若使用普通SMTP报错“无法连接服务器”,请检查云防火墙规则或改用465/587端口。
- 认证失败:确保
NetworkCredential的用户名与msg.From的发件人邮箱完全一致。部分服务商(如Gmail)要求开启“应用专用密码”或在安全性较低的应用访问权限中授权。 - 超时问题:若在慢速网络下使用
client.Send()导致程序挂起,建议保持SendAsync()或使用Timeout属性优化。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













