如何通过C# SmtpClient和MailMessage判断已发送邮件是否送达?
关于C# SmtpClient和MailMessage判断邮件送达及获取反馈的说明
一、确认邮件提交到SMTP服务器的状态
SmtpClient只能直接确认邮件是否成功提交到发件人使用的SMTP服务器,无法直接确认收件人最终是否收到。
同步发送时,
Send方法如果没有抛出SmtpException,就说明邮件已成功提交到服务器;如果抛出异常,可以通过SmtpException.StatusCode获取具体错误类型(比如收件箱不存在、服务器拒绝连接等)。
示例代码:using System.Net; using System.Net.Mail; using (var smtpClient = new SmtpClient("smtp.yourserver.com", 587)) { smtpClient.Credentials = new NetworkCredential("your-email@domain.com", "your-password"); smtpClient.EnableSsl = true; var mail = new MailMessage( from: "sender@domain.com", to: "recipient@domain.com", subject: "测试邮件", body: "这是测试内容" ); try { smtpClient.Send(mail); Console.WriteLine("邮件已成功提交至SMTP服务器"); } catch (SmtpException ex) { Console.WriteLine($"提交失败:{ex.Message}"); Console.WriteLine($"错误码:{ex.StatusCode}"); } }异步发送时,使用
SendMailAsync配合await,同样通过捕获SmtpException判断提交状态。
二、获取最终送达的反馈(投递结果通知)
要知道邮件是否最终送达收件人邮箱,需要依赖送达回执(DSN):
- 设置送达通知选项
通过MailMessage.DeliveryNotificationOptions指定需要在成功或失败时发送回执,SMTP服务器会将投递结果以邮件形式发送给发件人。
示例代码:
var mail = new MailMessage("sender@domain.com", "recipient@domain.com", "测试邮件", "测试内容"); // 要求在投递成功或失败时都发送通知 mail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess | DeliveryNotificationOptions.OnFailure;
- 阅读回执(可选)
如果需要确认收件人是否打开了邮件,可以添加阅读回执头,但这依赖收件人主动同意发送,可靠性较低:
mail.Headers.Add("Disposition-Notification-To", "sender@domain.com");
三、关键说明
- 没有实时API能直接获取最终送达状态,因为邮件从SMTP服务器到收件人邮箱的投递流程是异步的,由目标邮件服务商控制。
- 送达回执的可靠性取决于发件人和收件人使用的邮件服务器是否支持DSN协议,部分服务商可能会拦截或延迟发送回执邮件。
内容的提问来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

