避免垃圾邮件机器人






4.74/5 (32投票s)
2004年8月26日
2分钟阅读

134569

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. 可选地,更新状态区域
您可以通过处理 mouseover 和 mouseout 事件来扩展链接,以在状态区域中显示电子邮件地址。 更新后的 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 的控件会很容易。
