隐藏垃圾邮件机器人电子邮件的有效方法


195

在我的主页上,我正在使用这种方法来隐藏垃圾邮件机器人的电子邮件:

<a href="admin [at] example.com"
   rel="nofollow"
   onclick="this.href='mailto:' + 'admin' + '@' + 'example.com'">Contact me</a>

你怎么看待这件事?有效吗 您还知道或使用其他哪些方法?


这可能是stackoverflow.com/questions/163628/…的副本,或者其他无效,因为它是非社区Wiki的长列表。
西罗Santilli郝海东冠状病六四事件法轮功

5
这有更多的投票,答案和观点。不应该关闭它,而赞成另一个没有更少投票,答案和观点的人。
abatishchev 2014年

1
我将关闭此人,以跟随这一事实吸引更多的事实。
abatishchev 2014年

6
最好的解决方案是不要共享您的解决方案。不幸的是,这是一个问题。最好找到您的解决方案并将其保留给自己。如果一个人标准化了,那么花木将被用来克服它。
Dimitris 2014年

1
最好的解决方案是结合以下几种解决方案,例如电子邮件的第一部分作为图像,第二部分this.href.replace(/x/g,''),第三部分以十六进制编码等。没有垃圾邮件程序,无论多么聪明,都将尝试对邮件的不同部分进行不同的解码方法电子邮件地址。

Answers:


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接收电子邮件,所以垃圾邮件几乎是没有问题的。因此,我无法说出这种方法的有效性。您可能想阅读产生此图的这项研究(尽管它很旧):

在此处输入图片说明


为什么需要服务器端包含emailObfuscator.include?就像用纯.html编写代码一样吗?(也许只是一个例子?)为什么还要<!-- -->在脚本中使用html注释?最后,为什么您的<script>标签之一是小写而其他标签是大写<SCRIPT>?这些方法是否有助于混淆机器人或其他东西?
圣殿骑士

@Templar SSI不是必需的,据我所知,它也不会使机器人困惑。它使(使)我的网站模块化(不再使用此方法了)。该评论引用了我发现该骇客的来源(现已断开链接)。情况的变化只是fl幸。如果它混淆了机器人,那就更好了,但是我怀疑它是否会起作用。
Fuhrmanator 2014年

4
最近的更完整的研究探索了相同的想法:grall.name/posts/1/antiSpam-emailAddressObfuscation.html
Lucas Cimon

95

在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


6
这需要更多的赞许。
heXer

不知道为什么,但是尽管此解决方案看起来令人印象深刻,但无法触发我的电子邮件客户端。这是供您测试的小提琴:jsfiddle.net/wd436tg3
Ricardo Zea

1
@RicardoZea您使用哪个浏览器?您的小提琴在chrome(即11,edge和firefox)上对我来说效果很好
塞浦路斯

3
太棒了 但是在onclick-event后面附加“; return false”。这将防止在浏览器URL中添加难看的#(通过取消原始的href链接)
T4NK3R

5
但是,我不能手动复制(可见的)邮件地址(在Chrome,Firefox或Edge中)?
T4NK3R

83

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

的CSS

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

的HTML

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

然后,上述CSS会覆盖阅读方向,并以正确的顺序向用户显示文本。

希望能帮助到你

干杯


54
肯定很有趣。但不幸的是,这是不可点击的,并且不能复制/粘贴,而忽略了任何非CSS浏览器,例如盲文阅读器。
Arjan

恩,很好,但是一旦编写爬虫的人看到了它,它就变得毫无用处。

6
使用RegEx匹配反向电子邮件地址与不反向匹配它一样容易。垃圾邮件散发着数十亿美元的生意,而垃圾邮件散发者甚至没有使用自己的CPU周期来抓取屏幕。实际上,他们已经阅读了此对话并相应地调整了他们的方法。机器人可以读取任何计算机可读的内容。无论是通过CSS还是JavaScript执行。
JaniHyytiäinen13年

3
@JaniHyytiäinen我不同意。他们没有为CPU付费的事实,并不意味着他们拥有无限的资源。如果运行JS解释器后产生的地址数量太少,他们会禁用它。
o0'。

1
@Lohoris:Google报告平均页面加载时间为(2.45s),平均页面大小为(320KB),它使您了解可以进行多少解析。当下载线程正在执行请求时,解析线程可以进行解析。多数下载正在等待。这使dl线程可以在决定将其发送到解析器之前检查先决条件。例如,呈现页面,indexOf('@'),indexOf('mailto:')等。解析线程在匹配过程中将仅接收+ -200个字符,这将允许如此复杂的解析,以至于“出现”为无限大解析能力的条款。
JaniHyytiäinen15年

52

我对此有完全不同的看法。我为此使用MailHide

MailHide是Google提供的系统,用户需要完成reCAPTCHA测试,然后向他们显示电子邮件。


15
尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会无效。
showdev 2014年

5
虽然我一般都同意这种观点,但在这种情况下,答案是使用特定工具。如果链接消失了,我将删除答案。
tvanfosson

谢谢-太好了。我正在写这样的文章(链接是显示的):给我发送电子邮件:显示
chrs

6
请注意,从Match 2018开始,Google禁用MailHide。与“免费” Google服务一样,它们一如既往地提供:只要它们可以从中受益,就可以提供数据,一旦获得所需,他们就将其丢弃。最不可靠的公司提供免费服务。如果您需要继续尝试做的事情,那么我将远离Google或其他任何人的服务。
masi

51

最初不是我的主意,但找不到作者:

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

根据需要添加任意多个x。它非常适合读取,复制和粘贴,并且不能被机器人读取。


2
整齐!但是移动用户呢?
Bodzio

触摸链接时也会触发鼠标悬停。它应该工作正常。
安德鲁·斯威夫特

4
只要您的地址不包含任何x,就可以使用。:-p但是,我知道,只需使用其他字母即可。
丹·亨德森

1
但是,如果禁用了javascript,您将向用户显示不存在的地址,这将反弹回来,使您失去客户。
Xeevis'1

34
如果禁用了javascript,则我的网站都无法工作;-)
Andrew Swift

16

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


6
唯一的问题是您没有所发送消息的副本,除非您花时间将其复制并粘贴到其他位置。就我个人而言,我不介意复制和粘贴,而是粘贴到各自的位置。
gvkv

6
至于发件人没有副本:对于网络上的多种形式,我喜欢自己获取副本的选项。但是,通常这样的选项允许滥用以匿名方式向几乎任何人发送消息……
Arjan

12
这可能会隐藏您的电子邮件地址,但是除非您使用验证码图片验证脚本保护表单安全,否则它根本不会阻止垃圾邮件。
SimonDowdles 2010年

1
您还可以通过包含将其发送给他们的选项来解决发件人没有副本的问题。
steinybot 2013年

1
选项“发送副本给自己”-有效地将表单变成垃圾邮件规范,让您作为发送者-坏主意!
T4NK3R


10

如果您有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);
?>

1
而不是使用php,您可以实际创建图像。与使用CSS反转一样,除非使用笔,否则您仍然会遇到无法点击且无法复制的问题:P
Claudiu 2015年

9

我知道我的答案不会被很多人喜欢,但请在忽略之前考虑此处列出的要点。

垃圾邮件发送者会轻易地将任何易于机读的内容进行机器可读。即使他们的行为对我们来说是愚蠢的,他们也不是愚蠢的人。他们是创新和足智多谋的。他们不仅使用僵尸程序来收集电子邮件,还拥有许多可用的方法,除此之外,他们只是为新的电子邮件清单付费。这意味着,他们在全球范围内吸引了成千上万的黑帽黑客来执行其工作。准备编写恶意软件的人会刮擦其他人的浏览器的屏幕,最终使您试图实现的任何方法都变得无用。十多个这样的人已经阅读了此主题,他们在嘲笑我们。他们中的一些人甚至无聊地哭了,以至于我们无法对他们提出新的挑战。

请记住,您最终并不是在节省时间,而是在节省他人的时间。因此,请考虑在这里花一些额外的时间。没有容易执行的魔术子弹。如果您在一家在网站上发布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);

8

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

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>

然后检查您的来源,您将惊喜不已!


这是一个很好的例子。谢谢。有关使用十六进制解码的SpamBots的任何线索?
jasonflaherty 2012年

7

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

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

最有效的解决方案是使用图像,但是用户必须手动复制地址是一件很痛苦的事情。

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

onclick="this.href='mailto:' + 'admin' + '&#x40;' + 'domain.com'"

5

Spambots不会解释这一点,因为它是一个鲜为人知的方法:)

首先,定义css:

email:before {
    content: "admin";
}

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

现在,无论您要显示电子邮件的何处,只需插入以下HTML:

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

和田田!


此方法有效,但不支持复制粘贴,这可能会影响大多数用户的可用性
Iruku Kagika

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);
});

是一个工作示例。


将鼠标悬停在链接上时,它会在浏览器状态栏中显示href的正确值吗?
Nik O'Lai 2015年

是的,当链接悬停时,它的确显示了href的正确值。这就是为什么需要实现jQuery方法.hover的原因。
Sergiu

不幸的是,没有,至少当您第一次将鼠标悬停在链接上时,它没有显示正确的href值(它是me@example.spam)。在第二次悬停时,一切正常。使用您自己的链接对其进行测试。
Nik O'Lai 2015年

1
它可以在Chrome和IE中使用。似乎仅在Firefox上,第一次悬停时,状态栏未更新。我将尝试找到适用于Firefox的解决方案。
塞尔吉(Sergiu)2015年

1
我明白,我明白,我实际上很喜欢这一个人。
埃里克·比斯哈德

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

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


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>

2
试试google.se/search?q=HTML+entities+converter,它应该让您忙碌;)
grapefrukt

1
Google可以为您找到很多页面。举个例子:hp.vector.co.jp/authors/VA022023/javascript/...
罗曼Linsolas

4
但是,机器人也不能像正则表达式一样容易地进行正则表达式吗?
gargantuan

20
好的,最好将me @ stack ...示例编写为me @ example.com,me @ example.net或me@example.org,这些是非所有者在示例中应该使用的唯一域名!
Arjan


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>

2

直到机器人程序员发现此“编码”并实施解密算法后,隐藏电子邮件地址的最佳方法才有用。

JavaScript选项无法长期运行,因为有很多爬虫在解释JavaScript。

没有答案,恕我直言。


是否有搜寻器解释JavaScript?在过去的几年中,我的一种JavaScript编码方法对我来说似乎效果很好-我的垃圾邮件发送率一直相当稳定,大约每周4次,因此我不必担心我委托给该方法的其他人的地址。我是不是该?
凯夫

当然,它可能会排除许多爬虫,但是我,如果我创建了一个地址爬虫,我将实现一个JavaScript库:)
guerda

比您想象的还要多的努力
匿名co

Google现在正在抓取一些JS。
Alister Bulman

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>

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


完全同意,垃圾邮件发送者是“聪明”的人,经过多年人们在语法中添加[at]或[dot]的人,当然,他们将拥有使用这些模式的算法。
SimonDowdles 2010年

如何解码这些十六进制值?
jasonflaherty 2012年

2

我是SpamSpan的粉丝-它被混淆了,但是如果禁用了JS,仍然可以识别。尽管我在低流量的网站上仅使用了大约一年,但它似乎也可以工作。

如果需要,Drupal还有一个模块可以自动将电子邮件转换为SpamSpans。


1

如果我右键单击链接并选择“复制URL”,是否可以使用?如果不是,那将是非常不理想的情况(我很少单击mailto链接,而是倾向于复制电子邮件地址并将其粘贴到我的邮件应用程序中,或者在特定时间点需要的其他地方)。

过去,我一直很偏执地在线保护我的邮件地址(UseNet,Web等),但是如今,我怀疑实际上是通过编程将更多的“可能的垃圾邮件目标”实际上是通过本地部分与域进行匹配而生成的。我的目的是偶尔查看我的邮件服务器日志。往往有很多尝试将邮件发送到不存在的地址(包括90年代后期我在UseNet上悬挂的垃圾邮件诱饵的截断版本,当时地址抓取非常普遍)。


1

在使用了很多技术之后,我发现了一种简单且非常友好的方法,机器人在搜索@Símbolo,最近他们搜索了[at] ant,它是变异的,所以我使用了2种技术

  1. 我在DomainDolls使用的图片上写了我的电子邮件,它可以完美运行,或者
  2. 用它的图像替换Símbolo(@)

@替换 并且图片alt将为alt =“ @”,因此该漫游器将找到图片,任何人都将其视为正常地址,因此如果他复制了该图片,则将复制该电子邮件,而工作是don,因此代码为

<p>myname<img src="http://www.traidnt.net/vb/images/mail2.gif" width="11" height="9" alt="@" />domain.com</p>


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>

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


2
哦,看-me@domain.extension-有纯文本电子邮件地址。
Alister Bulman

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。


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代替“。”。

即:

 info(AT)XXXabc(DOT)com 

1
我认为选项1不是一个好的选择。与机器人一起运行的解析器可以轻松地找出innerHTML的值,而选项3可能也不是那么好,因为智能机器人可以将其识别出来。我认为选项2是最好的。
约翰·桑德森

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/


1

HTML_CHARACTER呢?

joe&#064;mail.com

输出

joe@mail.com

1
电子邮件地址不可通过这种方式单击,@符号的位置也不是防弹的,因为它看起来并不总是与内联放置时的外观相同。
布伦特·奥康纳

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>

0

我最喜欢ofaurax的回答,但我会对此进行修改,以获取更多隐藏的电子邮件:

onclick="p1='admin'; p2='domain.com'; this.href='mailto:' + p1 + '& #x40;' + p2"

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.