飘遥的Blog

C/C++/.NET
posts - 126, comments - 199, trackbacks - 9, articles - 0
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C#编码Email地址,防火防盗防垃圾邮件

Posted on 2010-11-17 22:35  Zzx飘遥  阅读(...)  评论(... 编辑 收藏

很多热心的博友为方便帮助他人,在博客上留下自己Email地址。为防止垃圾邮件,把邮件地址以图片的形式或以文本将@符号替换为(at)或#等形式发布。这样难免给他人带来一点不便。在浏览衣兄博客时,发现其邮件链接有些有趣,稍研究了一下,原来是将邮件地址拆分并进行了编码,看起来根本就不是邮件地址。这样就可以越过那些"邮件地址采集器"。在实验中发现将mailto:进行编码,Outlook也能识别,其他邮件客户端没有进行测试。
花了一袋烟的功夫写了个小工具。思路是:将邮件地址拼接成“mailto:youremail@domain.com?Subject=”的形式,然后随机拆分该字符串,编码后赋值到javascript变量。最后将javascript变量相加。编码方式是:将单字节字符编码为%XX的形式,(unicode)双字节字符编码为\uXXXX形式。具体实现见代码。
生成的效果见公告栏。


多少粘点代码吧(汗...)

// Divide the string to some parts.
protected List<string> PartString(string input)
{
    List
<string> list = new List<string>();
    Random rnd
= new Random(); 
    
int len = input.Length;
    
int idx = 0;

    
while (len > 0)
    {
        
int tmp = rnd.Next(1, len + 1);

        list.Add(input.Substring(idx, tmp));

        idx
+= tmp;
        len
-= tmp;
    }

    
return list;
}

// Encode string. ASCII: %xx format; double bytes: \uxxxx format.
protected string EncodeString(string input)
{
    StringBuilder output
= new StringBuilder(input.Length * 4);

    
foreach (char c in input)
    {
        
int charValue = (int)c;

        
if (charValue > 255)
        {
            output.AppendFormat(
"\\u{0:x4}", charValue);
        }
        
else
        {
            output.AppendFormat(
"%{0:x2}", charValue);
        }
    }

    
return output.ToString();
}

// Generate unique variable name.
protected string GenerateVarName()
{
    Random rnd
= new Random();
    
string output = ((char)((int)'a' + rnd.Next(0, 26))).ToString() + rnd.Next(0, 10);

    
while (vars.ContainsKey(output))
    {
        output
= ((char)((int)'a' + rnd.Next(0, 26))).ToString() + rnd.Next(0, 10);
    }

    
return output;
}

演示地址:http://www.xianfen.net/Article148.aspx
代码下载:点这里