• [c#] 邮件群发工具的编写(四)邮件跟踪服务


       不管黑猫白猫,抓得到老鼠的就是好猫

     上一篇,邮件群发工具的编写(三)邮件发送的几种方式 中,我们谈到了发送邮件。这一篇,我们讲讲邮件跟踪服务器的创建

       邮件群发出去之后,很多朋友都想知道群发的效果。这就涉及到邮件跟踪服务了,其实很多大企业或公司都已经在实施这样的精准营销了,邮件发出去如果没人看,都是白忙,因此需要跟踪观察邮件接收人的状况:看了邮件没,看了几次,所处的地理位置 等等信息。

        OutLook回执

        很多人都用过windows自带的outlook邮件回执功能,只要收件人是用outlook,就可以在打开邮件时给发件人发送一封回执信,告诉我已经收到了信。但是这种方法局限性比较大,如果对方是用163或是Gmail等等非outlook收的信,怎么收到回执呢?

        主流邮箱

       现在比较主流的邮箱服务都带有这项功能,比如163和QQ,以及Gmail。但是如果手贱没有开启回执功能,我们的目的就达不到了。

         spypig

        相信很多人都接触过这个网站。这是一个免费服务的网站,可以用插入图片作为邮件正文的方法达到在线跟踪的目的。下面我们就来说说其中的原理:

      1. 这个网站首先会让你登记发信邮箱和密码。

      2.生成一张png格式的图片,用于夹在需要发出去的邮件正文一个比较隐秘的角落里。

      3.这张所谓的图片,其实是这个网站上的一个可以执行代码但是扩展名是图片格式的网页文件。

      可能我口拙没表达清楚,但是大家应该差不多清楚其中的原理了。

        下面,让我们也为自己量身定制一项个性化的服务!

      邮件跟踪服务当然与服务器相关,我们开发就简单用vs的环境就行了。首先建立一个项目:然后再添加一个一般处理文件命名为 image.ashx

    添加如下代码:

    View Code
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Web;
     5 using System.Drawing;
     6 using System.Net;
     7 using System.IO;
     8 using System.Drawing.Imaging;
     9 using System.Text;
    10 using System.Web.SessionState;
    11 namespace SanyOA
    12 {
    13     /// <summary>
    14     /// image 的摘要说明
    15     /// 
    16     /// </summary>
    17     public class image : IHttpHandler,IRequiresSessionState
    18     {
    19 
    20         public void ProcessRequest(HttpContext context)
    21         {
    22             context.Response.ContentType = "image/gif";
    23             context.Session["mailid"] = context.Request["MailId"];//这个是跟踪单个邮件索要传递的参数  
    24             int count = (int)(context.Session["count"] == null ? 0 : context.Session["count"]);//这里需要说明一下,为了简单我就只用session传递一下数据了,其实最后是用xml或数据库保存
    25              context.Session["count"]=count+1; 
    26             Bitmap bitmap = new Bitmap(1000, 100);
    27             IPAddress[] ipAddresses = Dns.GetHostAddresses(Dns.GetHostName());
    28             string ip = string.Empty;
    29             foreach(IPAddress ipAddress in ipAddresses )
    30             {
    31                 if (!ipAddress.ToString().StartsWith("192")&& !ipAddress.ToString().StartsWith("10"))
    32                     ip = ipAddress.ToString();
    33             }
    34             Graphics g = Graphics.FromImage(bitmap);
    35             //还可以对照纯真IP库将地理位置都找出来,当然最简单的是直接get到ip138然后提取出地理位置。
    36             g.DrawString(string.Format("邮件打开次数:{0}", context.Session["count"]), new Font("宋体", 12), Brushes.AliceBlue, new PointF(0, 0));
    37             g.DrawString(string.Format("目标IP为:{0}", ip), new Font("宋体", 12), Brushes.AliceBlue, new PointF(0, 20));
    38             g.DrawString(string.Format("邮箱打开页面连接为:{0}", context.Request.UrlReferrer.AbsoluteUri), new Font("宋体", 12), Brushes.AliceBlue, new PointF(0, 40));
    39 
    40             /*
    41              * 这里添加自己发送邮件通知的代码,直接调用前面教程里所述的代码便可,
    42              * 主要是告诉发件人,邮件被打开了阅读了一次
    43              * site:www.uu102.com,代码所有权,转载请自动加上此段文字,尊重作者
    44              * 
    45              */
    46 
    47             bitmap.Save(context.Response.OutputStream,ImageFormat.Gif);
    48             //这里是为了方便演示,真正做项目不会有人这么傻这样做的
    49             //保存之前就要将采集到的数据保存到数据库,并且利用SmtpClient发送一封信件到发件箱里通知自己咯
    50             
    51         }
    52 
    53         public bool IsReusable
    54         {
    55             get
    56             {
    57                 return false;
    58             }
    59         }
    60     }
    61 }

    注意,自己调试的时候不要直接在浏览器里访问image.ashx文件,否则会报错的

    在程序里发送邮件的时候就应该自动给邮件的名字编上号码

    <img alt="记得一定要加上mailId这个参数" src="image.ashx?mailid=2" /><!--少了这个参数就运行错误的-->

      原理其实就是这么简单,但是具体实施起来可能会比我介绍的要稍微复杂一点。比如数据的传递以及保存,可能会涉及到数据库操作,当然你也可以简单一点,不过无论怎么样,都要考虑周到,比如图片要隐蔽,最好是透明的什么看不到,自己能看到就行。

    这样,邮件跟踪服务器就可以运作了。虽然还有很多事情要做,但是离邮件群发器的完整功能又近了一步,这是值得庆祝的事情!

    下一篇文章要讲讲,邮件接收,以及其他一些完善性的功能。大家千万别错过哦。教程每天都在更新,请大家继续关注!

     

  • 相关阅读:
    c++拷贝构造函数和赋值运算符
    c++运算符定义为成员函数还是非成员函数
    c++重载运算符位置的限制
    为什么operator<<运算符重载一定要为友元函数
    动态规划求一定数量骰子和的概率
    vector之reserve的坑
    c++ decltype和auto对比学习
    asio的前摄器模式
    动态显示当前时间
    js遍历二维数组
  • 原文地址:https://www.cnblogs.com/uu102/p/2671695.html
Copyright © 2020-2023  润新知