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

避免垃圾邮件机器人

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.74/5 (32投票s)

2004年8月26日

2分钟阅读

viewsIcon

134569

downloadIcon

753

防止垃圾邮件机器人从网页上收集电子邮件地址。

引言

垃圾邮件机器人扫描网络并从网页、新闻组和其他来源收集电子邮件地址。 本文向您展示了一种您可以在网页中使用的简单技术,以避免垃圾邮件机器人。 这个想法被用在了我创建的 FotoVision 示例 中,但我认为在 FotoVision 示例之外讨论这个特定部分会很有用。 这个想法很简单; 并非将真实的电子邮件地址存储在 HTML 中,而是存储地址的编码版本,并在客户端需要时进行解码。

步骤 1. 编码电子邮件地址

首先,需要对电子邮件地址进行编码。 编码后的字符串可以在服务器上预先计算或动态计算。 以下函数使用 BitConverter 类将电子邮件地址 derf@example.com 编码为字符串 64657266406578616D706C652E636F6D

// C#

string EncodeEmailAddress(string email)
{
  return BitConverter.ToString(
    ASCIIEncoding.ASCII.GetBytes(email)).Replace("-", "");
}
' VB.NET

Function EncodeEmailAddress(ByVal email As String) As String
  Return BitConverter.ToString( _
    ASCIIEncoding.ASCII.GetBytes(email)).Replace("-", "")
End Function

步骤 2. 在 HTML 中使用编码后的电子邮件

不要在 HTML 链接中使用真实的电子邮件地址,而要使用编码后的值。 例如

<a href="javascript:sendEmail('64657266406578616D706C652E636F6D')">Email Derf</a>

我考虑过使用 HTML 编码电子邮件地址,但我认为垃圾邮件机器人更有可能处理该值,使用自定义编码算法是更好的解决方案。

步骤 3. 在客户端解码电子邮件地址

客户端函数 sendEmail 在客户端被调用; 这个函数解码电子邮件地址并显示电子邮件应用程序。 sendEmail 函数包含以下内容

// open the client email with the specified address

function sendEmail(encodedEmail)
{
  // do the mailto: link

  location.href = "mailto:" + decodeEmail(encodedEmail);
}

// return the decoded email address

function decodeEmail(encodedEmail)
{
  // holds the decoded email address

  var email = "";

  // go through and decode the email address

  for (i=0; i < encodedEmail.length;)
  {
    // holds each letter (2 digits)

    var letter = "";
    letter = encodedEmail.charAt(i) + encodedEmail.charAt(i+1)

    // build the real email address

    email += String.fromCharCode(parseInt(letter,16));
    i += 2;
  }
  
  return email;
}

就是这样,现在 derf@example.com 不会被垃圾邮件机器人拾取,因为文本从未出现在 HTML 中,但电子邮件链接仍然像预期的那样工作(点击时会显示带有正确地址的电子邮件程序)。

步骤 4. 可选地,更新状态区域

您可以通过处理 mouseovermouseout 事件来扩展链接,以在状态区域中显示电子邮件地址。 更新后的 HTML 链接如下所示

<a href="javascript:sendEmail('64657266406578616D706C652E636F6D')" 
  onmouseover="javascript:displayStatus('64657266406578616D706C652E636F6D'); 
  return true;" onmouseout="javascript:clearStatus(); return true;">
  Email Derf</a>

并且两个函数被添加到客户端脚本中

// display the email address in the statusbar

function displayStatus(encodedEmail)
{
  window.status = "mailto:" + decodeEmail(encodedEmail);
}

// clear the statusbar message

function clearStatus()
{
  window.status = "";
}

现在,当鼠标移动到链接上时,真实的电子邮件地址将显示在状态区域中。

示例代码和编码网页

示例代码中有两个文件。 文件 email.js 包含您可以包含在您的 HTML 页面中的客户端脚本函数。 文件 test.html 是一个使用 email.js 文件的示例 HTML 页面。

编码后的电子邮件地址可以在服务器上动态计算,但这并非必需的,您也可以预先计算编码后的电子邮件并在 HTML 中使用该值。 我创建了一个 编码网页,它编码您可以在 HTML 代码中粘贴的电子邮件地址。 如果您的站点包含大量电子邮件链接,那么创建一个接受电子邮件地址并发出包含编码链接的 HTML 的控件会很容易。

© . All rights reserved.