60

我希望访问者能够直接在我的网页上单击(或复制)电子邮件地址。然而,如果我能让机器人和其他爬虫更难(一点点)获得所说的电子邮件地址并将其注册到垃圾邮件列表中,那就太棒了。

我发现了不同的方法(即编码 mailto HTML 链接),无论是使用 JavaScript 还是纯 HTML,但你们有什么建议?JavaScript 技术似乎更复杂,但这可能会影响已关闭它的用户,以及像谷歌这样的合法爬虫。

另一方面,HTML 似乎有点基础,机器人作者现在应该已经弄清楚了......

我应该为此烦恼吗,还是垃圾邮件发送者会收到我的电子邮件?我知道反垃圾邮件过滤器越来越好,但如果我能做更多的事情来减缓垃圾邮件发送者的速度,我会的。

4

8 回答 8

47

JavaScript 仍然是最好的 mailto 混淆器之一。对于禁用 JavaScript 的用户,您可能希望将 mailto 链接替换为联系表单的链接。

下面是一个流行的 JavaScript 反垃圾邮件混淆器:

上面还有一个 php 版本,可以从服务器端生成混淆的电子邮件。

这是上述工具生成的用于混淆我的电子邮件地址的 JavaScript 代码(完整的评论):

<script type="text/javascript" language="javascript">
<!--
// Email obfuscator script 2.1 by Tim Williams, University of Arizona
// Random encryption key feature by Andrew Moulden, Site Engineering Ltd
// This code is freeware provided these four comment lines remain intact
// A wizard to generate this code is at http://www.jottings.com/obfuscator/
{ coded = "lMnK@wMunFK8MDDMKKt.ktl"
  key = "1DtzZ8TGBuhRjJMKWI4gkUF2qidfOyPmSN7X30Vpso6xvErLnwQCbalA95HcYe"
  shift=coded.length
  link=""
  for (i=0; i<coded.length; i++) {
    if (key.indexOf(coded.charAt(i))==-1) {
      ltr = coded.charAt(i)
      link += (ltr)
    }
    else {     
      ltr = (key.indexOf(coded.charAt(i))-shift+key.length) % key.length
      link += (key.charAt(ltr))
    }
  }
  document.write("<a href='mailto:"+link+"'>Email Me</a>")
}
//-->
</script><noscript><a href='contact-form.html'>Email Me</a></noscript>
于 2010-09-02T07:38:43.177 回答
19

这看起来是一种非常酷的字符编码方法,我认为这会击败基本的垃圾邮件机器人:

http://robspangler.com/blog/encrypt-mailto-links-to-stop-email-spam/

所以

<a href="mailto:test@test.com">Email</a>

变成

<a href="&#x6d;&#97;&#105;&#108;&#x74;&#111;&#58;&#116;&#101;&#115;&#116;&#x40;&#x74;&#101;&#115;&#x74;&#x2e;&#x63;&#111;&#109;">Email</a>

它的吸引力在于它不需要任何 Javascript。

Plunker 示例在这里

于 2017-02-21T14:07:56.433 回答
15

基于 Daniel Vassallo 的回答,一种加密 mailto 链接的方法可以避免更聪明的垃圾邮件程序,这些垃圾邮件程序将评估 JS document.write(如化身所指出的),将解密放在仅在单击链接时评估的 Javascript 函数中. 例如,使用 base64 作为“加密”:

<script>

  function decryptEmail(encoded) {

    var address = atob(encoded);
    window.location.href = "mailto:" + address;

  }

</script>

<a href="javascript:decryptEmail('dGVzdEB0ZXN0LmNvbQ==');">Email</a>

工作Plunker

我不声称知道这是否可以被更复杂的爬虫所超越。

于 2017-02-21T14:30:52.670 回答
11

可以使用reCAPTCHA Mailhide功能。use...@domain.tld这将在省略号是查看完整地址的链接的表单上呈现电子邮件地址。这对访客来说有点麻烦,但应该提供优质保护。话虽如此,这种技术不会让您的访问者直接从您的网页复制地址。

我不了解像 Google 这样的“合法爬虫”。至少,我不明白为什么谷歌应该索引电子邮件地址。(请参阅下面的 OP 评论。)

于 2010-09-02T07:41:49.740 回答
10

您可以使用诸如aemail.com 之类的外部服务:

@email 是一项免费的电子邮件隐藏服务,它使用短 URL 隐藏电子邮件,在单击链接后将发件人重定向到 mailto-url。

在 aemail.com 输入电子邮件后,您将获得一个短 URL,可用于替换您的“mailto”链接。单击链接后,您的用户将被重定向到“mailto” URL,而不会通知 aemail.com。API可用于动态隐藏电子邮件/获取 URL。

例子:

<a href="mailto:info@itee.com">Contact</a>

替换为

<a href="https://aemail.com/q2">Contact</a>

将保持电子邮件链接正常工作。

于 2017-05-22T07:58:09.120 回答
2

我只是使用:

<script language="javascript" type="text/javascript">
var pre = "hideme";
document.write("<a href='mailto:" + pre + "@domain.com'>" + pre
+ "@domain.com</a>");
</script>
<noscript>Enable javascript to see our email!</noscript>
于 2010-09-04T09:33:07.750 回答
2

当用户将鼠标悬停在链接上,或者如果在移动设备上触摸它时,我的版本会从 base64 编码的电子邮件字符串动态生成链接。所有具有“data-gen-email”属性的链接都可以使用。

// The string is your base64-encoded email
const emailAddress = atob("bWFpbHRvOnlvdUBkb21haW4uY29t");

// Select all links with the attribute 'data-gen-email'
const emailLinks = document.querySelectorAll('[data-gen-email]');

emailLinks.forEach(link => {
    link.onmouseover = link.ontouchstart = () => link.setAttribute('href', emailAddress);
});

您可以使用btoa('mailto:you@domain.com')或网络上的其他地方将您的电子邮件编码为 base64 :

btoa('mailto:you@domain.com'); // "bWFpbHRvOnlvdUBkb21haW4uY29t"

html中的示例链接:

<a href="#" target="_blank" data-gen-email>Email Me!</a>
于 2019-11-27T22:16:08.413 回答
0
//This sets the mailto link when clicked. 
//As the link is followed, the focus is also lost and the link reset to # 
//html should look like this :
//<a class="courriel" data-courriel="john" data-objet="Just a test" href="#">Some text</a>

$('.courriel').click(function() { 
  var sA = $(this).attr('data-courriel'); // get nickname
  var sO = $(this).attr('data-objet');    // get subject
//Adresses are hard coded here; a nick name is used; 
//this to prevent having a potentially decypherable encoded adress  in the <a> tag
  switch (sA) { 
    case 'john': 
      $(this).attr('href', 'mailto:john@lennon.com?subject=' + sO);
      break;
    case 'paul':
      $(this).attr('href', 'mailto:paul@mccartney.com?subject=' + sO);
      break;
    default:
        $(this).attr('href', '#');
  }


})
$('.courriel').focusout(function() { //reset the link to # on focus loss
    $(this).attr('href', '#');
})
于 2020-06-03T16:11:35.457 回答