C#批量发送邮件:单个收件人失败是否触发Send(Msg)全局异常?
C#多收件人邮件发送失败的行为说明
好问题!我来给你明确C#中使用SmtpClient.Send(MailMessage)处理多收件人时的错误逻辑:
- 默认抛出全局异常:只要有任意一个收件人发送失败(比如邮箱地址无效、服务器拒绝投递等),
Send()方法就会立刻抛出SmtpFailedRecipientsException(如果只有单个收件人失败,会抛出子类SmtpFailedRecipientException),不会自动跳过失败的收件人继续发送剩余的。 - 部分收件人可能已收到邮件:这里有个容易踩坑的细节——邮件服务器可能已经成功将邮件投递到部分收件人的邮箱,之后才检测到某个收件人无效并返回错误。也就是说,抛出异常时,成功的收件人已经拿到邮件了,只有失败的那个没收到。
- 如何定位失败的收件人:抛出的异常对象里包含了详细的失败信息,你可以通过
SmtpFailedRecipientsException.InnerExceptions集合遍历每个失败的收件人记录,获取对应的邮箱地址和错误原因。
举个简单的异常处理示例:
try { smtpClient.Send(mailMessage); } catch (SmtpFailedRecipientsException ex) { foreach (var innerEx in ex.InnerExceptions) { var failedRecipient = ((SmtpFailedRecipientException)innerEx).FailedRecipient; Console.WriteLine($"收件人 {failedRecipient} 发送失败:{innerEx.Message}"); } } catch (SmtpException ex) { Console.WriteLine("邮件发送出现全局错误:" + ex.Message); }
如果你的需求是跳过失败的收件人,确保其他收件人能收到邮件,那不能直接用多收件人一次性发送的方式,建议拆分收件人列表,逐个(或小批量)发送,对每个发送操作单独捕获异常,这样就不会因为单个收件人失败导致全部发送流程中断。
内容的提问来源于stack exchange,提问作者amir
相关产品推荐
相关产品推荐

