在C#中使用SmtpClient类发送邮件时,调用Send方法可能因为网络、认证或服务器配置问题而抛出异常。如果不进行捕获,轻则功能不可用,重则导致整个程序中断。我们需要通过异常处理机制来定位问题并友好提示。

常见的Send相关异常类型
SmtpClient的Send方法主要会抛出以下几类异常,了解它们有助于精准捕获:
SmtpException:SMTP协议层面的错误,比如服务器返回错误码。SmtpFailedRecipientsException:部分收件人地址无效或被拒绝。AuthenticationException:登录SMTP服务器时认证失败。InvalidOperationException:未正确设置Host或Port等必填属性。- 基础
Exception:如网络不可达引发的SocketException等。
使用try catch捕获Send异常
最基础的做法是用try包裹Send调用,并分层catch不同异常。下面示例演示了如何捕获并处理:
using System;
using System.Net;
using System.Net.Mail;
public class MailHelper
{
public static void SendMail()
{
// 创建邮件消息
MailMessage msg = new MailMessage();
msg.From = new MailAddress("sender@ipipp.com");
msg.To.Add("receiver@ipipp.com");
msg.Subject = "测试邮件";
msg.Body = "这是一封通过C#发送的测试邮件";
// 配置SmtpClient
SmtpClient client = new SmtpClient();
client.Host = "smtp.ipipp.com";
client.Port = 587;
client.Credentials = new NetworkCredential("sender@ipipp.com", "password");
client.EnableSsl = true;
try
{
// 发送邮件
client.Send(msg);
Console.WriteLine("邮件发送成功");
}
catch (SmtpFailedRecipientsException ex)
{
// 收件人相关错误
Console.WriteLine("收件人错误: " + ex.Message);
}
catch (SmtpException ex)
{
// SMTP协议错误
Console.WriteLine("SMTP错误: " + ex.StatusCode + " " + ex.Message);
}
catch (Exception ex)
{
// 其他未知错误
Console.WriteLine("发送失败: " + ex.Message);
}
finally
{
// 释放资源
msg.Dispose();
client.Dispose();
}
}
}
异步发送时的异常处理
如果使用了SendAsync方法,异常不会在调用处直接抛出,而要通过SendCompleted事件来处理:
using System;
using System.Net;
using System.Net.Mail;
public class AsyncMail
{
public static void SendAsyncMail()
{
MailMessage msg = new MailMessage("sender@ipipp.com", "receiver@ipipp.com", "主题", "内容");
SmtpClient client = new SmtpClient("smtp.ipipp.com", 587);
client.Credentials = new NetworkCredential("sender@ipipp.com", "password");
client.EnableSsl = true;
// 注册完成事件
client.SendCompleted += (sender, e) =>
{
if (e.Error != null)
{
Console.WriteLine("异步发送错误: " + e.Error.Message);
}
else if (e.Cancelled)
{
Console.WriteLine("发送已取消");
}
else
{
Console.WriteLine("异步发送成功");
}
client.Dispose();
msg.Dispose();
};
// 开始异步发送
client.SendAsync(msg, null);
}
}
处理建议
实际项目中,建议将邮件发送封装为独立方法,并在外层记录日志。对于网络类异常,可以加入重试机制;对于认证或配置错误,应及时告警而不是反复重试。同时,注意在代码中不要将邮箱密码硬编码,可放到配置文件中。
简单重试示例
public static bool SendWithRetry(MailMessage msg, SmtpClient client, int retryCount)
{
int i = 0;
while (i < retryCount)
{
try
{
client.Send(msg);
return true;
}
catch (SmtpException)
{
i++;
System.Threading.Thread.Sleep(1000);
}
}
return false;
}
通过上述方式,你可以稳定地捕获C#中SmtpClient的Send异常,并根据不同错误类型做出合理响应,提升邮件发送模块的可靠性。
C#SmtpClientSend异常邮件发送异常捕获修改时间:2026-07-24 15:30:25