You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 19:45:03