隐藏机器人的电子邮件地址 – 保持mailto:
TL;博士
从机器人隐藏电子邮件地址,而不使用脚本和维护mailto:
function。 方法还必须支持屏幕阅读器。
概要
-
无需使用脚本或联系表格即可发送电子邮件混淆信息
-
电子邮件地址需要对人类观众完全可见 ,并保持
mailto:
function -
电子邮件地址不得以图片forms 。
-
电子邮件地址必须“完全”隐藏垃圾邮件搜寻器和垃圾邮件机器人以及任何其他收集器types
预期效果:
-
请没有脚本 。 这个项目没有使用脚本, 我想保持这种方式 。
-
电子邮件地址显示在页面上,或者可以在某种用户交互之后轻松显示,例如打开模式。
-
用户可以点击电子邮件地址 ,然后触发
mailto:
function。 -
点击电子邮件将打开用户的电子邮件应用程序。
换句话说,
mailto:
function必须工作。 -
电子邮件地址不可见或未被识别为电子邮件地址(这包括页面源)
-
我没有一个充满垃圾邮件的收件箱
什么都行不通
-
添加一个联系表单 – 或类似的东西 – 而不是电子邮件地址
我讨厌联络表格 。 我很less填写联系表格。 如果没有电子邮件地址,我寻找一个电话号码,如果不在那里,我开始寻找替代服务。 我只会填写一个联系表格,如果我绝对必须。
-
用地址图像replace地址
这对使用屏幕阅读器的人造成巨大的不利影响( 请记住将来的项目中的视觉障碍者 )
它还会删除
mailto:
function,除非您使图像可点击,然后将mailto:
function添加为链接的href
,但是这样做会使目标失败 ,现在电子邮件对于漫游器是可见的。
什么可能工作:
-
巧妙地使用
CSS
的pseudo-elements
-
使用
base64
编码的解决scheme -
打破电子邮件地址并将文件分散到文档中,然后在用户单击button时将其重新放在一起(这可能涉及多个
CSS
类和anchor tags
的使用) -
通过
CSS
改变html
属性@MortezaAsadi在下面的评论中优雅地提出了可能性。 这是链接到完整 – 文章是从2012年:
如果我们可以使用CSS来改变HTML属性呢?
-
其他创造性的解决scheme超出了我的知识范围。
类似的问题/修复
- JavaScript:由Joe Maller保护您的电子邮件地址
(这是由Joe Maller提出的一个很好的解决scheme,它运行良好,但是它是基于脚本的 ,下面是它的样子;
<SCRIPT TYPE="text/javascript"> emailE = 'emailserver.com' emailE = ('yourname' + '@' + emailE) document.write('<A href="mailto:' + emailE + '">' + emailE + '</a>') </script> <NOSCRIPT> Email address protected by JavaScript </NOSCRIPT>
-
寻找一个PHP唯一的电子邮件地址混淆器function
(一个聪明的解决scheme,使用
PHP
和CSS
来首先使用PHP来反转电子邮件,然后使用CSS
来反转 )一个非常有前途的解决scheme,很棒! 但是解决起来太简单了 。 -
这些天是否值得在networking上混淆电子邮件地址?
(Javascript修复)
-
混淆网站上的电子邮件地址的最佳方法?
所选答案有效 。 它实际上工作得很好。 它涉及将电子邮件编码为
html entities
。 可以改进吗?这是它的样子;
<A HREF="mailto: yourname@domain.com"> yourname@domain.com </A>
-
电子邮件地址混淆真的有效吗?
(对这个超级用户问题的select答案很好,它提供了使用不同混淆方法接收的垃圾邮件数量的研究。
看来,操纵电子邮件地址与
CSS
使其rtl
确实工作。 这与本节中链接到的第一个问题中使用的方法相同。我不确定添加
mailto:
function到修复会对结果有什么影响。 -
还有很多其他的问题都有类似的答案。 我还没有find任何符合我预期效果的东西
问题:
是否有可能通过结合两个或更多的修复(甚至增加新的修复)来提高上述电子邮件混淆方法的效率 (即,尽可能less的垃圾邮件)
A-维护mailto:
function; 和
B-支持屏幕阅读器
编辑:
下面的许多答案和评论提出了一个非常好的问题,同时表明如果没有某种types的js
,这样做是不可能的
问/暗示的问题是:
为什么不使用
js
?
答案是我对js
过敏
虽然开玩笑,
我问这个问题的三个主要原因是:
-
联系表格越来越被接受,作为提供电子邮件地址的替代品 – 他们不应该这样做。
-
如果可以在没有脚本的情况下完成 ,那么应该在没有脚本的情况下完成 。
-
好奇心:(因为我现在实际上正在使用其中一个
js
修复)我想看看讨论这个问题是否会导致更好的方法。
与您的要求相关的问题特别是“支持屏幕阅读器”,因为根据定义,屏幕阅读器是某种“机器人”。 如果一个屏幕阅读器能够解释这个电子邮件地址,那么页面爬虫也能够解释它。
此外,mailto属性的重点是如何在networking上做电子邮件地址的标准。 询问是否有第二种方法可以做到这一点是问是否有第二个标准。
这样做通过脚本将仍然有相同的问题,因为一旦加载页面,脚本将已经运行,并在DOM中呈现的电子邮件地址(除非你填充电子邮件地址点击或其他)。 无论哪种方式,屏幕阅读器仍然有问题,因为它尚未加载。
老实说,只要得到一个有一半体面的垃圾邮件filter的电子邮件服务,并指定一个默认的主题行,很容易在您的收件箱中sorting。
<a href="mailto:no-one@no-where.com?subject=Something to filter on">Email me</a>
你所要求的是,如果标准有两种方法来做某事,一个是机器人,另一个是非机器人。 答案是没有,你必须尽可能地打机器人。
击败电子邮件机器人是一个艰难的。 您可能想查看维基百科上的电子邮件地址收集对策部分 。
我的背后是我写了一个search机器人。 它在多年前的初始运行期间爬取了105,000多个url。 从我从中学到的东西是,networking抓取机器人字面上看到的一切 ,这是网页上显示的文字。 机器人读取除图像外的所有内容
由于以下原因,垃圾邮件不能通过代码轻松停止:
-
使用mailto:标签时,CSS&JS是不相关的。 机器人专门针对该“mailto:”关键字查看HTML页面。 从冒号到下一个单引号或双引号(以先到者为准)的所有内容都被视为电子邮件地址。 HTML实体电子邮件地址(如上面的例子)可以使用反向ASCII方法/函数快速翻译。 运行上面的JavaScript代码片段,迅速将以#:;#111;&#117;&#114; …开头的string转换为“yourname@domain.com”。 (我的searchbot用mailto:email地址扔掉了hrefs,因为我想要网页的URL而不是电子邮件地址。)
-
如果一个页面崩溃了一个僵尸程序,僵尸程序作者会调整僵尸程序来修复这个页面的崩溃,这样僵尸程序就不会再在这个页面上崩溃了。 从而使他们的机器人更聪明。
-
机器人作者可以编写机器人,这些机器人生成所有已知的电子邮件地址变体…无需抓取页面,也不会使用任何起始电子邮件地址。 虽然这样做可能是不可行的,但对于当今的高内核CPU数量(超线程和4 GHz以上运行)以及使用分布式云计算甚至超级计算机的可用性来说,这并不是不可思议的。 可以想象,现在有人可以创build一个bot-farm来垃圾邮件,而不需要知道任何人的电子邮件地址。 20年前,这将是不可理解的。
-
免费的电子邮件服务提供商有向其广告客户销售免费用户帐户的历史。 过去,只需注册一个免费的电子邮件帐户,就可以自动保证他们开始向该电子邮件地址发送垃圾邮件,而不必在线使用该电子邮件地址。 我曾多次看到这种情况,有着名的公司名称。 (我不会提到任何名字)
-
mailto:关键字是IETF RFC的一部分,其中的浏览器被构build为自动启动默认的电子邮件客户端,从链接中的关键字。 必须使用JavaScript来中断应用程序启动过程。
我不认为有可能在使用传统电子邮件服务器的同时阻止100%的垃圾邮件,而不使用电子邮件服务器上的filter,也可能使用图像。
有一个select…你也可以build立一个类似聊天的电子邮件客户端,它在网站上运行。 这将是像Facebook的聊天客户端。 这是“有点像电子邮件”,但不是真正的电子邮件。 这只是一对一的即时消息与归档function…login时自动加载。 由于它具有文件附件+链接function,它的工作方式就像电子邮件…但没有垃圾邮件。 只要你不build立一个外部可访问的API,那么这是一个封闭的系统,人们不能发送垃圾邮件。
如果您打算严格遵守传统的电子邮件,那么您最好的办法就是在公司的电子邮件服务器上运行Apache的SpamAssassin 。
您也可以尝试结合上面列出的多种策略,使电子邮件收集器难以从您的网页收集电子邮件地址。 他们不会阻止100%的垃圾邮件,100%的时间…同时也允许100%的屏幕阅读器为盲人工作。
您已经创build了一个非常好的开始看传统的电子邮件有什么问题! 对此表示赞赏!
一个很好的屏幕阅读器是来自Freedom Scientific的 JAWS 。 以前我曾经用它来听取盲人用户如何阅读我的网页。 (如果您听到一个男性的声音在读取两个动作(如单击链接)和文本,请尝试将1个声音更改为女性,以便1个声音读取操作,另一个读取文本,这样可以更轻松地听到如何读取网页视觉障碍。)
祝你好运与您的电子邮件地址收获对策努力!
这是一个可以使用JavaScript的方法,但是只需要很小的尺寸。 这也是非常“贫民窟”,一般来说,我不会build议在HTML中使用内联JS的方法,除非你极度不愿意使用JS。
<a href="#" data-contact="bGUtZW1haWxAdGhlLWRvbWFpbi5jb20=" data-subj="QW4gQW1hemluZyBTdWJqZWN0" onfocus="this.href = 'mailto:' + atob(this.dataset.contact) + '?subject=' + atob(this.dataset.subj || '')" > Send an email </a>
写刮板的人想要尽可能高效地刮刀。 因此,他们不会下载样式,脚本和其他外部资源。 我不知道使用CSS设置mailto
链接的方法。 另外,你特意说你不想用Javascript设置链接。
如果您考虑其他types的资源,还有外部文档(即使用iframe的HTML文档)。 几乎没有刮板会打扰下载iframe的内容。 因此,你可以简单地做:
index.html的:
<iframe src="frame.html" style="height: 1em; width: 100%; border: 0;"></iframe>
frame.html:
My email is <a href="mailto:me@example.com" target="_top">me@example.com</a>
对于用户来说,iframe看起来就像普通文本一样。 iframe默认是内联和透明的,所以我们只需要设置边框和尺寸。 您不能使iframe的大小与其内容的大小相匹配,而不使用Javascript,所以我们可以做的最好的事情是给它预定义的维度。
首先,我不认为用CSS做任何事情都可以。 所有机器人(除了Google的抓取工具)都会忽略网站上的所有样式。 任何解决scheme必须与JS或服务器端的工作。
一个服务器端解决scheme可以使一个<a>
链接到一个新的选项卡,它只是redirect到所需的mailto
:
这就是我现在的想法。 希望能帮助到你。
简单+很多@ +无需工具即可编辑
<a href="mailto:user@domain@@com" onmouseover="this.href=this.href.replace('@@','.')"> Send email </a>
满足您的所有要求的简短答案是, 这是不可能的
一些基于脚本的选项在这里回答可能适用于某些机器人,但是你不需要脚本,所以,不,你不能。
你有没有考虑使用谷歌的recaptcha邮寄? https://www.google.com/recaptcha/admin#mailhide
这个想法是,当用户点击checkbox( 请参阅下面的nocaptcha )时,会显示完整的电子邮件地址。
虽然recaptcha传统上不仅困难的屏幕阅读器,但人类以及谷歌的nocaptcha recaptcha的angular色,你可以在这里阅读有关易读性testing。 从屏幕阅读器来看,它看起来很有希望,因为从他们的angular度来看,它是一个传统的checkbox。
示例#1 – 不安全,但为了方便说明这个想法
这里是一些代码作为一个例子,而不使用mailhide,但使用自己的recaptcha实现: https ://jsfiddle.net/43fad8pf/36/
<div class="container"> <div id="recaptcha"></div> </div> <div id="email"> Verify captcha to get e-mail </div> function createRecaptcha() { grecaptcha.render("recaptcha", {sitekey: "6LcgSAMTAAAAACc2C7rc6HB9ZmEX4SyB0bbAJvTG", theme: "light", callback: showEmail}); } createRecaptcha(); function showEmail() { // ideally you would do server side verification of the captcha and then the server would return the e-mail document.getElementById("email").innerHTML = "email@something.com"; }
注意:在我的例子中,我有一个JavaScript函数中的电子邮件。 理想情况下,您将在服务器端validationrecaptcha,并返回电子邮件,否则机器人可以简单地将其在代码中。
示例#2 – 服务器端validation和电子邮件的返回
如果我们使用更像这样的例子,我们得到额外的安全性: https : //designracy.com/recaptcha-using-ajax-php-and-jquery/
function showEmail() { /* Check if the captcha is complete */ if ($("#g-recaptcha-response").val()) { $.ajax({ type: 'POST', url: "verify.php", // The file we're making the request to dataType: 'html', async: true, data: { captchaResponse: $("#g-recaptcha-response").val() // The generated response from the widget sent as a POST parameter }, success: function (data) { alert("everything looks ok. Here is where we would take 'data' which contains the e-mail and put it somewhere in the document"); }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert("You're a bot"); } }); } else { alert("Please fill the captcha!"); } });
其中verify.php是:
$captcha = filter_input(INPUT_POST, 'captchaResponse'); // get the captchaResponse parameter sent from our ajax /* Check if captcha is filled */ if (!$captcha) { http_response_code(401); // Return error code if there is no captcha } $response = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=YOUR-SECRET-KEY-HERE&amp;response=" . $captcha); if ($response . success == false) { echo 'SPAM'; http_response_code(401); // It's SPAM! RETURN SOME KIND OF ERROR } else { // Everything is ok, should output this in json or something better, but this is an example echo 'email@something.com'; }
我发现有效的一个方法是使用它与CSS如下所示:
<a href="mailto:myemail@ignore-domain.com">myemail@<span style="display:none;">ignore-</span>domain.com
然后编写一个JavaScript,使用正则expression式从href="mailto:..."
属性中删除ignoreme-
word。 这将隐藏来自机器人的电子邮件,因为它将在真实域之前追加ignore-
字,这将在屏幕阅读器上工作,并且当用户点击链接时,自定义jsfunction将从href
属性移除ignore-
字,以便打开真实的电子邮件。
这种方法对我来说一直非常有效。 你可以阅读更多关于这个 – http://techblog.tilllate.com/2008/07/20/ten-methods-to-obfuscate-e-mail-addresses-compared/