如何在Mailkit.SmtpClient的SendCompleted事件中传递自定义参数
Mailkit.SmtpClient传递自定义参数到SendCompleted事件的实现方案
以下三种实现方式均可满足需求,你可以根据自己的使用场景选择:
方式1:完全兼容System.Net.Mail使用习惯(首选)
Mailkit的SendAsync方法原生支持传入userState参数,用法和System.Net.Mail的userToken完全一致,你可以直接把自定义参数通过这个参数传递,在事件回调中从SendCompletedEventArgs.UserState读取即可。
代码示例:
// 自定义参数支持任意类型,可使用自定义类、匿名类等 var customUserState = new { OrderId = 10086, UserId = 2001, NeedSendNotice = true }; using var smtpClient = new MailKit.Net.Smtp.SmtpClient(); // SMTP连接、MimeMessage构造逻辑省略 smtpClient.SendCompleted += (sender, e) => { // 取出自定义参数 var state = e.UserState as dynamic; int orderId = state.OrderId; bool needNotice = state.NeedSendNotice; // 你的业务处理逻辑 if (e.Error != null) { // 发送失败处理 } else if (e.Cancelled) { // 发送取消处理 } else { // 发送成功处理 } }; // 第二个参数直接传入自定义参数,对应System.Net.Mail的userToken参数 smtpClient.SendAsync(message, customUserState);
方式2:闭包捕获自定义参数
如果需要更灵活的参数传递逻辑,不需要和SendAsync绑定,可以直接通过lambda闭包捕获外部的自定义参数:
// 自定义参数可以是任意作用域内的变量 int customOrderId = 10086; string customBizTag = "售后通知"; using var smtpClient = new MailKit.Net.Smtp.SmtpClient(); // 配置逻辑省略 EventHandler<MailKit.Net.Smtp.SendCompletedEventArgs> sendHandler = null; sendHandler = (sender, e) => { // 事件触发后立即取消订阅,避免内存泄漏 smtpClient.SendCompleted -= sendHandler; // 直接使用捕获的自定义参数 Console.WriteLine($"业务标签{customBizTag},订单{customOrderId}邮件处理完成"); // 业务逻辑省略 }; smtpClient.SendCompleted += sendHandler; smtpClient.SendAsync(message, null);
方式3:通过邮件自定义头传递参数
如果需要自定义参数和邮件实例绑定,后续可追溯,可以把参数写入MimeMessage的自定义头中:
var message = new MimeMessage(); // 写入自定义头,建议使用X-前缀符合邮件协议规范 message.Headers.Add("X-Custom-OrderId", "10086"); message.Headers.Add("X-Custom-BizTag", "售后通知"); using var smtpClient = new MailKit.Net.Smtp.SmtpClient(); // 配置逻辑省略 smtpClient.SendCompleted += (sender, e) => { var mailMsg = e.Message as MimeMessage; // 读取自定义参数 string orderId = mailMsg.Headers["X-Custom-OrderId"]; string bizTag = mailMsg.Headers["X-Custom-BizTag"]; // 业务逻辑省略 }; smtpClient.SendAsync(message, null);
适用场景对比
- 追求和System.Net.Mail用法一致,选方式1
- 参数仅用于本次事件回调,不需要和邮件绑定,选方式2
- 参数需要随邮件生命周期留存,后续可查,选方式3
内容的提问来源于stack exchange,提问作者Don2
相关产品推荐
相关产品推荐

