如今,垃圾邮件发送者是一个巨大的问题。如果您想分享您的联系信息,而不被垃圾邮件淹没,则需要一个解决方案。几个月前我遇到了这个问题。在我研究如何解决它时,我发现了许多有趣的解决方案。其中只有一个非常适合我的需求。
在这篇文章中,我将向您展示如何使用多种解决方案轻松地保护您的电子邮件地址免受垃圾邮件机器人的攻击。您可以根据自己的需求选择合适的技术。
目录
传统案例
假设您有一个网站。您想分享您的联系方式,并且不希望只分享您的社交链接。电子邮件地址必须在那里。很简单,对吧?您可以输入类似以下内容
<a href="mailto:[email protected]">Send me an Email</a>
然后,您可以根据自己的喜好对其进行样式设置。
好吧,即使此解决方案有效,它也存在一个问题。它会使您的电子邮件地址对所有人可见,包括网站爬虫和各种垃圾邮件机器人。这意味着您的收件箱可能会被大量的垃圾邮件淹没,例如促销优惠甚至一些网络钓鱼活动。
我们需要一个折衷方案。我们希望让机器人难以获取我们的电子邮件地址,但对普通用户尽可能简单。
解决方案是混淆处理。
混淆处理是指将事物变得难以理解的做法。此策略出于多种原因应用于源代码。其中之一是隐藏源代码的目的,以使篡改或逆向工程变得更加困难。首先,我们将研究所有基于混淆处理概念的不同解决方案。
HTML 方法
我们可以将机器人视为在网络上浏览并爬取网页的软件。机器人获取 HTML 文档后,会解释其中的内容并提取信息。此提取过程称为 网络抓取。如果机器人正在查找与电子邮件格式匹配的模式,我们可以尝试使用不同的格式对其进行伪装。例如,我们可以使用 HTML 注释
<p>If you want to get in touch, please drop me an email at<!-- fhetydagzzzgjds --> email@<!-- sdfjsdhfkjypcs -->addr<!-- asjoxp -->ess.com</p>
它看起来很乱,但用户会看到这样的电子邮件地址
If you want to get in touch, please drop me an email at [email protected]
优点
- 易于设置。
- 它在 JavaScript 被禁用时也能正常工作。
- 辅助技术可以读取它。
缺点
- 垃圾邮件机器人可以跳过已知的序列,例如注释。
- 它不适用于
mailto:
链接。
HTML & CSS 方法
如果我们使用 CSS 的样式能力来删除仅用于欺骗垃圾邮件机器人的内容,会怎么样?假设我们拥有与之前相同的内容,但这次我们放置了一个 span
元素在里面
<p>If you want to get in touch, please drop me an email at <span class="blockspam" aria-hidden="true">PLEASE GO AWAY!</span> email@<!-- sdfjsdhfkjypcs -->address.com</p>.
然后,我们使用以下 CSS 样式规则
span.blockspam {
display: none;
}
最终用户只会看到以下内容
If you want to get in touch, please drop me an email at [email protected].
…即我们真正关心的内容。
优点
- 它在 JavaScript 被禁用时也能正常工作。
- 机器人更难获取电子邮件地址。
- 辅助技术可以读取它。
缺点
- 它不适用于
mailto:
链接。
JavaScript 方法
在此示例中,我们使用 JavaScript 使我们的电子邮件地址不可读。然后,在页面加载时,JavaScript 会再次使电子邮件地址可读。这样,我们的用户就可以获取电子邮件地址。
最简单的解决方案是使用 Base64 编码算法解码电子邮件地址。首先,我们需要将电子邮件地址编码为 Base64。我们可以使用一些网站(例如 Base64Encode.org)来执行此操作。输入您的电子邮件地址,如下所示

然后,单击按钮进行编码。使用以下几行 JavaScript,我们可以解码电子邮件地址并设置 HTML 链接中的 href
属性
var encEmail = "ZW1haWxAYWRkcmVzcy5jb20=";
const form = document.getElementById("contact");
form.setAttribute("href", "mailto:".concat(atob(encEmail)));
然后,我们必须确保电子邮件链接在标记中包含 id="contact"
,如下所示
<a id="contact" href="">Send me an Email</a>
我们使用 atob
方法解码 Base64 编码数据的字符串。另一种方法是使用一些基本的加密算法,例如 凯撒密码,这在 JavaScript 中很容易实现。
优点
- 机器人更难获取电子邮件地址,尤其是如果您使用加密算法。
- 它适用于
mailto:
链接。 - 辅助技术可以读取它。
缺点
- 浏览器必须启用 JavaScript,否则链接将为空。
嵌入式表单方法
联系表单随处可见。您肯定至少使用过其中一个。如果您希望人们能够直接与您联系,则可以考虑在您的网站上实施联系表单服务。
Formspree 是一个服务示例,它为您提供了联系表单的所有优势,而无需担心服务器端代码。 Wufoo 也是如此。事实上, 这里有很多您可以考虑的选项,可帮助您处理联系表单提交。
使用任何表单服务的第一步是注册并创建一个帐户。定价各不相同,当然,服务之间提供的功能也不同。但它们大多数都会为您提供一个 HTML 代码片段,用于将您在任何网站或应用程序中创建的表单嵌入其中。以下是我从我在 Formspring 帐户中创建的一个表单中直接提取的一个示例
<form action="https://formspree.io/f/[my-key]" method="POST">
<label> Your email:
<input type="email" name="email" />
</label>
<label> Your message:
<textarea name="message"></textarea>
</label>
<!-- honeypot spam filtering -->
<input type="text" name="_gotcha" style="display:none" />
<button type="submit">Send</button>
</form>
在第一行中,您应该根据您的端点自定义 action
。此表单非常基本,但您可以根据需要添加任意多个字段。
请注意第 9 行的隐藏输入标记。此输入标记可帮助您过滤普通用户和机器人提交的内容。实际上,如果 Formspree 的后端看到包含该输入的提交,则会将其丢弃。普通用户不会这样做,因此一定是机器人。
优点
- 您的电子邮件地址是安全的,因为它不会公开。
- 它在 Javascript 被禁用时也能正常工作。
缺点
- 依赖于第三方服务(这可能是优点,具体取决于您的需求)
此解决方案还有一个缺点,但我没有将其列出,因为它是相当主观的,并且取决于您的用例。使用此解决方案,您不会分享您的电子邮件地址。您只是为人们提供了一种联系您的方式。如果人们希望向您发送电子邮件怎么办?如果人们正在寻找您的电子邮件地址,而他们不想要联系表单怎么办?在那种情况下,联系表单可能是一个过于强硬的解决方案。
结论
我们已经到达了结尾!在本教程中,我们讨论了在线电子邮件共享问题的不同解决方案。我们讨论了不同的想法,包括 HTML 代码、JavaScript,甚至一些在线服务(如 Formspree)来构建联系表单。在本教程结束时,您应该了解所展示策略的所有优缺点。现在,您可以根据自己的特定用例选择最合适的策略。
您好,我认为 HTML/CSS 示例应该如下所示
如果您想联系我,请发送电子邮件至 email@<span>PLEASE GO AWAY!</span>address.com。
它目前的写法(使用注释)与仅 HTML 方法没有区别。
如果您使用的是 WordPress,它有一个非常方便的 反垃圾邮件 函数
哇,感谢分享!
WordPress 的文档太糟糕了,他们竟然没费心包含您给我们的这个模板示例。他们只提供了在内容块中使用它的简码。
无论如何,我正在阅读它如何运作 这里 了解更多细节,我发现它相当古老,低估了采集机器人的能力。
我猜上面显示的 JavaScript 选项可能效果更好(?)但看起来您需要为网站上的每个电子邮件地址添加新行,这很繁琐。
使用原生的表单操作怎么样?
为了对机器人进行混淆
优点
适用于原生的表单元素
不需要额外的 JavaScript 文件
缺点
无法右键点击并复制电子邮件地址
仍然有 JavaScript,但它在 HTML 中
普通的 HTML 与 JS 完美配合,就像它在 mailto 链接中一样。我已经使用这种方法几十年了,这是我 20 多年来一直坚持的可靠方法。
或者,结合多种解决方案。使用 HTML + CSS 来阻止 HTML 扫描器
然后使用 JavaScript 将地址包装在带有
<a>
和mailto:
属性的<a>
中。有人知道每种方法的有效性吗?
我记得以前设置了一个评论表单,类似于嵌入式表单方法,使用了一个蜜罐输入,但仍然有机器人被设置成忽略蜜罐,并使用该表单发送垃圾邮件。最近,我制作了一个评论表单,该表单本身是使用 JavaScript 呈现的:它仍然收到一条垃圾邮件 - 好吧,只有一条,可能是人为垃圾邮件发送者,而不是机器人。
像 https://pageclip.co/ 这样的第三方服务在紧急情况下也很有用,还可以连接到 Slack
还有一些像 mailhide.io 这样的服务,会在电子邮件地址前面加上验证码
我可以确认,联系表单中隐藏的蜜罐输入并不能可靠地过滤机器人。我 15 年前尝试过这种方法,即使在那个时候,机器人也已经太过聪明了,无法被这种方法过滤。
各位,这是 css tricks,对吧?为什么不用这个
span.email::after {content:”@domain.com”}
对于屏幕阅读器来说不可访问
那么使用 aria-label 添加最后的 @domain.com 部分怎么样?
HTML 和 CSS 方法在 TUI 浏览器中无效。
我听说将 at 符号 (@) 更改为 @,并将句点 (.) 更改为 . 有效,例如以下示例。我一直使用这种方法,它似乎有效。
嘘,不要说出来。垃圾邮件机器人可能会更新以识别实体!到目前为止(为了简单起见),它们只扫描 at 符号。
为什么作者使用嵌套在标签中的输入?标签有一个 for 属性
只有我用 jpg 或 gif 的电子邮件图片吗?
for 虽然需要一个 id,但用标签包裹一个输入就不需要管理 id,而且可以获得相同的好处。由于 id 需要是唯一的(除了 web 组件或 iframe 之外),它可以节省时间和精力。我个人认为它更出色,但这只是主观的
最好的解决方案有两个电子邮件。一个幽灵电子邮件,您可以用来检查极少数情况下禁用 JavaScript 的用户。
还有一个真实的电子邮件,在页面加载后使用 JavaScript 覆盖幽灵电子邮件(只有 3 行代码)。
非常非常简单且有效。
优点
只要全部使用。
缺点
2 个电子邮件地址。
我使用
.e-mail:before {
content: attr(data-website) “\0040” attr(data-user);
unicode-bidi: bidi-override;
direction: rtl;
}
我真的很喜欢这个。干得好。
如何使它可以点击以启动默认的邮件客户端,最好不要使用 JavaScript?
<a class=e-mail data-user="resu" data-website="moc.niamod" href="mailto://"></a>
好的,我做了这个
<script defer>
document.querySelectorAll('.e-mail').forEach(e => {
e.addEventListener("click", event => {
// 阻止 href=#
event.preventDefault();
// 获取调用锚点的(反转的)电子邮件地址
z=event.currentTarget;
y=getComputedStyle(z,'::after');
x=y.getPropertyValue('content');
// 反转字符串 rtl
v=x.split("").reverse().join("");
// 删除所有 ""
v=v.replace(/['"]+/g, '');
// 启动默认的电子邮件客户端(也在移动设备上测试!)
window.location.href="mailto://"+v;
})
});
</script>
非常感谢您提供这篇有用的文章。是否可以对电话号码和短信做同样的事情?谢谢。
很惊讶您没有提到第一点中的转义字符(以
&
开头的字符),这些字符在 mailto 链接中也有效(您甚至可以以此方式混淆协议本身)。理论上,这不会欺骗任何正确处理 DOM 的机器人,但我确实想知道它能过滤多少垃圾(尤其是在它隐藏了@
符号的情况下)。实际上,表单方法可能是最好的方法。确保发送确认邮件,如果它不起作用,那么您可以假设它是垃圾邮件,甚至不需要扫描它是否有垃圾邮件(而合法用户只会认为这是为了让他们知道您收到了他们的邮件)。
您真的需要第三方服务来使用表单吗?虽然它很难做到(这是插件可能派上用场的地方),但我确信它应该完全在网站的服务器上实现,尤其是在电子邮件地址是本地地址的情况下。
我想第三方服务的优势在于,即使在对话过程中,您也不会透露任何您的真实地址(用户会看到第三方的地址),但从用户的角度来看,看到第三方的地址可能会让人觉得可疑,实际上,您真正需要的是一种方法来知道哪些电子邮件需要丢弃,即使它们到达您。
我使用一种 JS 方法,我在标题中放了一些代码来组合电子邮件和域名以及 .com,但机器人只会看到 JS 代码。对机器人来说完全令人困惑,但可以选中,效果很好
无论您使用什么:任何向访问者呈现可读电子邮件地址的东西,也会向使用呈现输出而不是源代码的抓取器呈现它,或者(更难克服)使用 OCR。
Bill Bontrager 在这里提供了一个免费的无垃圾邮件表单制作器:https://spamfreeform.com/
这是一篇很棒的文章 - 感谢 Lorenzo!保护电子邮件地址的必要性从未完全消失,每隔一段时间回顾一下我们工具集中有哪些技术和技巧,是很有帮助的。
在阅读这篇文章时,我发现没有提到 SVG。我突然想到,基于 SVG 的方法是一个值得探索的方法 - 它将成功地消除任何 JavaScript 需求,同时也能允许正常的
mailto:
链接。简而言之,可以编写一个包含以下内容的 SVG:
然后通过以下方式将该 SVG 嵌入到 HTML 中:
这里有一份完整的说明:
https://github.com/RouninMedia/protecting-your-email-address-via-svg-instead-of-js/blob/main/README.md
我写了一个用于此目的的 web 组件,它最大的好处是显示的电子邮件地址位于 Shadow DOM(封闭的),因此不能被运行浏览器的电子邮件收集器轻松检测到(这将绕过此处显示的许多技巧);并且点击处理程序位于 JavaScript 中,例如:
Shadow DOM 代码
感谢您撰写这篇文章!这篇文章和评论中有很多好主意。
好主意!
您知道它是否真的能防范机器人吗?
感谢 Lorenzo 撰写这篇文章
我用了一些 JavaScript 和 UTF-8 编码来显示它,也解决了这个问题。
email @ address . com
由于它在评论中解码了字符串,因此我使用 UTF-8 代码 64 来显示 @,使用代码 46 来显示点,并在它们之间添加空格,这样电子邮件看起来像上面那样,但正则表达式解析器将无法识别它。
我以前用 rot13 编码电子邮件地址,并用一行 JavaScript 在鼠标悬停/点击时进行解码。非常简单有效。现在找不到它,但简单的谷歌搜索就能找到。
显示一个格式正确但拼写错误的地址,这样抓取器就可以得到一个“好的”地址,并且不再进行任何其他操作。然后在点击时调用一个简短的脚本来纠正拼写错误。
这对我的网站非常有效。
对于 JavaScript 版本,提供一个按钮/链接来“复制电子邮件地址”,对于那些(像我一样)从未设置默认邮件客户端的人来说,这似乎很有帮助。使用 navigator.clipboard.writeText() 可以轻松添加。
垃圾邮件的程度越来越严重!他们甚至能战胜 Gmail 的垃圾邮件过滤器,进入收件箱!
我只是觉得,无论你多么小心,垃圾邮件发送者总能找到发送垃圾邮件的方法。
我来这里是想看看是否有现代的解决方案,但令我惊讶的是,它仍然和 20 年前一样(我老了)。
毫无疑问,机器人现在可以解析 JavaScript 和 HTML 编码字符……也许不是所有的机器人,但现在可能更多了,尤其是考虑到 JavaScript 爬虫和客户端代码几乎完全被 Google 自己的机器人解析。
那么最好的解决方案是什么?是否可以进行一次初始的 AJAX 调用,只有在检测到用户交互(键盘事件、点击事件、滚动事件、聚焦事件、可见性更改事件)时才触发,并且使用 CSRF 代码/nonce 来验证请求是否来自目标网站……这是否太过分了?
这里有一份非常长的混淆技术列表,其中包含了统计数据,显示了它们在现实世界中被破解的频率
https://spencermortensen.com/articles/email-obfuscation/
最好的方法永远不会以任何形式存储完整有效的电子邮件地址 - 不在 HTML、CSS 或 JavaScript 中 - 所以您可能需要添加 Cloudflare 技术。(在这篇文章中,它被称为“Xor”技术。但它是 Cloudflare 使用的技术。)
最好的方法还应该包含 CSS 技术(例如“display:none”技术) - 以避免仅依赖于 JS 或 CSS。
最好的方法只会在用户交互时短暂地创建有效的电子邮件地址 - 以便即使是运行完整 Web 环境的垃圾邮件机器人(但不使用键盘或鼠标)也无法获取到。
没有 JavaScript -
也许我错了 - 但我通常使用这个
在 HTML 中
<a href="#" class="cryptedmail" data-davor="stuttgart43" data-wohin="juweliere-kraemer" data-ende="de" ></a>
在 CSS 中
.cryptedmail:after {
content: attr(data-davor) "@" attr(data-wohin) "." attr(data-ende);
}
回到 15 年前:优雅的电子邮件混淆(A List Apart)。出自我的手笔 :)