可防止垃圾邮件的超级链接控件
垃圾邮件满天飞的时代,想在网上公布自己的email是需要很大勇气的,我到现在已经放弃好几个email了,没办法,因此站长们在自己的网站上公布客户的email需要考虑防止垃圾邮件的问题。
我找了很多资料,来自http://www.codeproject.com/aspnet/spambot.asp的方法简便易行,很合我意,我给他封装成了控件,方便使用,一拖一放就可以了,省去不少麻烦。
本人功力尚浅,还没有加入"设计时支持"。
思路很简单,利用javascript,将明文的“mailto:somobody@web.com”等字样,加以变换,将真实地址隐藏起来。
先看效果:
下面是控件的代码:
//原型来自:http://www.codeproject.com/aspnet/spambot.asp
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Text;
namespace SimCity.WebControl
{
/// <summary>
/// HyperLinkStopSpamEmail 的摘要说明。
/// </summary>
[DefaultProperty("Email"),
ToolboxData("<{0}:HyperLinkStopSpamEmail runat=server></{0}:HyperLinkStopSpamEmail>")]
public class HyperLinkStopSpamEmail : System.Web.UI.WebControls.WebControl
{
private string strEmail;
private string strText;
[Bindable(true),
Category("Data"),
DefaultValue("")]
public string Email
{
get
{
return strEmail;
}
set
{
strEmail = value;
}
}
[Bindable(true),
Category("Data"),
DefaultValue("")]
public string Text
{
get
{
return strText;
}
set
{
strText = value;
}
}
string EncodeEmailAddress(string email)
{
return BitConverter.ToString(
ASCIIEncoding.ASCII.GetBytes(email)).Replace("-", "");
}
/// <summary>
/// 将此控件呈现给指定的输出参数。
/// </summary>
/// <param name="output"> 要写出到的 HTML 编写器 </param>
protected override void Render(HtmlTextWriter output)
{
string str = "";
if(strEmail.Length == 0)
{
string strEncodedEmail = EncodeEmailAddress(strEmail);
str = "<a href=\"javascript:sendEmail('" + strEncodedEmail + "')\" "
+ "onmouseover=\"javascript:displayStatus('" + strEncodedEmail + "');return true;\" "
+ "onmouseout=\"javascript:clearStatus(); return true;\">";
if(strText.Length == 0)
str += strText;
else
str += "<script language=\"javascript\" type=\"text/javascript\">document.write(decodeEmail(\""
+ strEncodedEmail
+ "\"));</script>";
str += "</a>";
}
output.Write(str);
}
protected override void OnLoad(EventArgs e)
{
string strScript = "<script language=JavaScript>function sendEmail(encodedEmail){location.href = \"mailto:\" + decodeEmail(encodedEmail);}"
+ "function displayStatus(encodedEmail){window.status = \"mailto:\" + decodeEmail(encodedEmail);}"
+ "function clearStatus(){ window.status = \"\";}"
+ "function decodeEmail(encodedEmail){var email = \"\";"
+ "for (i=0; i < encodedEmail.length;){var letter = \"\";"
+ "letter = encodedEmail.charAt(i) + encodedEmail.charAt(i+1);"
+ "email += String.fromCharCode(parseInt(letter,16));"
+ "i += 2;}return email;}</script>";
if(!this.Page.IsClientScriptBlockRegistered("StopSpamEmail"))
this.Page.RegisterClientScriptBlock("StopSpamEmail", strScript);
}
}
}
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Text;
namespace SimCity.WebControl
{
/// <summary>
/// HyperLinkStopSpamEmail 的摘要说明。
/// </summary>
[DefaultProperty("Email"),
ToolboxData("<{0}:HyperLinkStopSpamEmail runat=server></{0}:HyperLinkStopSpamEmail>")]
public class HyperLinkStopSpamEmail : System.Web.UI.WebControls.WebControl
{
private string strEmail;
private string strText;
[Bindable(true),
Category("Data"),
DefaultValue("")]
public string Email
{
get
{
return strEmail;
}
set
{
strEmail = value;
}
}
[Bindable(true),
Category("Data"),
DefaultValue("")]
public string Text
{
get
{
return strText;
}
set
{
strText = value;
}
}
string EncodeEmailAddress(string email)
{
return BitConverter.ToString(
ASCIIEncoding.ASCII.GetBytes(email)).Replace("-", "");
}
/// <summary>
/// 将此控件呈现给指定的输出参数。
/// </summary>
/// <param name="output"> 要写出到的 HTML 编写器 </param>
protected override void Render(HtmlTextWriter output)
{
string str = "";
if(strEmail.Length == 0)
{
string strEncodedEmail = EncodeEmailAddress(strEmail);
str = "<a href=\"javascript:sendEmail('" + strEncodedEmail + "')\" "
+ "onmouseover=\"javascript:displayStatus('" + strEncodedEmail + "');return true;\" "
+ "onmouseout=\"javascript:clearStatus(); return true;\">";
if(strText.Length == 0)
str += strText;
else
str += "<script language=\"javascript\" type=\"text/javascript\">document.write(decodeEmail(\""
+ strEncodedEmail
+ "\"));</script>";
str += "</a>";
}
output.Write(str);
}
protected override void OnLoad(EventArgs e)
{
string strScript = "<script language=JavaScript>function sendEmail(encodedEmail){location.href = \"mailto:\" + decodeEmail(encodedEmail);}"
+ "function displayStatus(encodedEmail){window.status = \"mailto:\" + decodeEmail(encodedEmail);}"
+ "function clearStatus(){ window.status = \"\";}"
+ "function decodeEmail(encodedEmail){var email = \"\";"
+ "for (i=0; i < encodedEmail.length;){var letter = \"\";"
+ "letter = encodedEmail.charAt(i) + encodedEmail.charAt(i+1);"
+ "email += String.fromCharCode(parseInt(letter,16));"
+ "i += 2;}return email;}</script>";
if(!this.Page.IsClientScriptBlockRegistered("StopSpamEmail"))
this.Page.RegisterClientScriptBlock("StopSpamEmail", strScript);
}
}
}