可防止垃圾邮件的超级链接控件

    垃圾邮件满天飞的时代,想在网上公布自己的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);
        }

    }

}

posted on 2007-08-02 15:12  xlander  阅读(423)  评论(1编辑  收藏  举报

导航