通过Microsoft Exchange Web Services发送邮件如何确认发送成功?
EWS 邮件发送成功的确认方案
你当前使用的Send()方法如果没有抛出异常,仅代表 Exchange 服务端已经接收了发件请求,无法直接证明邮件最终投递成功,可以通过以下几种方式分层验证:
方法1:替换发件方法做基础验证
将原来的email.Send()替换为email.SendAndSaveCopy(),方法执行无异常的话,邮件会自动存入当前账号的「已发送邮件」文件夹,这是最易实现的发件成功标识,修改后的代码参考:
var service = new ExchangeService(ExchangeVersion.Exchange2010_SP1) { Credentials = new WebCredentials(EmailFrom, Password), Url = new Uri(ExchangeUrl), }; var email = new EmailMessage(service) { Subject = "Test", Body = "Hello from .net!", }; email.ToRecipients.Add(EmailTo); // 替换原Send方法,发送成功会自动同步到已发送文件夹 email.SendAndSaveCopy();
如果执行过程中没有抛出异常,说明 Exchange 服务端已经受理了发件请求,邮件已进入发件队列。
方法2:捕获异常明确错误类型
所有 EWS 发件操作的请求阶段错误都会抛出对应异常,可以通过异常捕获明确失败原因:
try { email.SendAndSaveCopy(); // 无异常则代表服务端已接收发件请求 Console.WriteLine("邮件发件请求已被Exchange服务端受理"); } catch (ServiceResponseException ex) { // 服务端返回的业务错误,比如权限不足、收件人地址无效、邮箱空间不足等 Console.WriteLine($"发件失败:{ex.Message},错误代码:{ex.ErrorCode}"); } catch (Exception ex) { // 其他错误,比如网络不通、服务地址配置错误、身份验证失败等 Console.WriteLine($"系统错误:{ex.Message}"); }
方法3:验证最终投递状态
如果需要确认邮件是否成功投递到收件人邮箱,可以选择以下两种方案:
- 发送邮件时请求送达回执,后续通过 EWS 查询收件人返回的回执邮件即可确认投递结果
- 调用 EWS 的邮件跟踪 API,传入发送邮件的唯一 ID 查询实时投递状态,该功能仅 Exchange 2010 及以上版本支持
注意:以上所有方法只能确认 Exchange 服务端的处理状态,如果是收件方服务商拒收、邮件进入垃圾箱等下游投递问题,需要通过退信邮件或收件侧回执进一步判断
内容的提问来源于stack exchange,提问作者Kiramm
相关产品推荐
相关产品推荐

