有时我们有这样一种需求场景,我们给很多用户发了邮件,需要一个反馈,用户是否查看了我们发送的邮件,百度了以下果然有方案。

我总结实践了下这个过程,同时有自己的一点使用感受。记录下希望对你有帮助。

有人想到在邮件的 body嵌套html页面,嵌套iframe这些都似乎不可行,没有实践。

有人想在邮件body中加入个js文件,或代码,企图让js发信息到服务器,这个更不可行,为了防止跨站攻击,腾讯等邮件服务商已经过滤掉了这些标签。不允许出现<script> js <link> 或者<type>css标签。 亲测了腾讯。

百度中有人提出在邮件body中加入一张图片,图片地址为自己网站的的一张图片。

这个方案我试了下是可以的。在自己的网站上捕获图片请求,然后就知道谁查看了这个邮件,刚开始我想着,给每个客户一个不同的图片,图片名字为客户的标识,然后捕获标识,截取名字,插入查看记录。

但是发现用户量太大不可行,然后优化了下,真是多想了,我们可以给几百万用户使用同一张图片,但是在用程序生成内容的时候,给每个用户发的图片名字不要一样就可以了,图片名字就用标识名字,捕获以后,然后再改为正确名字,

然后完美解决。

我模仿客户端的代码如下:

<form id="form1" runat="server">
<div>
11837
<span id="useraddr">123456789@qq.com</span>
<div>
<img src="http://localhost:11822/EmailPic/ac1234567.png?" alt="图片" />
<script src="http://localhost:11822/EmailPic/email.js" type="text/javascript"></script>
<script src="https://www.baidu.com/emai/email.js" type="text/javascript"></script>
<link href="https://www.baidu.com/style/StyleSheet1.css" rel="stylesheet" />
<script type="text/javascript">
var add = document.getElementById("useraddr").innerText;
alert(add);
</script>
</div>
</div>
</form>

  第二个项目模仿服务端,调试的时候端口定死就可以了。

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace ServerWeb
{
public class MyHttpHandler : IHttpHandler
{
public bool IsReusable
{
get { return true; }
} public void ProcessRequest(HttpContext context)
{
string filePath = context.Request.Path;
if (filePath.Contains("EmailPic"))
{
context.Response.ContentType = "image/JPEG";
string fullPath = context.Server.MapPath(filePath);
int startIndex = fullPath.IndexOf("ac");
string userAction = fullPath.Substring(startIndex - 1, 10);
fullPath = fullPath.Substring(0, startIndex) + "001.png";
context.Response.WriteFile(fullPath); }
} }
}

  

 服务端我自己写了个类,实现IHttpHandler接口,也就是自己实现IHttpHandler捕获用户请求了。

EmailPic是个文件夹,文件夹下面有一张图片,001.png表示这是邮件标识图片。

自己实现HttpHandler需要配置webconfig,如下配置,在<system.web>节点下配置:

<system.web>
<compilation debug="true" targetFramework="4.5.1" />
<httpRuntime targetFramework="4.5.1" />
<httpHandlers>
<add path="*.jpg,*.png" verb="*" type="ServerWeb.MyHttpHandler,ServerWeb"/>
</httpHandlers>
</system.web>

  

我这里没有具体业务代码,但是,你既然知道了,原理是什么,在自己的网站上如何捕获请求。其他的都不是事了,自己改改实现下业务就可以了。

这里少一大块是什么呢,是如何发邮件的代码,以及循环生生成邮件,在给邮件体加图片时,给每个用户的图片名字标识问题,可以使用用户编号,或者自己随机生成标识,有人说这里要考虑安全问题,再自己研究吧。感觉没什么安全问题。

唯一担心的是邮件服务商,关注你的图片,分析你的客户编号。这就要注意了。

asp.net如何实现跟踪检查用户知否查看了邮件。的更多相关文章

  1. ASP.NET连接数据库时,提示“用户 'sa' 登录失败原因: 未与信任 SQL Server 连接相关联

    用ASP.NET连接数据库时,提示"用户 'sa' 登录失败.原因: 未与信任 SQL Server 连接相关联.".解决方法:首先检查是不是web.config文件内的用户名密码 ...

  2. [原创]java WEB学习笔记45:自定义HttpFilter类,理解多个Filter 代码的执行顺序,Filterdemo:禁用浏览器缓存的Filter,字符编码的Filter,检查用户是否登陆过的Filter

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  3. asp.net动态加载ascx用户控件

    原文:asp.net动态加载ascx用户控件 在主aspx/ascx文件中,将目标ascx1,ascx2控件拖拉到其页面中,然后删除,目的是要生成:Register 代码,然后在主文件中定义DIV或T ...

  4. Asp.NET WebApi+Redis实现单用户登录实战演练

    一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理和 ...

  5. 在ASP.Net环境中,当用户点击报表中的超链接时如何调用Java Script方法?

    问题描述:在ASP.Net环境中,当用户点击报表中的超链接时如何调用Java Script方法? 问题解答: 你可以在TextObject.Hyperlink对象中编写js代码(javascript: ...

  6. 检查用户输入信息是否完整(vb.net实现)

        机房收费系统中.在将用户输入的信息封装到实体中作为參数传到B层之前,总要对用户输入的信息进行检查.我将这种检查分为两类: 合法性检查 完整性检查     所谓合法性检查,就是用户输入的信息是否 ...

  7. access_ok | 检查用户空间内存块是否可用

    access_ok() 函数是用来代替老版本的 verify_area() 函数的.它的作用也是检查用户空间指针是否可用. 函数原型:access_ok (type, addr, size); 变量说 ...

  8. 利用try-catch代码检查用户输入数据是否是有效的浮点数超级详细

    package chapter6; //数据输入格式检查 import java.io.IOException; import java.util.InputMismatchException; im ...

  9. 从零开始实现asp.net MVC4框架网站的用户登录以及权限验证模块 详细教程

    从零开始实现asp.net MVC4框架网站的用户登录以及权限验证模块 详细教程   用户登录与权限验证是网站不可缺少的一部分功能,asp.net MVC4框架内置了用于实现该功能的类库,只需要简单搭 ...

随机推荐

  1. html input file accept

    *.3gpp audio/3gpp, video/3gpp 3GPP Audio/Video*.ac3 audio/ac3 AC3 Audio*.asf allpication/vnd.ms-asf ...

  2. Python 正则:前后界定和前后非界定

    在用正则去匹配识别手机号.QQ.微信号的时候,往往由于输入的文本可能非常的另类,比如,没有标点和隔断,这时`^`和`$`就用不上了. 不用其实也可以识别的,但是有个问题,手机后是11位数字,QQ是5~ ...

  3. FLINK流计算拓扑任务代码分析<二>

    首先 是 StreamExecutionEnvironment see = StreamExecutionEnvironment.getExecutionEnvironment(); 我们在编写 fl ...

  4. STM32 HAL库学习系列第3篇 常使用的几种延时方式

    1   自带的hal_delay 函数    毫秒级延迟 void HAL_Delay(__IO uint32_t Delay) { uint32_t tickstart = HAL_GetTick( ...

  5. 树莓派3B+学习笔记:12、安装FireFox浏览器

    1.在终端中输入 sudo apt-get install iceweasel 2.安装完成后菜单中会自动生成快捷方式 什么是 iceweasel? Iceweasel 是 Firefox(火狐浏览器 ...

  6. 树莓派安装DNSMASQ服务

    功能: DNSMASQ是一款高性能的.小型的DNS服务器软件. * 缓存域名.IP地址,本地缓存解析的地址. * DHCP服务 1.安装 sudo apt-get update sudo apt-ge ...

  7. Leecode刷题之旅-C语言/python-383赎金信

    /* * @lc app=leetcode.cn id=383 lang=c * * [383] 赎金信 * * https://leetcode-cn.com/problems/ransom-not ...

  8. Node.js 引用 gm 包错误 Error: Could not execute GraphicsMagick/ImageMagick

    今天在学习前后台图像剪切时,下载了有图片剪切瑞士军刀之称的 GraphicsMagick. 给 gm.exe 配置了环境变量,在 npm 下好了 gm 的模块,但是运行却出现了错误. 错误如图: [E ...

  9. Java - JavaMail - 利用 JavaMail 发邮件的 小demo

    1. 概述 面试的时候, 被问到一些乱七八糟的运维知识 虽然我不是干运维的, 但是最后却告诉我专业知识深度不够, 感觉很难受 又回到了一个烦人的问题 工作没有深度的情况下, 你该如何的提升自己, 并且 ...

  10. 20155207 2016-2017-2《Java程序设计》课程总结

    20155207 2016-2017-2<Java程序设计>课程总结 每周作业链接汇总: 预备作业一:一路风景---我期待的是师生关系 预备作业二:学习情况的相关调查 预备作业三:安装虚拟 ...