47

在网页上放置电子邮件地址时,您是否将它们放置为如下文本:

joe.somebody@company.com

或者使用一个聪明的技巧来欺骗电子邮件地址收集机器人?例如:

HTML转义字符:

joe.somebody@company.com

Javascript解密器:

function XOR_Crypt(EmailAddress)
{
    Result = new String();
    for (var i = 0; i < EmailAddress.length; i++)
    {
        Result += String.fromCharCode(EmailAddress.charCodeAt(i) ^ 128);
    }
    document.write(Result);
}

XOR_Crypt("êïå®óïíåâïäùÀãïíðáîù®ãïí");

人工解码:

joe.somebodyNOSPAM@company.com

joe.somebody AT company.com

你用什么,甚至打扰?

4

51 回答 51

131

在 CSS 中处理内容和属性:

.cryptedmail:after {
  content: attr(data-name) "@" attr(data-domain) "." attr(data-tld); 
}
<a href="#" class="cryptedmail"
   data-name="info"
   data-domain="example"
   data-tld="org"
   onclick="window.location.href = 'mailto:' + this.dataset.name + '@' + this.dataset.domain + '.' + this.dataset.tld; return false;"></a>

禁用 javascript 时,仅单击事件将不起作用,仍显示电子邮件。

另一种有趣的方法(至少没有点击事件)是利用从右到左的标记来覆盖书写方向。有关此的更多信息:https ://en.wikipedia.org/wiki/Right-to-left_mark

于 2017-01-10T10:26:28.043 回答
98

这是我使用的方法,带有服务器端包含,例如<!--#include file="emailObfuscator.include" -->其中emailObfuscator.include包含以下内容:

<!-- // http://lists.evolt.org/archive/Week-of-Mon-20040202/154813.html -->
<script type="text/javascript">
    function gen_mail_to_link(lhs,rhs,subject) {
        document.write("<a href=\"mailto");
        document.write(":" + lhs + "@");
        document.write(rhs + "?subject=" + subject + "\">" + lhs + "@" + rhs + "<\/a>");
    }
</script>

为了包含地址,我使用 JavaScript:

<script type="text/javascript"> 
    gen_mail_to_link('john.doe','example.com','Feedback about your site...');
</script>
<noscript>
  <em>Email address protected by JavaScript. Activate JavaScript to see the email.</em>
</noscript>

因为自 2005 年以来我一直通过 Gmail 收到电子邮件,所以垃圾邮件几乎不是问题。所以,我不能说这种方法有多有效。您可能想阅读生成此图表的这项研究(尽管它很旧):

在此处输入图像描述

于 2012-04-24T15:08:48.593 回答
90

看看这种方式,非常聪明并且使用 css。

CSS

span.reverse {
  unicode-bidi: bidi-override;
  direction: rtl;
}

HTML

<span class="reverse">moc.rehtrebttam@retsambew</span>

然后,上面的 CSS 将覆盖阅读方向并以正确的顺序将文本呈现给用户。

希望能帮助到你

干杯

于 2009-01-27T12:34:01.597 回答
52

最初不是我的想法,但我找不到作者:

<a href="mailto:coxntact@domainx.com"
    onmouseover="this.href=this.href.replace(/x/g,'');">link</a>

添加任意数量的 x。它可以完美地读取、复制和粘贴,并且不能被机器人读取。

于 2014-10-17T08:02:33.460 回答
46

我一般不打扰。我曾经在一个每天收到数千封垃圾邮件的邮件列表上。我们的垃圾邮件过滤器(spamassassin)每天可能会通过 1 或 2 封邮件。有了这么好的过滤器,为什么让合法的人很难联系到你呢?

于 2008-10-02T17:47:15.417 回答
27

发明您自己的疯狂电子邮件地址混淆方案。不管它是什么,真的,只要它与任何众所周知的方法都不太相似。

问题是这个问题确实没有一个好的解决方案,它们要么相对容易绕过,要么对用户来说很烦人。如果任何一种方法变得流行,那么有人找到解决方法。

因此,与其寻找 One True 电子邮件地址混淆技术,不如想出自己的。依靠这样一个事实,即这些机器人作者对您的网站不够关心,以至于坐下来编写一个东西来绕过您稍微疯狂的渲染文本和 CSS 和元素边框或您完全奇怪的、容易破解的 javascript 加密. 不管它是否微不足道,没有人会费心试图绕过它,以便他们可以向您发送垃圾邮件。

于 2008-10-02T18:04:09.077 回答
16

您可以使用 reCAPTCHA 保护您的电子邮件地址,他们提供免费服务,因此人们必须输入 CAPTCHA(完全自动化的公共图灵测试以区分计算机和人类)才能看到您的电子邮件:https ://www.google.com/recaptcha /管理员#邮件隐藏

于 2008-10-02T17:52:14.173 回答
16

我编写了一个编码器source),它使用了我能想到的各种解析技巧(不同类型的 HTML 实体、URL 编码、注释、多行属性、软连字符、mailto 的非明显结构:URL 等)

它不会阻止所有收割机,但 OTOH 它完全符合标准并且对用户透明。

另一个恕我直言的好方法(除了棘手的编码之外,您还可以使用它)是:

<a href="mailto:userhatestogetspam@example.com" 
   onclick="this.href=this.href.replace(/hatestogetspam/,'')">
于 2008-11-17T21:18:43.517 回答
16

我认为您可以拥有的唯一万无一失的方法是创建一个“联系我”页面,该页面是一个提交给发送到您的电子邮件地址的脚本的表单。这样,您的地址就永远不会向公众公开。由于某种原因,这可能是不可取的,但我认为这是一个很好的解决方案。当我被迫将某人的电子邮件地址从他们的站点复制/粘贴到我的邮件客户端并向他们发送消息时,这常常让我感到厌烦;我宁愿通过他们网站上的表格直接完成。此外,这种方法允许您向您发送匿名评论等。请务必使用某种反机器人方案(例如验证码)保护您的表单。这里有很多关于 SO 的讨论。

于 2009-01-27T13:34:47.543 回答
11

如果你有 php 支持,你可以这样做:

<img src="scriptname.php">

和 scriptname.php:

<?php
header("Content-type: image/png");
// Your email address which will be shown in the image
$email    =    "you@yourdomain.com";
$length    =    (strlen($email)*8);
$im = @ImageCreate ($length, 20)
     or die ("Kann keinen neuen GD-Bild-Stream erzeugen");
$background_color = ImageColorAllocate ($im, 255, 255, 255); // White: 255,255,255
$text_color = ImageColorAllocate ($im, 55, 103, 122);
imagestring($im, 3,5,2,$email, $text_color);
imagepng ($im);
?>
于 2009-01-27T12:40:05.953 回答
9

我知道我的回答不会被很多人喜欢,但请在大拇指向下之前考虑这里概述的要点。

垃圾邮件发送者可以轻松地机器读取任何易于机器读取的内容。尽管他们的行为在我们看来很愚蠢,但他们并不是愚蠢的人。他们创新且足智多谋。他们不只是使用机器人来收集电子邮件,他们有大量的方法可供使用,除此之外,他们只需为良好的新电子邮件列表付费。这意味着,他们让全球成千上万的黑帽黑客来执行他们的工作。人们准备编写恶意软件来抓取他人浏览器的屏幕,最终使您尝试实现的任何方法都变得无用。这个帖子已经被 10 多个这样的人阅读了,他们在嘲笑我们。他们中的一些人甚至可能厌倦了流泪,发现我们无法对他们提出新的挑战。

请记住,您最终不是要节省自己的时间,而是要节省他人的时间。因此,请考虑在这里多花一些时间。没有容易执行的灵丹妙药。如果您在一家在网站上发布 100 人电子邮件的公司工作,并且您可以减少每人每天 1 封垃圾邮件,那么我们谈论的是每年 36500 封垃圾邮件。如果删除此类电子邮件平均需要 5 秒钟,那么我们谈论的是每年 50 个工作小时。更不用说减少的烦恼了。那么,为什么不花几个小时在这上面呢?

不仅您和收到电子邮件的人认为时间是一种资产。因此,您必须找到一种方法来混淆电子邮件地址,以使其无法破解。如果您使用一些广泛使用的方法来混淆电子邮件,那么破解它确实是值得的。由于结果是,破解者将获得数千封,如果不是数万或数十万封新电子邮件。而对他们来说,他们会得到钱。

所以,继续编写你自己的方法。这是一种罕见的情况,重新发明轮子确实有回报。使用一种机器不可读的方法,并且最好在不牺牲用户体验的情况下需要一些用户交互。

我花了大约 20 分钟来编写一个例子来说明我的意思。在示例中,我使用 KnockoutJS 只是因为我喜欢它,而且我知道您自己可能不会使用它。但无论如何都无关紧要。这是一种自定义解决方案,并未广泛使用。破解它不会带来回报,因为这样做的方法只能在广阔的互联网上的一个页面上工作。

这是小提琴:http: //jsfiddle.net/hzaw6/

下面的代码并不是好的代码示例。但只是一个快速的代码示例,机器很难弄清楚我们甚至在这里处理电子邮件。即使可以做到,大规模执行也不会有回报。

是的,我知道它在 IE = lte8 上不起作用,因为'无法获取未定义或空引用的属性'属性',但我根本不在乎,因为它只是方法的演示,而不是实际的实现,并且不打算按原样用于生产。随意编写自己的代码,它更酷,技术更可靠等。

哦,永远不要用 html 或 javascript 命名邮件或电子邮件。为任何名为 mail 或 email 的内容抓取 DOM 和 window 对象并检查它是否包含与电子邮件匹配的内容太容易了。这就是为什么您不希望任何变量包含完整形式的电子邮件,这也是您希望用户在分配此类变量之前与页面交互的原因。如果您的 javascript 对象模型包含任何处于 DOM 就绪状态的电子邮件地址,那么您就是将它们暴露给垃圾邮件发送者。

的HTML:

<div data-bind="foreach: contacts">
    <div class="contact">
        <div>
            <h5 data-bind="text: firstName + ' ' + lastName + ' / ' + department"></h5>
            <ul>
                <li>Phone: <span data-bind="text: phone"></span></li>
                <li><a href="#999" data-bind="click:$root.reveal">E-mail</a> <span data-bind="visible: $root.msgMeToThis() != ''"><input class="merged" data-bind="value: mPrefix" readonly="readonly" /><span data-bind="text: '@' + domain"></span></span></li>
            </ul>
        </div>
    </div>
</div>

JS

function ViewModel(){
    var self = this;

    self.contacts = ko.observableArray([
        { firstName:'John', mPrefix: 'john.doe', domain: 'domain.com', lastName: 'Doe', department: 'Sales', phone: '+358 12 345 6789' },
        { firstName:'Joe', mPrefix: 'joe.w', domain: 'wonder.com', lastName: 'Wonder', department: 'Time wasting', phone: '+358 98 765 4321' },
        { firstName:'Mike', mPrefix: 'yo', domain: 'rappin.com', lastName: 'Rophone', department: 'Audio', phone: '+358 11 222 3333' }
    ]);
    self.msgMeToThis = ko.observable('');
    self.reveal = function(m, e){
        var name = e.target.attributes.href.value;
        name = name.replace('#', '');
        self.msgMeToThis(name);
    };
}
var viewModel = new ViewModel();
ko.applyBindings(viewModel);
于 2013-08-24T13:23:32.507 回答
8

您可以尝试使用十六进制中的html 实体来隐藏字符(例如:@ for @)。这是一种方便的解决方案,因为正确的浏览器会翻译它,并且您可以拥有正常的链接。缺点是机器人可以在理论上翻译它,但这有点不寻常。我用它来保护我博客上的电子邮件。

另一种解决方案是使用 javascript来组装部分地址并即时解码地址。缺点是禁用 javascript 的浏览器不会显示您的地址。

最有效的解决方案是使用图像,但用户不得不手动复制地址是一种痛苦。

您的解决方案非常好,因为您只为禁用了 javascript 的用户添加了一个缺点(手动编写 @)。您还可以通过以下方式更安全:

onclick="this.href='mailto:' + 'admin' + '&#x40;' + 'domain.com'"
于 2009-01-27T13:44:22.127 回答
8

我最喜欢的方法之一是使用 php 混淆电子邮件地址,一个经典的例子是将字符转换为 HEX 值,如下所示:

function myobfiscate($emailaddress){
 $email= $emailaddress;                
 $length = strlen($email);                         
 for ($i = 0; $i < $length; $i++){                
 $obfuscatedEmail .= "&#" . ord($email[$i]).";";
 }
 echo $obfuscatedEmail;
}

然后在我的标记中,我将简单地调用它如下:

  <a href="mailto:<?php echo myobfiscate('someone@somewhere.com'); ?>"
title="Email me!"><?php echo myobfiscate('someone@somewhere.com');?> </a>

然后检查您的来源,您会感到惊喜!

于 2010-08-03T09:39:29.760 回答
6

我不会打扰 - 它是在错误的级别上与垃圾邮件战争作斗争。特别是对于公司网站,我认为如果页面上除了带有 mailto 超链接的纯文本之外还有其他任何内容,这会让事情看起来非常不专业。

到处都是垃圾邮件,无论如何您都需要进行良好的过滤,并且无论如何,任何机器人最终都会理解所有常见的技巧。

于 2008-10-02T17:50:22.960 回答
6

HTML:

<a href="#" class="--mailto--john--domain--com-- other classes goes here" />

JavaScript,使用jQuery

// match all a-elements with "--mailto--" somehere in the class property
$("a[class*='--mailto--']").each(function ()
{
    /*
    for each of those elements use a regular expression to pull
    out the data you need to construct a valid e-mail adress
    */
    var validEmailAdress = this.className.match();

    $(this).click(function ()
    {
        window.location = validEmailAdress;
    });
});
于 2008-10-02T18:16:47.530 回答
5

垃圾邮件机器人不会解释这一点,因为它是一种鲜为人知的方法:)

首先,定义css:

email:before {
    content: "admin";
}

email:after {
    content: "@example.com";
}

现在,无论您想在哪里显示您的电子邮件,只需插入以下 HTML:

<div id="email"></div>

还有多田!

于 2017-05-03T02:04:45.770 回答
4

我使用了一个非常简单的 CSS 和 jQuery 组合,它可以正确地向用户显示电子邮件地址,并且在单击或悬停锚点时也可以工作:

HTML:

<a href="mailto:me@example.spam" id="lnkMail">moc.elpmaxe@em</a>

CSS:

#lnkMail {
    unicode-bidi: bidi-override;
    direction: rtl;
}

jQuery:

$('#lnkMail').hover(function(){
    // here you can use whatever replace you want
    var newHref = $(this).attr('href').replace('spam', 'com');
    $(this).attr('href', newHref);
});

是一个工作示例。

于 2015-05-27T08:05:12.157 回答
3

我不打扰。你只会惹恼老练的用户并迷惑不老练的用户。正如其他人所说,Gmail 为个人/小型企业域提供了非常有效的垃圾邮件过滤器,而企业过滤器通常也非常好。

于 2008-10-02T19:58:30.157 回答
3

隐藏电子邮件地址的最佳方法只有在机器人程序员发现这种“编码”并实施解密算法之前才有效。

JavaScript 选项不会长时间工作,因为有很多爬虫解释 JavaScript。

没有答案,恕我直言。

于 2009-01-27T12:28:35.367 回答
3

一种简单的解决方案是使用 HTML 实体而不是实际字符。例如,“me@example.com”将转换为:

<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#109;&#101;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;">email me</A>
于 2009-01-27T12:29:51.620 回答
3

!- 添加此内容以供参考,不知道该信息可能是否过时,但它讲述了一些不需要使用任何脚本的简单解决方案

在我自己搜索这个之后,我遇到了这个页面,还有这些页面:

http://nadeausoftware.com/articles/2007/05/stop_spammer_email_harvesters_obfuscating_email_addresses

尝试反转电子邮件地址

纯 HTML 示例:

<bdo dir="rtl">moc.elpmaxe@nosrep</bdo>
Result : person@example.com

使用CSS同样的效果

CSS:
.reverse { unicode-bidi:bidi-override; direction:rtl; }
HTML:
<span class="reverse">moc.elpmaxe@nosrep</span>
Result : person@example.com

将其与前面提到的任何方法相结合甚至可以使其更有效

于 2013-01-03T11:06:49.410 回答
3

我对类似问题的回答

我使用了一个非常简单的 CSS 和 jQuery 组合,它可以正确地向用户显示电子邮件地址,并且在单击锚点时也可以工作:

HTML:

<a href="mailto:me@example.spam" id="lnkMail">moc.elpmaxe@em</a>

CSS:

#lnkMail {
  unicode-bidi: bidi-override;
  direction: rtl;
}

jQuery:

$('#lnkMail').hover(function(){
  // here you can use whatever replace you want
  var newHref = $(this).attr('href').replace('spam', 'com');
  $(this).attr('href', newHref);
});

是一个工作示例。

于 2015-05-27T07:59:17.463 回答
3

这是我的工作版本:


在某处创建一个带有后备文本的容器:

<div id="knock_knock">Activate JavaScript, please.</div>

并在 DOM 的底部(在渲染中)添加以下代码段:

<script>
  (function(d,id,lhs,rhs){
    d.getElementById(id).innerHTML = "<a rel=\"nofollow\" href=\"mailto"+":"+lhs+"@"+rhs+"\">"+"Mail"+"<\/a>";
  })(window.document, "knock_knock", "your.name", "example.com");
</script>

它将生成的超链接添加到指定的容器:

<div id="knock_knock"><a rel="nofollow" href="your.name@example.com">Mail</a></div>

另外这里是一个缩小版:

<script>(function(d,i,l,r){d.getElementById(i).innerHTML="<a rel=\"nofollow\" href=\"mailto"+":"+l+"@"+r+"\">"+"Mail"+"<\/a>";})(window.document,"knock_knock","your.name","example.com");</script>
于 2016-05-12T00:11:21.977 回答
3

一个巧妙的技巧是div使用单词Contact并仅在用户将鼠标移到电子邮件地址上时才显示电子邮件地址。电子邮件可以进行 Base64 编码以提供额外保护。

就是这样:

<div id="contacts">Contacts</div>

<script>
  document.querySelector("#contacts").addEventListener("mouseover", (event) => {
    // Base64-encode your email and provide it as argument to atob()
    event.target.textContent = atob('aW5mb0BjbGV2ZXJpbmcuZWU=')
  });
</script>
于 2020-07-18T14:35:53.840 回答
2

唯一最安全的方法当然是首先不要将电子邮件地址放在网页上。

于 2008-10-02T18:07:13.950 回答
2

请改用联系表格。将您所有的电子邮件地址放入数据库并创建一个 HTML 表单(主题、正文、发件人...),该表单提交用户在表单中填写的电子邮件内容(以及用于在您的数据库中查找该人的电子邮件地址)到服务器端脚本,然后将电子邮件发送给指定的人。电子邮件地址绝不会暴露。您可能还需要实施某种形式的 CAPTCHA 来阻止垃圾邮件程序。

于 2008-10-02T18:28:48.500 回答
2

可能有机器人将[at]和其他伪装识别为@符号。所以这不是一个真正有效的方法。

当然,您可以使用一些编码,如 URL 编码或 HTML 字符引用(或两者):

// PHP example
// encodes every character using URL encoding (%hh)
function foo($str) {
    $retVal = '';
    $length = strlen($str);
    for ($i=0; $i<$length; $i++) $retVal.=sprintf('%%%X', ord($str[$i]));
    return $retVal;
}
// encodes every character into HTML character references (&#xhh;)
function bar($str) {
    $retVal = '';
    $length = strlen($str);
    for ($i=0; $i<$length; $i++) $retVal.=sprintf('&#x%X;', ord($str[$i]));
    return $retVal;
}

$email = 'user@example.com';
echo '<a href="'.bar('mailto:?to=' . foo(','.$email.'')).'">mail me</a>';

// output
// <a href="&#x6D;&#x61;&#x69;&#x6C;&#x74;&#x6F;&#x3A;&#x3F;&#x74;&#x6F;&#x3D;&#x25;&#x32;&#x43;&#x25;&#x37;&#x35;&#x25;&#x37;&#x33;&#x25;&#x36;&#x35;&#x25;&#x37;&#x32;&#x25;&#x34;&#x30;&#x25;&#x36;&#x35;&#x25;&#x37;&#x38;&#x25;&#x36;&#x31;&#x25;&#x36;&#x44;&#x25;&#x37;&#x30;&#x25;&#x36;&#x43;&#x25;&#x36;&#x35;&#x25;&#x32;&#x45;&#x25;&#x36;&#x33;&#x25;&#x36;&#x46;&#x25;&#x36;&#x44;">mail me</a>

但由于使用它们是合法的,每个浏览器/电子邮件客户端也应该处理这些编码。

于 2009-01-27T12:29:37.423 回答
2

一种可能性是使用isTrusted属性(Javascript)。

Event 接口的 isTrusted 只读属性是一个布尔值,当事件由用户操作生成时为 true,当事件由脚本创建或修改或通过 EventTarget.dispatchEvent() 调度时为 false。

例如在你的情况下:

getEmail() {
  if (event.isTrusted) {
    /* The event is trusted */
    return 'your-email@domain.com';
  } else {
    /* The event is not trusted */
    return 'chuck@norris.com';
  }
}

⚠ IE 不兼容!

从文档中阅读更多信息:https ://developer.mozilla.org/en-US/docs/Web/API/Event/isTrusted

于 2020-09-12T16:12:09.303 回答
1

我创建了我的whateverDOC@whatever.com,然后在它旁边写下“删除大写字母”

于 2008-10-02T18:05:54.843 回答
1

另一种可能是独特的技术可能是使用多个图像和一些纯文本字母来显示地址。这可能会使机器人感到困惑。

于 2008-10-02T18:16:14.490 回答
1

免费的 Gmail 有一个很棒的垃圾邮件过滤器。

如果您不想直接使用 Gmail,您可以将电子邮件发送到 gmail,并在邮件通过垃圾邮件过滤器后使用 gmail 转发将其发回给您。

在更复杂的情况下,当您需要显示@business.com 地址时,您可以显示 public@business.com 并将所有这些邮件转发到 gmail 帐户,然后再将其转发回 real@business.com

我想这不是您问题的直接解决方案,但它可能会有所帮助。Gmail 是免费的并且拥有如此出色的垃圾邮件过滤器,恕我直言,使用它是一个非常明智的选择。

我每天在我的 gmail 帐户中收到大约 100 封垃圾邮件,但我不记得其中一封邮件最后一次进入我的收件箱是什么时候了。

总而言之,无论是 Gmail 还是其他垃圾邮件过滤器,都要使用一个好的垃圾邮件过滤器。让用户重新输入或修改显示的电子邮件地址就像使用 DRM 来防止盗版。把负担放在“好”人身上不应该是做任何事情的方式。:)

于 2008-10-02T19:12:26.680 回答
1

如果我右键单击链接并选择“复制 URL”,它会起作用吗?如果不是,那么这不是一个理想的情况(我很少点击 mailto 链接,更喜欢复制电子邮件地址并将其粘贴到我的邮件应用程序或在特定时间点我需要它的任何其他地方)。

我曾经相当偏执地在线保护我的邮件地址(UseNet、web 等),但现在我怀疑更多“可能的垃圾邮件目标”实际上是通过编程方式生成与域匹配的本地部分。我的基础是有时会浏览我的邮件服务器日志。向不存在的地址(包括我在 90 年代后期徘徊在 UseNet 上的垃圾邮件诱饵的截断版本,当时地址抓取非常普遍)往往有相当多的交付尝试。

于 2009-01-27T12:31:38.607 回答
1

首先,我会确保电子邮件地址仅在您启用 javascript 时显示。这样,没有 javascript 就没有纯文本可以读取。

其次,实现安全功能的一种方法是远离<button>标签。该标签需要在标签之间插入文本,使其具有计算机可读性。而是尝试<input type="button">使用 onClick 的 javascript 处理程序。然后使用其他人提到的所有技术来实现安全的电子邮件符号。

另一种选择是有一个带有“点击查看电子邮件地址”的按钮。单击后,它将变为编码电子邮件(HTML 代码中的字符)。在另一次单击时,这将重定向到“mailto:email”功能

最后一个想法的未编码版本,带有可选择和不可选择的电子邮件地址:

<html>
<body>
<script type="text/javascript">
      e1="@domain";
      e2="me";
      e3=".extension";
email_link="mailto:"+e2+e1+e3;
</script>
<input type="text" onClick="this.onClick=window.open(email_link);" value="Click for mail"/>
<input type="text" onClick="this.value=email;" value="Click for mail-address"/>
<input type="button" onClick="this.onClick=window.open(email_link);" value="Click for mail"/>
<input type="button" onClick="this.value=email;" value="Click for mail-address"/>
</body></html>

看看这是否是您想要的,并将其与其他人的想法结合起来。你永远不能太确定。

于 2009-01-27T18:39:35.260 回答
1

对于您自己的电子邮件地址,我建议不要太担心它。如果您需要将您的电子邮件地址提供给成千上万的用户,那么我建议您使用 gmail 地址(原版或通过谷歌应用程序)或使用高质量的垃圾邮件过滤器。

但是,当在您的网站上显示其他用户的电子邮件地址时,我认为需要进行一定程度的尽职调查。幸运的是,一位名叫 Silvan Mühlemann 的博主为您完成了所有艰巨的工作。他在 1.5 年的时间里测试了不同的混淆方法并确定了最好的方法,其中大多数涉及 css 或 javascript 技巧,这些技巧可以让地址在浏览器中正确显示,但会混淆自动抓取工具。

于 2009-11-06T12:46:21.760 回答
1

在使用了这么多技术后,我找到了一种简单且非常友好的方法,机器人搜索 @Símbolo,最近他们搜索 [at] ant it's 变种,所以我使用了 2 种技术

  1. 我把我的电子邮件写在一个像 domaintolls 使用的图像上,它工作得很好,或者
  2. 用它的图像替换 Símbolo (@)

@ 代替 并且图像 alt 将是 alt="@" 所以机器人会找到一个图像,任何人都会将其视为一个普通地址,所以如果他复制它,他将复制电子邮件并且工作完成,所以代码将是

<p>myname<img src="http://www.traidnt.net/vb/images/mail2.gif" width="11" height="9" alt="@" />domain.com</p>
于 2012-11-08T03:37:38.677 回答
1

HTML_CHARACTER 呢?:

joe&#064;mail.com

输出

joe@mail.com
于 2013-04-29T20:23:48.850 回答
1

还有我的功能。我创建它是查看放置在该主题中的答案。

 function antiboteEmail($email)
 {
        $html = '';

        $email = strrev($email);
        $randId = rand(1, 500);

        $html .= '<span id="addr-'.$randId.'" class="addr">[turn javascript on to see the e-mail]</span>';
        $html .= <<<EOD
                <script>
                $(document).ready(function(){

                    var addr = "$email";
                    addr = addr.split("").reverse().join("");
                    $("#addr-$randId").html("<a href=\"mailto:" + addr + "\">" + addr + " </a>");
                });
                </script>
EOD;

        return $html;
    }

它使用两种方法:从右到左 dir 和 javascript put。

于 2013-10-13T20:14:38.883 回答
1

选项 1:将电子邮件地址拆分为多个部分,并在 JavaScript 中从这些部分中创建一个数组。接下来以正确的顺序加入这些部分,并使用 .innerHTML 属性将电子邮件地址添加到网页。

 <span id="email">  </span>   // blank tag

 <script>
 var parts = ["info", "XXXXabc", "com", "&#46;", "&#64;"];
 var email = parts[0] + parts[4] + parts[1] + parts[3] + parts[2];
 document.getElementById("email").innerHTML=email; 
 </script>

选项 2:使用图像而不是电子邮件文本

来自文本的图像创建者网站:http: //www.chxo.com/labelgen/

选项 3:我们可以用 AT 代替“@”,用 DOT 代替“.”

IE :

 info(AT)XXXabc(DOT)com 
于 2014-03-06T07:18:17.793 回答
1

我不喜欢混合使用 JavaScript 和 HTML,这就是我使用这个解决方案的原因。目前对我来说效果很好。

想法data:您可以通过在-attributes中提供加密信息并在 JS 中对其进行解密来使其更加复杂。这只是通过替换字母或只是反转它们来完成。

HTML

<span class="generate-email" data-part1="john" data-part2="gmail" data-part3="com">placeholder</span>

JS

$(function() {
    $('.generate-email').each(function() {
        var that = $(this);
        that.html(
            that.data('part1') + '@' + that.data('part2') + '.' + that.data('part3')
        );
    });  
});

试试看:http: //jsfiddle.net/x6g9L817/

于 2015-12-02T13:49:10.697 回答
0

将电子邮件地址保存到 png 文件的脚本将是一个安全的解决方案(如果您有足够的空间并且允许您在页面中嵌入图像)

于 2008-10-02T18:26:20.067 回答
0

这就是我们使用的(VB.NET):

Dim rxEmailLink As New Regex("<a\b[^>]*mailto:\b[^>]*>(.*?)</a>")
Dim m As Match = rxEmailLink.Match(Html)
While m.Success
    Dim strEntireLinkOrig As String = m.Value
    Dim strEntireLink As String = strEntireLinkOrig
    strEntireLink = strEntireLink.Replace("'", """") ' replace any single quotes with double quotes to make sure the javascript is well formed
    Dim rxLink As New Regex("(<a\b[^>]*mailto:)([\w.\-_^@]*@[\w.\-_^@]*)(\b[^>]*?)>(.*?)</a>")
    Dim rxLinkMatch As Match = rxLink.Match(strEntireLink)
    Dim strReplace As String = String.Format("<script language=""JavaScript"">document.write('{0}{1}{2}>{3}</a>');</script>", _
                RandomlyChopStringJS(rxLinkMatch.Groups(1).ToString), _
                ConvertToAsciiHex(rxLinkMatch.Groups(2).ToString), _
                rxLinkMatch.Groups(3), _
                ConvertToHtmlEntites(rxLinkMatch.Groups(4).ToString))
    Result = Result.Replace(strEntireLinkOrig, strReplace)
    m = m.NextMatch()
End While

    Public Function RandomlyChopStringJS(ByVal s As String) As String
        Dim intChop As Integer = Int(6 * Rnd()) + 1
        Dim intCount As Integer = 0
        RandomlyChopStringJS = ""
        If Not s Is Nothing AndAlso Len(s) > 0 Then
            For Each c As Char In s.ToCharArray()
                If intCount = intChop Then
                    RandomlyChopStringJS &= "'+'"
                    intChop = Int(6 * Rnd()) + 1
                    intCount = 0
                End If
                RandomlyChopStringJS &= c
                intCount += 1
            Next
        End If
    End Function

我们覆盖 Render 并在它出门之前通过它运行传出的 HTML。这会呈现正常呈现给浏览器的电子邮件地址,但在源代码中如下所示:

<script language="JavaScript">document.write('<a '+'clas'+'s='+'"Mail'+'Link'+'" hr'+'ef'+'="ma'+'ilto:%69%6E%66%6F%40%62%69%63%75%73%61%2E%6F%72%67">&#105;&#110;&#102;&#111;&#64;&#98;&#105;&#99;&#117;&#115;&#97;&#46;&#111;&#114;&#103;</a>');</script>

显然不是万无一失的,但希望减少一定数量的收获,而不会给游客带来困难。

于 2008-10-02T18:28:47.377 回答
0

这取决于您的需求到底是什么。对于我工作的大多数网站,我发现输入“联系我/我们”表格更有用,该表格从系统向需要联系的任何人发送电子邮件。我知道这并不完全是您正在寻求的解决方案,但它确实可以完全防止收获,到目前为止我从未见过通过这样的表格发送垃圾邮件。它会发生,但它非常罕见,你永远不会收获。

如果您愿意,这也使您有机会在发送消息之前记录消息,从而为您提供额外的保护以防止失去联系。

于 2008-10-02T18:36:22.367 回答
0

随着时间的推移,垃圾邮件机器人将拥有自己的 Javascript 和 CSS 引擎,所以我认为你不应该朝这个方向看。

于 2010-03-06T13:22:45.597 回答
0

这是一个简单的jquery解决这个问题:

<script type="text/javascript">
$(document).ready(function() {
    str1="mailto:";
    str2="info";
    str3="@test.com";
    $("#email_a").attr("href", str1+str2+str3);

});
</script>

<a href="#" id="email_a"><img src="sample.png"/></a>
于 2011-09-05T13:24:51.637 回答
0

我最喜欢 ofaurax 的回答,但我会修改这个以获得更多隐藏的电子邮件:

onclick="p1='admin'; p2='domain.com'; this.href='mailto:' + p1 + '& #x40;' + p2"
于 2012-12-31T05:27:28.537 回答
0

我只需要提供另一个答案。我只是想出了一些有趣的东西来玩。

我发现在许多常见的字符表中,字母 @ 和 az 不止一次出现。您可以将原始字符映射到新的映射,让垃圾邮件机器人更难找出电子邮件是什么。

如果你遍历字符串,得到一个字母的字符代码,然后添加 65248 并基于数字构建一个 html 实体,你会得到一个人类可读的电子邮件地址。

var str = 'john.doe@email.com';
str = str.toLowerCase().replace(/[\.@a-z]/gi, function(match, position, str){
    var num = str.charCodeAt(position);
    return ('&#' + (num + 65248) + ';');
});

这是一个工作小提琴:http: //jsfiddle.net/EhtSC/8/

您可以通过在看起来相同的字符之间创建一组更完整的映射来改进此方法。但是,如果您将电子邮件复制/粘贴到记事本,例如,您会得到很多框。

为了克服一些用户体验问题,我将电子邮件创建为链接。当您单击它时,它会将字符重新映射回其原始状态。

为了改善这一点,您可以根据需要创建更复杂的字符映射。如果你能找到几个可以用来代替“a”的字符,为什么不随机映射到这些字符。

可能不是有史以来最安全的方法,但我真的玩得很开心:D

于 2013-08-25T12:30:36.233 回答
0

选项 1:将电子邮件地址拆分为多个部分,并在 JavaScript 中从这些部分中创建一个数组。接下来以正确的顺序加入这些部分,并使用 .innerHTML 属性将电子邮件地址添加到网页。

 <span id="email">  </span>   // blank tag

 <script>
 var parts = ["info", "XXXXabc", "com", "&#46;", "&#64;"];
 var email = parts[0] + parts[4] + parts[1] + parts[3] + parts[2];
 document.getElementById("email").innerHTML=email; 
 </script>

选项 2:使用图像而不是电子邮件文本

来自文本的图像创建者网站:http: //www.chxo.com/labelgen/

选项 3:我们可以用 AT 代替“@”,用 DOT 代替“.”

IE :

 info(AT)XXXabc(DOT)com 
于 2014-03-06T07:21:38.117 回答
0

我刚刚编写了以下代码。不知道它是否好,但它比用纯文本写电子邮件更好。许多机器人会被愚弄,但并非所有机器人都会被愚弄。

<script type="text/javascript">
    $(function () {
        setTimeout(function () {
            var m = ['com', '.', 'domain', '@', 'info', ':', 'mailto'].reverse().join('');

            /* Set the contact email url for each "contact us" links.*/
            $('.contactUsLink').prop("href", m);
        }, 200);
    });
</script>

如果机器人解决了这个问题,则无需添加更多“简单逻辑”代码,例如“if (1 == 1 ? '@' : '')”或以其他顺序添加数组元素,因为机器人无论如何都会评估代码.

于 2014-06-10T07:48:08.520 回答
0

字体很棒的作品!

<link rel="stylesheet" href="path/to/font-awesome/css/font-awesome.min.css">

<p>myemail<i class="fa fa-at" aria-hidden="true"></i>mydomain.com</p>

http://fontawesome.io/

于 2017-09-18T03:26:17.653 回答
0

隐藏的 Base64 解决方案。

我认为将电子邮件地址放在 :before/:after 伪中或将其拆分为反向写入的数据属性都没关系......垃圾邮件机器人很聪明,可以分析解析的网页。

此解决方案是交互式的。用户必须单击“显示”以获取 base64 解码的电子邮件地址,该地址可以被复制和/或可点击。

// search for [data-b64mail] attributes
document.querySelectorAll('[data-b64mail]').forEach(el => {

  // set "show" link
  el.innerHTML = '<span style="text-decoration:underline;cursor:pointer">show</span>';
    
  // set click event to all elements
  el.addEventListener('click', function (e) {
    let cT = e.currentTarget;

    // show address
    cT.innerHTML = atob(cT.getAttribute('data-b64mail'));
    
    // set mailto on a tags
    if (cT.tagName === 'A')
      cT.setAttribute('href', 'mailto:' + atob(cT.getAttribute('data-b64mail')));

  });

});

// get base64 encoded string
console.log(btoa('mail@example.org'));
<p>E-mail (span): <span data-b64mail="bWFpbEBleGFtcGxlLm9yZw=="></span></p>

<p>E-mail (link): <a href="#" data-b64mail="bWFpbEBleGFtcGxlLm9yZw=="></a></p>

于 2021-08-13T15:57:44.197 回答
-1

另一种选择,我更喜欢字体真棒图标

发实现:

<link rel="stylesheet" href="path/to/font-awesome/css/font-awesome.min.css">

邮件地址:

<a href="mailto:info@uploadimage.club"><span class="label">info<i class="fa fa-at"></i>uploadimage.club</span></a>
于 2017-12-25T09:14:21.713 回答