如何使用MimeKit创建Web beacon(网络追踪信标)?
用MimeKit实现Web Beacon(邮件追踪信标)
当然可以用MimeKit实现Web beacon!先给你理清楚核心逻辑:Web beacon的本质是让邮件客户端在打开邮件时,主动请求一个你服务器上的远程资源——通过这个请求,你就能记录下“邮件被打开”的事件,以及对应的用户/邮件信息。你之前用LinkedResources嵌入本地图片的方式是把图片直接打包进邮件里,客户端不需要发请求就能显示,自然没法追踪。
实现步骤&代码修改
替换本地嵌入图片为远程追踪URL
你不需要再添加本地的LinkedResources,而是在邮件的HTML正文中插入一个指向你服务器接口的<img>标签,这个标签要带唯一标识(比如用户ID、邮件ID),方便你后续识别是谁打开了哪封邮件。同时把图片设成1x1像素隐藏,避免影响邮件排版。修改你的
makeMailContents方法:private string makeMailContents(Klant klant, Mail mail) { var builder = new BodyBuilder(); // 生成唯一追踪参数,比如用邮件ID+用户ID的组合 var trackParams = $"emailId={mail.Id}&userId={klant.Id}"; // 替换成你的服务器追踪接口地址 var beaconUrl = $"https://your-server-domain.com/api/track?{trackParams}"; // 构建HTML内容,插入隐藏的追踪信标 builder.HtmlBody = $@" <html> <body> <!-- 你的邮件正文内容 --> <p>Hello {klant.Name}, 这是你的邮件内容...</p> <!-- Web Beacon:1x1隐藏图片,触发远程请求 --> <img src=""{beaconUrl}"" width=""1"" height=""1"" style=""display:none; border:0;"" alt="""" /> </body> </html>"; // 这里不需要再添加LinkedResources了 return builder.ToMessageBody().ToString(); }服务器端实现追踪接口
你需要在自己的服务器上写一个接口,用来接收这个图片请求,记录追踪数据,然后返回一个1x1的透明图片(或者直接返回204 No Content,但返回图片兼容性更好)。举个ASP.NET Core的例子:
[HttpGet("api/track")] public IActionResult TrackEmail(string emailId, string userId) { // 1. 记录追踪日志:比如写入数据库,记录时间、用户ID、邮件ID等 _trackerService.LogOpenEvent(Guid.Parse(userId), Guid.Parse(emailId), DateTime.UtcNow); // 2. 返回1x1透明PNG图片(提前准备好的小图片,或者动态生成) var imagePath = Path.Combine("wwwroot/trackers/track_open.png"); return PhysicalFile(imagePath, "image/png"); // 或者直接返回204状态码,不需要图片 // return NoContent(); }
关键注意点
- 邮件客户端限制:很多邮件客户端(比如Gmail、Outlook)默认会阻止加载远程图片,用户需要手动允许才能触发追踪。这是普遍的隐私保护机制,没法绕过,只能接受这个局限性。
- 参数加密:如果担心参数被篡改或泄露,建议对
emailId和userId进行加密处理,服务器端再解密。 - 避免被当成垃圾邮件:不要过度使用追踪,频繁的追踪请求可能会让你的邮件被归类为垃圾邮件,影响送达率。
内容的提问来源于stack exchange,提问作者Berend Hulshof
相关产品推荐
相关产品推荐

