您当前位置: 主页 / Dog 博客 / 存档

避免电子邮件链接垃圾邮件

2004 年 8 月 31 日星期二 (下午 12:40 GMT)

在网页上放置电子邮件地址链接(<a href="mailto:someone@somewhere.com">someone@somewhere.com</a>)的问题在于它们会被添加到垃圾邮件列表中。就像搜索引擎会抓取页面寻找链接一样,“垃圾邮件机器人”会潜入网络以收集电子邮件地址进行恶意活动。

我有一些地址我已经用了好几年了,收到了大量的垃圾邮件,这主要是因为这些地址出现在网页上。这就是为什么许多网站(包括 HTML Dog)避免使用它们的原因。这很可惜。有时你真的想在网页上包含一个电子邮件链接。有时联系表单本身是不够的——你想尽可能多地开放联系选项。

使用电子邮件链接时,有两种主要方法可以减少潜在的垃圾邮件。第一种方法是使用特殊字符代替普通字符,但这不如第二种方法——使用 JavaScript 有效。

我在网上找到的例子并不好。在当今时代,我们真正想做的是剔除事件属性和内联 JavaScript 代码,并充分利用 DOM——将代码完全从页面中移除。

所以,在最近的一个项目中,我使用了这段代码并将其放入了一个单独的 JavaScript 文件中

function view_address() {
	address_to_replace=document.getElementById("e").firstChild;
	real_address=address_to_replace.nodeValue.replace("[at]", "@");
	address_to_replace.nodeValue=real_address; 
	address_to_replace.parentNode.setAttribute("href", "mailto:"+real_address); 
}
window.onload = function() { view_address(); }

然后,在每个 HTML 页面中,都有一个 a 元素,看起来有点像

<a id="e">pooba[at]chunkysoup.co.uk</a>

在 JavaScript 未启用的罕见情况下,用户将看到一个可理解的(不完美,但聊胜于无)电子邮件地址。当 JavaScript 启用时,HTML 将被替换为代码,该代码有效地类似于 <a id="e" href="mailto:pooba@chunkysoup.co.uk">pooba@chunkysoup.co.uk</a>。就人类访客而言,这只是一个普通的电子邮件链接。另一方面,大多数垃圾邮件机器人将无法识别它们,也不会将它们添加到它们的列表中。

这个每页一个电子邮件链接(在“联系我们”部分)满足了我的需求,但显然有很多基于 DOM 的变体。如果有人有更通用的代码想法,请随时评论。

评论

评论1

我一直觉得 Automatic Labs Enkoder 很有用:http://automaticlabs.com/products/enkoder

Aaron 于 2004 年 8 月 31 日星期二下午 1:56 GMT 如是说。

评论2

我不在乎。从来不在乎。也不会在乎。所有这些使电子邮件变得困难的技术都给人一种我们放弃的印象。
只需使用不错的垃圾邮件过滤器,然后等待技术进步。

Rimantas 于 2004 年 8 月 31 日星期二下午 2:05 GMT 如是说。

评论3

那个 Enkoder 产生大量的 JavaScript,并且没有为关闭 JS 的用户提供回退。我不推荐使用它。虽然它看起来很安全,但我认为这有点矫枉过正。

不过,这里有一个小技巧:创建新变量时,请使用 var 关键字,否则它们将是全局的而不是局限于函数,并且可能会干扰你正在运行的其他脚本。在这种情况下不太可能,但作为良好实践值得这样做。所以,例如

address_to_replace=document.getElementById("e").firstChild;

将变为

var address_to_replace=document.getElementById("e").firstChild;

Dan Webb 于 2004 年 8 月 31 日星期二下午 3:01 GMT 如是说。

评论4

我多年来一直使用类似的技术,但这个技术更优越,因为它在没有 JavaScript 的情况下也能正常工作。干得好。

Ed Gordon 于 2004 年 8 月 31 日星期二下午 3:03 GMT 如是说。

评论5

好主意,但这种方法是否可访问且完全符合标准?

qweos 于 2004 年 8 月 31 日星期二下午 4:04 GMT 如是说。

评论6

感谢这个精彩的代码片段……现在它在我的工具箱里了。

Kevin Navia 于 2004 年 8 月 31 日星期二下午 5:16 GMT 如是说。

评论7

嗯,电子邮件爬虫要多久才能发现那个 [@ ] 的技巧?任何半像样的程序员都可以编写一个脚本来使用这种技术查找页面中的电子邮件地址。不过,我认为这是牺牲可访问性和避免被垃圾邮件淹没之间的权衡。

不过这是一个不错的小脚本。

Jon B 于 2004 年 8 月 31 日星期二下午 6:05 GMT 如是说。

评论8

十六进制编码的电子邮件地址对我有用。

Anne 于 2004 年 8 月 31 日星期二下午 6:52 GMT 如是说。

评论9

如果他们发现了 [@ ] 的技巧,那么就会使用 [a t ] 的技巧,或者 [ at ] 或 [ a t ]

Steve C. 于 2004 年 8 月 31 日星期二下午 7:24 GMT 如是说。

评论10

如果能有一个版本查找类而不是 id 就好了,在我看来,你可能偶尔需要在一个页面上放置多个 mailto: 链接。不过,这东西很棒。

Chris Hunt 于 2004 年 9 月 1 日星期三上午 9:50 GMT 如是说。

评论11

大家好,我是新来的,
我读了这篇文章,不得不说这是一个很酷的隐藏电子邮件地址的解决方案。

我用了一个类似的技巧,用 @ 代替 @,用 . 代替 .(点)在电子邮件地址中。

有人能告诉我,这是否是一个好的解决方案,并提供一些合理的解释吗?
谢谢

voloda 于 2004 年 9 月 1 日星期三上午 10:09 GMT 如是说。

评论12

抱歉我的错误,我的意思是……
@ - &_#64;
点 (.) - &#46;

"_" 什么都没有,去掉它阅读 :)

于 2004 年 9 月 1 日星期三上午 10:16 GMT 如是说。

评论13

我不记得在哪里看到的了,但为什么不试试用 <bdo> 并把电子邮件地址颠倒写呢?

Wereon 于 2004 年 9 月 1 日星期三上午 11:53 GMT 如是说。

评论14

我使用一个系统……不,我只是将所有想给我发电子邮件的人引导到一个我网站上的电子邮件页面,没有垃圾邮件的风险,而且对于现代我们喜欢的表单生成来说只是一个小小的麻烦:)

S Hayter 于 2004 年 9 月 1 日星期三下午 1:45 GMT 如是说。

评论15

我个人喜欢知道在哪里可以买到便宜的伟哥。

但是,即使我不知道,我也不得不说我不喜欢这些基于 JS 的技术。无论你是否隐藏你的电子邮件地址,你几乎可以肯定会收到大量的垃圾邮件。“垃圾邮件机器人”只会加速不可避免的,它们很快就能绕过所有这些技巧。可以说,你使用这样的技术会损害页面的可访问性。

不过我实在想不出更好的方法了。除了使用表单进行所有电子邮件联系,这在某些情况下会显得有点啰嗦。

Rob C 于 2004 年 9 月 1 日星期三下午 3:27 GMT 如是说。

评论16

你也可以使用 PHP 来隐藏你的电子邮件地址,使其免受垃圾邮件机器人的侵害。你提供一个指向 PHP 页面的链接,该页面看起来像这样 <a href = "emailHider.php?user=info&domain=BicycleAustin.com"> text</a>。它包含以下代码

Adam Holloway 于 2004 年 9 月 2 日星期四凌晨 12:50 GMT 如是说。

评论17

<?php
header("Location: mailto:$_GET[u]@$_GET[d]"); ?>

抱歉。

Adam Holloway 于 2004 年 9 月 2 日星期四凌晨 12:52 GMT 如是说。

评论18

亚当,虽然你的建议很不错,但我认为它在实践中行不通。由于这些垃圾邮件机器人是爬虫,它们会跟踪混淆的链接,认为它是一个普通页面,并收到指向真实电子邮件地址的 Location 头。一个设计良好的垃圾邮件机器人就会以正常方式识别它。不过,任何尝试最终都是徒劳的。我曾经在没有使用那个地址的情况下就收到了发往 webmaster@(mydomain) 的垃圾邮件。

Wereon 于 2004 年 9 月 2 日星期四下午 12:49 GMT 如是说。

评论19

我发现唯一可靠的能够击败垃圾邮件机器人的方法是,将电子邮件地址显示为图像文件,而不是 mailto: 链接。一个压缩良好的 png 地址大约只有 1K。

是的,用户无法点击发送电子邮件,这很糟糕,但对于非商业网站来说,过滤掉懒惰的用户还是有一定道理的。

µø˜˚´¥ 于 2004 年 9 月 2 日星期四下午 6:21 GMT 如是说。

评论20

我使用这个方法工作

这段代码插入到 head 标签中
<script language="JavaScript">
function PleaseSpamNotSend(ml) { return 'to:'+ ml + '@'; }
function PleaseSendSpamToHell(ml) { return ml + '@'; }
</script>


这段代码插入到页面中,我想插入一个电子邮件地址的地方
<script language=JavaScript>
var r = ".com";
document.write('<a title="Any qustions? Send mail!" href="m' + 'ail'+ PleaseSpamNotSend('www') + "yourdomain" + r + '">' + PleaseSendSpamToHell('www') + 'yourdomain.com</a>');
</script>

我已经两年没有收到任何垃圾邮件了。

Alexey 于 2004 年 9 月 3 日星期五凌晨 3:19 GMT 如是说。

评论21

抱歉。放弃电子邮件地址了。对我来说是网页表单。但如果我要公布电子邮件地址,我可能会这样做——把它放在一个表单按钮后面。提交时显示地址。稍微不方便用户,但嘿……

Andrew Bowden 于 2004 年 9 月 3 日星期五下午 12:39 GMT 如是说。

评论22

你收到发往 webmaster@(mydomain) 地址的电子邮件的原因是,大多数垃圾邮件机器人会向该地址发送电子邮件,这是一个常见地址,最有可能成为垃圾邮件的目标。

在对抗垃圾邮件的过程中有很多权衡,主要是处理用户便利性与减少垃圾邮件数量之间的平衡,这是一项艰巨的任务。我不喜欢使用网页表单发送电子邮件。当然,它能防止垃圾邮件,但作为用户,我更喜欢使用我自己的电子邮件客户端。当我发布电子邮件地址时,我使用 JavaScript 技术(类似于这里发布的)。结合一个好的过滤器,这能将我的收件箱中的垃圾邮件降到最低。

Adam Holloway 于 2004 年 9 月 3 日星期五下午 5:22 GMT 如是说。

评论23

我完全不知道如何将这些 JavaScript 代码放到我的网站上……请有人帮忙!:( 我对其中很多都很好理解,但我就是不知道把脚本放在哪里才能让 id="#" 属性引用正确的脚本。救命!

bret 于 2004 年 9 月 5 日星期日凌晨 4:13 GMT 如是说。

评论24

我使用 Dreamweaver 和一个名为 Linecraft Hide Email 的扩展,http://www.linecraft.com/extensions.php. 对我来说效果很好。

Anne Hecht 于 2004 年 9 月 9 日星期四晚上 8:48 GMT 如是说。

评论25

这是一个使用 :after 选择器和 content 属性的 CSS 技术。
http://phoenity.com/newtedge/hide_email_spambots/

这能分开吗?例如
address:after{content: " <cheeaun"}
address:after{content: "\40"}
address:after{content: "phoenity.com"}

Will Rickards 于 2004 年 9 月 10 日星期五晚上 8:46 GMT 如是说。

评论26

这并不能阻止字典攻击、名称攻击等,用 Unicode(或其他)等效字符替换 @ 是编码,而不是加密。仅仅因为在网上找不到 john@example.com(替换为你自己的地址)并不意味着它不会收到垃圾邮件。将电子邮件写成人类可读的形式而不是 mailto: 链接,例如:我的邮箱是 john,我的域名是 example.com——但这仍然无法阻止垃圾邮件 :D。
减少垃圾邮件的方法是在服务器级别实施有效的过滤器,使批量电子邮件发送者无利可图,强制执行法律,并默认将电子邮件客户端的 HTML 关闭,或者如果你真的想要红色文本(这可以很大程度上阻止 Win32 盒子变成被控制的中继),就彻底关闭对象和 iframe 支持。

James 于 2004 年 9 月 12 日星期日晚上 2:06 GMT 如是说。

评论27

嘿——

很棒的小脚本!我不是 JavaScript 人,但我想应该可以修改它,以便可以使用“显示名称”。换句话说,我希望页面显示“Joe Blow”,但链接到 mailto:joe@blow.com。

如果不麻烦的话,你能帮我一下吗?我认为很多人也会喜欢这个……

Mik 于 2004 年 9 月 30 日星期四凌晨 2:01 GMT 如是说。

评论28

Minor enhancement to support multiple email addresses on the page

if (document.getElementsByTagName) {
var a = document.getElementsByTagName("a")
var i
for (i = 0; i < a.length; i++) {
if (a[i].className && a[i].className == "e") {
address_to_replace = a[i]
...
}
}
}

richard 于 2004 年 10 月 9 日星期六下午 4:25 GMT 如是说。

评论29

附注:将 id= 改为 class=

pooba[at]chunkysoup.co.uk

richard 于 2004 年 10 月 9 日星期六下午 4:28 GMT 如是说。

评论30

有人知道垃圾邮件机器人会扫描外部 CSS 吗?

Timmy 于 2004 年 11 月 16 日星期二下午 1:26 GMT 如是说。

评论31

不,他们不扫描。

Steve 于 2004 年 11 月 20 日星期六下午 2:04 GMT 如是说。

评论32

我无法让 richard 的增强功能工作。我尝试使用他放置“...”的原始代码,但它只给了我这个调试 JavaScript 错误
Error: address_to_replace.nodeValue has no properties

el mono 于 2005 年 2 月 24 日星期四下午 3:21 GMT 如是说。

评论33

我刚刚发现出了什么问题,address_to_replace 缺少了 .firstChild。我还修改了增强功能,这样你就可以在需要时使用其他类名了。增强后的代码如下

function view_address() {
if (document.getElementsByTagName) {
var a = document.getElementsByTagName("a")
var i
for (i = 0; i <= 0) {
address_to_replace = a[i].firstChild;
real_address = address_to_replace.nodeValue.replace("[at]", "@");
address_to_replace.nodeValue = real_address;
address_to_replace.parentNode.setAttribute("href", "mailto:" + real_address);
}
}
}
}
window.onload = function() { view_address(); }

将以上内容保存为 .js 文件,在 HTML 头部包含它,并这样使用它
user[at]server.com

el mono 于 2005 年 2 月 24 日星期四下午 3:30 GMT 如是说。

评论34


为了更强的安全性,我使用了 PHP 代码来更改字符串,该字符串会根据每个用户代理进行替换。所以它不是一个静态字符串,垃圾邮件机器人可以收集和绕过。
我创建了一个文件
email_protection.js.php,其中包含一个函数(非原创)

function view_address() {
if (document.getElementsByTagName) {
var a = document.getElementsByTagName("a");
var i;

<?php
$mark='{for '.getenv('HTTP_USER_AGENT').'}'.'[at server]';
echo "var mark = '".$mark."';\n";
?<

for (i = 0; i pooba<?php echo
'{for '.getenv('HTTP_USER_AGENT').'}'.'[at server]';
?>chunkysoup.co.uk</a>

所以我们有不同的字符串!!!垃圾邮件机器人必须收集这些。
你可以为每个页面使用日期或 md5…

Vlad 于 2005 年 8 月 17 日星期三下午 12:50 GMT 如是说。

评论35

抱歉!

email_protection.js.php(函数已更改)

function view_address() {
if (document.getElementsByTagName) {
var a = document.getElementsByTagName("a");
var i;
<?php
$mark='{for '.getenv('HTTP_USER_AGENT').'}'.'[at server]';
echo "var mark = '".$mark."';\n";
?>
for (i = 0; i pooba<?php
echo '{for '.getenv('HTTP_USER_AGENT').'}'.'[at server]';
?>chunkysoup.co.uk</a>

So said Vlad on Wednesday 17 August, 2005 at 12:54PM GMT.

评论36

抱歉,再说一次!最后一次尝试。

JS

function view_address() {
if (document.getElementsByTagName) {
var a = document.getElementsByTagName("a");
var i;
<?php
$mark='{for '.getenv('HTTP_USER_AGENT').'}'.'[at server]';
echo "var mark = '".$mark."';\n";
?>
for (i = 0; i < a.length; i++) {
if (a[i].className && a[i].className == "e") {
var address_to_replace = a[i].firstChild;
var real_address = address_to_replace.nodeValue.replace(mark, "@");
address_to_replace.nodeValue = real_address;
address_to_replace.parentNode.setAttribute("href", "mailto:" + real_address);
}
}
}
}

HTML
poobachunkysoup.co.uk

Vlad 于 2005 年 8 月 17 日星期三下午 12:56 GMT 如是说。

评论37

最后-最后一次尝试!

HTML

<a class="e">pooba<?php echo
'{for '.getenv('HTTP_USER_AGENT').'}'.'[at server]';
?>chunkysoup.co.uk</a>

Vlad 于 2005 年 8 月 17 日星期三下午 12:58 GMT 如是说。

评论38

嘿,这真的很棒。非常感谢。我把这段小代码(做了一些小的调整)用在了我自己的网页上。感谢分享。

bob 于 2006 年 1 月 9 日星期一凌晨 1:08 GMT 如是说。

另请参阅

^ 顶部

SiteGround: Fast, reliable, recommended hosting.