65.9K
CodeProject 正在变化。 阅读更多。
Home

一个防垃圾邮件的链接控件

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.69/5 (11投票s)

2004 年 5 月 8 日

4分钟阅读

viewsIcon

66855

downloadIcon

556

此控件可以在网页上显示电子邮件地址作为链接,而无需担心被垃圾邮件发送者捕获。

引言

如果您想在网页上显示电子邮件地址,通常会插入一些 HTML 代码,如下所示:

<a href="mailto:name@mydomain.com">Contact</a>

不幸的是,这种类型的代码很容易被垃圾邮件发送者捕获,很快您的地址就会被分发给坏人。您的收件箱将充满未经请求的邮件。

有一种方法可以解决这个问题,涉及到 JavaScript。当客户端不支持 JavaScript 时,您仍然可以为访问者提供一个显示地址的图像。

由于这种情况在网页上经常出现,我决定创建一个处理此问题的用户控件。它将像您期望的那样显示邮件地址,但它是防垃圾邮件的。

从现在开始,您只需将 SpamSafeLink 控件放在您的 ASP.NET 页面上,设置一两个属性,控件就会处理其余的事情。

安装控件

只需解压源文件,然后将 SpamSafeLink.ascximage.aspx 这两个文件复制到您网站的任何文件夹中。

使用控件

在您的编辑器(Web Matrix、C# Builder、Visual Studio 等)中,将 SpamSafeLink.ascx 文件拖放到您想要显示链接的页面上。

如果您使用其他编辑器,可以手动添加控件。在页面顶部添加此指令:

<%@ Register TagPrefix="rw" TagName="SpamSafeLink" Src="SpamSafeLink.ascx" %>

然后,在您的 HTML 代码中您想要显示电子邮件链接的位置添加一个类似这样的标签:

<rw:SpamSafeLink id="SpamSafeLink1" Address="test@test.com" Text="Contact" 
    BgColor="White" LinkColor="Blue" Size="12" FontName="Verdana" runat="server">
</rw:SpamSafeLink>

接下来,确保使用适当的设置。

demo.aspx

使用 demo.aspx 演示页面作为示例,展示 SpamSafeLink 控件的用法。出于测试目的,您可能需要暂时禁用浏览器中的 JavaScript。在此处查看 有关如何启用/禁用 JavaScript 的说明。为了快速比较,您可以让您的浏览器每次都提示您。

您可以设置的控件属性如下:

  1. Address (String)

    这是最重要的属性。输入您想要用作链接目标的电子邮件地址。当客户端不支持 JavaScript 时,它将用作标题,但无法作为链接工作。

  2. Text (String)

    这是将显示为链接的标题。仅当您想要一个与邮件地址不同的标题时才设置此属性。如果省略,将使用 Address 属性。当客户端不支持 JavaScript 时,此属性将被忽略。

  3. BgColor (Color)

    这是图像的背景颜色(默认为白色)。当客户端支持 JavaScript 时,此属性将被忽略。

  4. LinkColor (Color)

    这是图像的文本颜色(默认为蓝色)。当客户端支持 JavaScript 时,此属性将被忽略。

  5. Size (Integer)

    这是图像的文本大小(默认为 8)。当客户端支持 JavaScript 时,此属性将被忽略。

  6. FontName (String)

    图像的字体名称(默认为 "Verdana")。当客户端支持 JavaScript 时,此属性将被忽略。

当客户端不支持 JavaScript 时,控件将仅显示地址,但无法作为链接工作。

工作原理

SpamSafeLink.ascx

控件只是将地址分成两部分,使用 ampersand 作为分隔符。在渲染时,控件只是将两部分分开输出,并附带一个小的 JavaScript。这样,扫描页面上地址的垃圾邮件机器人就会感到困惑。它仍然是一个链接,但真实的地址在页面的 HTML 中并不容易读取。

<script language="Javascript" type="text/javascript">
<!--
  document.write("<a href='mail")
  document.write("to:")
  document.write("<%=_Address1%>")
  document.write("@")
  document.write("<%=_Address2%>")
  document.write("'>")
  document.write("<%=Text%>")
  document.write("</a>")
//-->
</script>

当客户端不支持 JavaScript 时,浏览器将执行 <noscript> 块。

<noscript>
    <img src="<%=GetImageURL()%>" />
</noscript>

GetImageURL() 函数调用一个 ASP.NET 文件,该文件将即时创建图像。

    Private Function GetImageURL() As String
      Return "image.aspx?address1=" & _address1 & "&address2=" & _address2 & _
          "&linkcolor=" & _LinkColor.ToArgb() & "&bgcolor=" & _BgColor.ToArgb() & _
          "&size=" & _Size & "&FontName=" & _FontName
    End Function

地址、标题、颜色、大小和字体都来自用户控件的属性,并通过 GET 查询参数传递。此块调用 image.aspx 中的代码,该代码将创建一个 GIF 图像,仅显示电子邮件地址。在这种情况下,它无法作为可点击的链接。

为了节省处理器时间,缓存持续时间设置得非常高。

image.aspx

<%@ Page Language="VB" %>
<%@ OutputCache Duration="3600" 
  VaryByParam="Address1;Address2;size;bgcolor;linkcolor;FontName" %>
<%@ import Namespace="System.Drawing" %>
<%@ import Namespace="System.Drawing.Imaging" %>
<%@ import Namespace="System.Drawing.Drawing2D" %>
<script runat="server">

    Sub Page_Init( sender As Object, e As EventArgs)

        ' Since we are outputting a Gif, set the ContentType appropriately
        Response.ContentType = "image/gif"

        Dim FontName As String = Request.QueryString("FontName")
        Dim Address As String = Request.QueryString("Address1") _
                & "@" & Request.QueryString("Address2")
        Dim objFont As Font = New Font(FontName, CInt(Request.QueryString("size")))

        ' Create a Temporary Bitmap instance
        ' and a Graphics instance to get the image size
        Dim objBitmapTemp As Bitmap= New Bitmap(1, 1)
        Dim objGraphicsTemp As Graphics = Graphics.FromImage(objBitmapTemp)

        Dim ImageSize As SizeF = objGraphicsTemp.MeasureString(Address,objFont)
        ' clean up...
        objGraphicsTemp.Dispose()
        objBitmapTemp.Dispose()

        ' Create a Bitmap instance and a Graphics instance
        Dim objBitmap As Bitmap= New Bitmap(Convert.ToInt32(ImageSize.width),_
                                           Convert.ToInt32(ImageSize.height))
        Dim objGraphics As Graphics = Graphics.FromImage(objBitmap)

        Dim BgBrush = New SolidBrush(Color.FromArgb(Request.QueryString("bgcolor")))
        Dim TextBrush = New _
             SolidBrush(Color.FromArgb(Request.QueryString("linkcolor")))

        objGraphics.FillRectangle(BgBrush, 0, 0, _
           ImageSize.width, ImageSize.height)  ' Background
        objGraphics.DrawString(Address, objFont,_
                            TextBrush, 0, 0) ' Draw address

        ' Save the image to a file
        objBitmap.Save(Response.OutputStream, ImageFormat.Gif)

        ' clean up...
        objGraphics.Dispose()
        objBitmap.Dispose()

    End Sub

</script>
<!-- no HTML content -->

未来

以下是一些未来改进的想法:

  • 从样式表(如果页面使用)中提取字体、颜色和大小。
  • 使用相对大小而不是绝对大小。
  • 将其转换为完整的自定义控件。

如果有人决定扩展此功能,或有任何评论或疑问,非常欢迎您反馈。

关注点

  • 用户控件。
  • 在 ASP.NET 中使用 GDI+ 图形。

历史

2004/5/8:发布 1.0 版本。

© . All rights reserved.