【问题标题】:How to spamproof a mailto link?如何对 mailto 链接进行垃圾邮件防护?
【发布时间】:2011-04-07 04:23:30
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: html encoding obfuscation spam mailto


    【解决方案1】:

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

    以下是流行的 JavaScript 反垃圾邮件混淆器:

    上面还有a php version可以从服务器端生成混淆邮件。

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

    <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>
    

    【讨论】:

    • 这可能是一个愚蠢的问题,我很抱歉在这么老的帖子上发表评论/提问,但是一旦生成网页,电子邮件地址似乎以纯文本形式存在,你可以对单击,复制电子邮件地址。这些垃圾邮件机器人在解码并显示在渲染页面上之后获取这些信息不是很简单吗?我无法想象它这么简单,但我就是不知道是什么阻止了这种情况,我非常想知道。谢谢! :)
    • 在回答上面的评论时,垃圾邮件机器人非常基本,它们旨在扫描 HTML 邮件链接,混淆本身对邮件链接进行编码,因此垃圾邮件机器人无法读取它。不太可能有足够聪明的机器人来对此进行解码,因为智能机器人不具有成本效益。
    • 我很确定基于 PhantomJS 的机器人能够很好地阅读该电子邮件。
    • 正确 - 任何无头浏览器套件都可以正常阅读此链接。恐怕没有客户端加密或混淆对现代无头浏览器工具包起作用。如果您不想让您的电子邮件地址被盗用,请提供邮件表格。或者只是处理它会被收割的事实,并获得具有良好垃圾邮件过滤功能的邮件服务器 - 像 GMail 这样的现代提供商足够聪明,可以过滤任何东西。
    【解决方案2】:

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

    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 example here.

    【讨论】:

    【解决方案3】:

    以 Daniel Vassallo 的回答为基础,一种加密 mailto 链接的方法可能避免更聪明的垃圾邮件机器人评估 JS document.writes(正如化身所指出的那样)将解密放入仅在单击链接时才评估的 Javascript 函数。例如,使用 base64 作为“加密”:

    <script>
    
      function decryptEmail(encoded) {
    
        var address = atob(encoded);
        window.location.href = "mailto:" + address;
    
      }
    
    </script>
    
    <a href="javascript:decryptEmail('dGVzdEB0ZXN0LmNvbQ==');">Email</a>
    

    Working Plunker.

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

    【讨论】:

    • 这似乎是一个简单而聪明的解决方案。
    【解决方案4】:

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

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

    【讨论】:

    • 例如,他们在谷歌地图中获取各种商业信息。如果可能的话,拥有电子邮件地址会很棒(我知道您可以手动输入,但我正在寻找原因;)...)。
    • @Wookai Ahhh,完全没有想到……!好一个。而且,是的,这使得“Mailhide”策略变得毫无用处。
    【解决方案5】:

    您可以使用aemail.com等外部服务:

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

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

    例子:

    &lt;a href="mailto:info@itee.com"&gt;Contact&lt;/a&gt;

    替换为

    &lt;a href="https://aemail.com/q2"&gt;Contact&lt;/a&gt;

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

    【讨论】:

      【解决方案6】:

      我只是使用:

      <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>
      

      【讨论】:

      • 你是说 BOTS 看不到任何来自 javascript 的输出,即使它被写入了 html?
      • 我不太确定这一点,但我可以说最好使用类似的方法来保护您的电子邮件地址。
      • 如果您要使用此方法,我建议将 document.write 包装在 setTimeout 中以延迟它。大多数“人类”不会注意到延迟,但是任何不暂停并且只获取初始 html 源的机器人都不会获得地址。即setTimeout(function(){ document.write("&lt;a href='mailto:" + pre + "@domain.com'&gt;" + pre + "@domain.com&lt;/a&gt;"); },250); 这将延迟写入 250 毫秒。
      【解决方案7】:

      当用户将鼠标悬停在链接上,或者如果在移动设备上触摸它时,我的版本会根据 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') 或网络上的elsewhere 将您的电子邮件编码为base64:

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

      html中的示例链接:

      <a href="#" target="_blank" data-gen-email>Email Me!</a>
      

      【讨论】:

        【解决方案8】:
        //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', '#');
        })
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-30
          • 1970-01-01
          • 2013-10-02
          • 2016-10-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-27
          相关资源
          最近更新 更多