最近在独立开发者社区里,经常能看到这样一句调侃:I launched on Product Hunt and all I got was spam email。翻译过来就是“我在 Product Hunt 上线了产品,结果除了垃圾邮件什么都没得到”。对于把 Product Hunt 当成产品首发阵地的开发者来说,这个场景再熟悉不过了。本来是想借着平台流量获得第一批真实用户,结果产品页还没带来多少转化,收件箱却被各种“合作邀请”“SEO 优化”“外贸建站”“代开票”塞得满满的。
这篇文章不打算聊 Product Hunt 本身的运营策略,而是围绕一个更具体、更让人头疼的问题展开:为什么产品上线后会收到大量垃圾邮件,以及如何在技术层面做好防护。我会从垃圾邮件的来源讲起,再给出上线前的隐私防护设计、邮件头识别方法、过滤规则配置、联系表单防爬实战代码,最后整理成一份可以直接照着做的排查清单和长期维护建议。无论你是独立开发者、小团队后端,还是负责公司官网的技术同学,这篇内容都能帮你少踩不少坑。
1. 为什么上线 Product Hunt 后,邮箱会被垃圾邮件塞满
很多开发者第一次遇到垃圾邮件轰炸时,都会有一个疑惑:我明明没有在 Product Hunt 页面留下邮箱,为什么对方还是能找到我?
这个问题的答案并不复杂:你公开的可关联信息,远比你想象的多。
1.1 垃圾邮件到底从哪里来
Product Hunt 上线动作本身只是一个开始。当你的产品页上线后,爬虫和营销机构会把你的产品名称、域名、社交媒体账号、团队个人信息全部抓取一遍,再通过公开渠道交叉关联出你的邮箱地址。
常见的信息来源包括:
- Product Hunt 产品页与 Maker 信息。即使你没有直接写邮箱,你的 Twitter、个人网站、GitHub 链接也可能被顺藤摸瓜找到。
- 域名注册信息。如果域名开启了 WHOIS 公开查询,注册邮箱可能直接暴露。现在已经有不少域名注册商默认开启隐私保护,但老域名、企业域名未必配置过。
- GitHub 主页和提交记录。GitHub 个人资料里的邮箱、commit 记录中的 author 邮箱,都是爬虫的重点目标。
- 公司官网的联系方式。官网上的
info@、contact@邮箱,是营销机构最爱抓的公开资源。 - 第三方数据泄露。你曾经用某个邮箱注册过工具、社区、论坛,一旦该平台数据泄露,邮箱就会被批量打包出售。
这些信息经过自动化工具整合之后,就会形成一份带有“产品上线”标签的精准营销列表。垃圾邮件发送者并不在乎你是否有意向,他们只在乎送达率和转化率。只要有一小部分人回复,这场批量轰炸就是划算的。
1.2 常见垃圾邮件类型
上线后收到的垃圾邮件,不只是传统意义上的“色情广告”或“中奖诈骗”,更多是和产品推广相关的骚扰,往往伪装得像一封正常商务邮件。
| 类型 | 典型特征 | 意图 |
|---|---|---|
| SEO / 建站推广 | 标题含“Google 排名优化”“网站快照”“外贸独立站” | 推销营销服务 |
| 供应链合作 | 看起来像“采购经理”发来的询盘 | 收集联系方式并二次推销 |
| 开发者服务 | “帮你做 App 推广”“ASO 优化”“上架加速” | 售卖推广流量 |
| 钓鱼邮件 | 伪造知名平台通知,诱导点击链接 | 窃取账号或支付信息 |
| 发票 / 账单诈骗 | 附带“未支付账单”PDF 或链接 | 诱导付款 |
| 订阅轰炸验证 | 发来“确认订阅成功”通知 | 确认你的邮箱是活跃地址 |
最麻烦的是后两种。钓鱼邮件可能伪装成 Stripe、GitHub、Apple 等平台的官方通知,而订阅轰炸则会让你的邮箱在短时间内收到大量订阅确认信,用来淹没真正的重要邮件,或者确认邮箱有效性。
1.3 为什么普通过滤规则不够用
很多人会问:Gmail、QQ 邮箱、网易邮箱不都有垃圾邮件过滤吗?为什么还是能漏进来?
原因在于,现在的垃圾邮件发送者已经非常懂得规避规则。他们会频繁更换发信域名,让基于域名黑名单的过滤失效;会把关键词拆成图片或 Unicode 变体,让基于内容的过滤失效;还会模拟正常邮件的结构,伪造合法的 SPF、DKIM 记录,让自己看起来像真实企业发送的事务邮件。
更关键的是,很多垃圾邮件其实是合法的邮件营销服务发送的。他们遵守了基本的退订协议,也通过了 SPF/DKIM 校验,邮件服务商不会轻易将其判为垃圾。这种情况下,仅靠邮箱服务商的默认过滤,很难完全挡住。
2. 上线前的防护设计:先别急着公开邮箱
在 Product Hunt 上线之前,最应该做的不是准备一条夸赞产品的文案,而是先把自己的邮箱保护起来。预防永远比事后清理成本低。
2.1 用域名邮箱替代个人邮箱
如果你打算长期运营产品,建议优先使用域名邮箱,也就是contact@yourdomain.com、support@yourdomain.com这样的角色邮箱,而不是把张三2024@gmail.com或lihua@qq.com直接写在公开渠道。
这么做有几个实际好处:
- 角色邮箱可以随时修改转发目标。即使被垃圾邮件轰炸,也可以直接停用该地址,不影响你的个人邮箱。
- 可以从域名维度做过滤规则,比针对某个个人邮箱做规则更灵活。
- 在商务沟通中显得更专业,不容易被对方当成随手注册的临时账号。
如果还没有域名邮箱,可以选用域名注册商自带的邮箱服务,也可以使用第三方企业邮箱,再配置一条 MX 记录即可。不同的服务商配置入口不一样,但原理是通用的:把邮件先收到域名邮箱,再转发到真正使用的收件箱。
2.2 使用邮箱别名与转发服务
仅仅区分角色邮箱还不够,因为角色邮箱一旦公开,依然会被爬虫抓取。更稳妥的做法是使用邮箱别名(Alias)。
邮箱别名的原理是:你并不暴露真实收件地址,而是生成一个随机前缀的别名邮箱,例如ph-launch-3f9a@yourdomain.com,所有发送到该别名的邮件都会自动转发到你的真实邮箱。当垃圾邮件开始增多时,只需要删除这个别名,垃圾邮件就再也无法送达。
目前常见的实现方式有两种:
- 域名邮箱服务商自带的别名功能。一些企业邮箱支持在同一域名下创建多个别名,不需要额外成本。
- Cloudflare Email Routing 这类转发服务。将域名接入 Cloudflare 后,可以免费配置自定义地址转发,并支持 Catch-All 转发,适合独立开发者低成本使用。
- SimpleLogin、Firefox Relay 等隐私别名服务。它们可以为每个网站生成独立的随机邮箱地址,功能更强,但需要注意免费额度限制。
需要说明的是,不同服务商的当前功能和收费策略会变化,配置前一定要以官方文档为准。核心思路是一致的:让公开的邮箱地址与你真正读取邮件的地址解耦。
2.3 用联系表单代替明文邮箱
即使你做了域名邮箱,也不建议把邮箱地址直接贴在官网页脚或 Product Hunt 的 Maker 信息里。更推荐的方式是做一个联系表单。
表单的优势在于:
- 页面不暴露真实邮箱地址,爬虫无法直接提取。
- 服务端可以对提交内容做校验、频率限制、内容过滤。
- 可以接入工单系统,把潜在用户和垃圾请求分开处理。
当然,联系表单并不是一劳永逸。爬虫同样会扫描表单接口,然后构造请求批量提交。所以表单位置的后端校验是必要的,这一点会在后面的实战章节详细展开。
2.4 上线前检查清单
在 Product Hunt 上线前,可以花十分钟过一遍下面的清单:
| 检查项 | 建议操作 |
|---|---|
| 个人邮箱是否公开 | 从 Product Hunt、Twitter、GitHub 等平台移除明文邮箱 |
| 域名 WHOIS 信息 | 开启域名隐私保护,或使用隐私转发 |
| GitHub commit 邮箱 | 将 Git 的 user.email 改为 GitHub 提供的 noreply 地址 |
| 官网联系方式 | 用联系表单替代mailto:明文链接 |
| 角色邮箱是否已创建 | 至少准备一个contact@或pr@地址 |
| 是否配置邮件转发 | 确认角色邮箱转发路径正确,且可以随时关闭 |
| 是否预留别名地址 | 为本次上线单独生成一个临时别名 |
这一步做完,你已经可以从源头上减少一大半垃圾邮件。
3. 邮件头与垃圾邮件识别基础
即使做了防护,依然不可能做到 100% 拦截。这时候,学会识别垃圾邮件就变得非常重要。很多人收到可疑邮件后,第一反应是看发件人名称,但发件人名称是可以随意伪造的。真正能反映邮件来源的,是藏在邮件内部的邮件头(Email Header)。
3.1 一封垃圾邮件的典型特征
先看几个常见的判断信号:
- 发件地址和发件人名称不一致。例如显示名称是 “GitHub”,实际发件地址却是
random@some-weird-domain.xyz。 - 主题带有大量空格、特殊符号,或者刻意模仿官方通知语气。
- 正文中包含一个链接,鼠标悬停后显示的地址与文字描述不符。
- 附带可疑附件,例如命名奇怪的 PDF、HTML、压缩包。
- 要求你“尽快点击链接”“验证账号”“领取优惠”,制造紧迫感。
这些特征本身不能定罪,但组合出现时,就需要提高警惕。
3.2 SPF、DKIM、DMARC 是什么
要判断一封邮件是否真的来自某个域名,不能只看发件人地址,而是要看邮件头里的三项认证记录:
- SPF(Sender Policy Framework):用来验证发件服务器的 IP 是否被域名所有者授权。简单理解就是,域名所有者公布了一份“允许帮我发信的服务器名单”,如果发件服务器不在名单里,SPF 校验就会失败。
- DKIM(DomainKeys Identified Mail):用来验证邮件内容在传输过程中是否被篡改。发件域会对邮件内容生成签名,收件方通过域名的 DNS 记录验证签名是否有效。
- DMARC(Domain-based Message Authentication, Reporting & Conformance):用来告诉收件方,如果 SPF 或 DKIM 校验失败,该怎么处理这封邮件。
对普通用户来说,不需要深入了解这三者的技术细节,只需要知道一个操作:在邮箱中打开邮件头,找到 SPF、DKIM、DMARC 三项结果,只要有一项显示 fail 或 softfail,就要谨慎对待这封邮件。
3.3 通过邮件头定位伪造邮件
下面是一封正常邮件的标准化邮件头片段,注意看认证状态:
Received: from mail-lf1-f196.google.com (mail-lf1-f196.google.com [209.85.167.196]) by mx.example.com with ESMTPS id 20250101 for <contact@yourdomain.com> (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=OK) (Authenticated sender: newsletter@example.com) (passed SPF check) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com; s=google; bh=... h=from:to:subject:date:message-id; bh=... Authentication-Results: mx.example.com; spf=pass (google.com: domain of newsletter@example.com designates 209.85.167.196 as permitted sender) smtp.mailfrom=newsletter@example.com; dkim=pass header.d=example.com header.s=google; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=example.com如果一封邮件伪造From: support@paypal.com,但实际投递 IP 来自某个俄罗斯或东南亚机房,邮件头中的 Authentication-Results 大概率会显示spf=fail或dkim=fail,这时候即使正文做得再像官方通知,也不能相信。
在 Gmail 中查看邮件头的方法是:打开邮件,点击右上角三个点,选择“显示原始内容”。QQ 邮箱、网易邮箱也都有类似入口,搜索“查看邮件头”即可找到。
3.4 域名邮件验证配置示例
与此同时,你也要保护好自己的域名,避免被垃圾邮件发送者冒用。如果发现有人用你的域名发垃圾邮件,需要到 DNS 管理后台配置 SPF、DKIM、DMARC 记录。
以 SPF 为例,一条基础记录长这样:
yourdomain.com. IN TXT "v=spf1 include:your-spf-provider.example ~all"其中your-spf-provider.example需要替换成你的实际邮件服务商提供的 include 地址。例如使用 Google Workspace 时,通常需要包含_spf.google.com,配置内容大致为:
yourdomain.com. IN TXT "v=spf1 include:_spf.google.com ~all"这里不展开具体服务商的配置步骤,因为不同服务商的 include 地址完全不同。配置前建议先查看邮件服务商官方文档,或者直接使用服务商提供的检测工具。重点是:SPF、DKIM、DMARC 不是可选项,而是域名邮箱的基础安全设施。没有配置 DMARC 的域名,更容易被冒用来发钓鱼邮件。
4. 上线后过滤规则:把垃圾邮件挡在收件箱外
即使做好了预防,也总会有漏网之鱼。接下来要做的,就是在收件端设置多层过滤规则,把大部分垃圾邮件挡在收件箱外面。
4.1 邮箱服务商自带的过滤配置
以 Gmail 为例,可以通过“设置 -> 查看所有设置 -> 过滤器和阻止的地址 -> 创建新的过滤器”来添加规则。常见的过滤策略有三种:
第一种是按发件域名过滤。如果某个域名反复发送垃圾邮件,可以直接屏蔽整个域名,例如from:spam-domain.xyz直接删除。
第二种是按主题关键词过滤。针对 SEO 推广类邮件,可以匹配 “SEO”“推广”“排名优化”“外贸建站”“代开发票” 等关键词,执行“跳过收件箱(Archive)”“标记为已读”“应用标签”的操作。这样邮件不会出现在收件箱中,但仍然可以在标签下查阅,避免误删重要邮件。
第三种是白名单过滤。把客户、同事、常用工具的邮箱加入白名单,确保过滤规则不会误伤重要联系人。
国内邮箱的配置逻辑类似,但界面入口不同。建议不要设置过于激进的“直接删除”,而是先使用“应用标签”和“跳过收件箱”,观察一段时间后再决定是否直接删除。
4.2 Sieve 脚本过滤示例
如果你的邮箱服务商支持 Sieve 过滤脚本,或者你公司自建了邮件服务器,可以写更灵活的过滤规则。Sieve 是一种邮件过滤语言,下面是一个简单示例:
require ["fileinto", "comparator-i;ascii-numeric", "relational"]; # 针对批量推广域名的过滤 if address :domain :is "From" "marketing-spam.com" { fileinto "Spam"; stop; } # 针对可疑主题的过滤 if anyof( header :contains "Subject" "SEO", header :contains "Subject" "排名优化", header :contains "Subject" "外贸建站" ) { fileinto "Spam"; stop; } # 针对可疑退订链接的过滤 if header :contains "List-Unsubscribe" "weird-marketing.com" { fileinto "Spam"; stop; }这段脚本的逻辑很清晰:先按发件域名过滤,再按主题关键词过滤,最后按退订链接域名过滤。匹配到的邮件直接进 Spam 文件夹,不再进入收件箱。需要注意的是,Sieve 语法在不同服务商之间略有差异,示例中的comparator-i;ascii-numeric需要服务商支持,如果报语法错误,可以去掉这一行再试。
4.3 退订与举报的正确姿势
处理垃圾邮件时,有一个很容易犯的错误:看到邮件底部有“退订”按钮就随手点击。
对正经邮件营销服务商发送的邮件,点击退订通常没问题,对方会按照规定移除你的地址。但对钓鱼邮件来说,退订链接很可能是一个陷阱,点击之后反而会向对方确认“这是一个活跃的邮箱地址”,然后你的邮箱会收到更多垃圾邮件。
正确的做法是:
- 对明显是欺诈、钓鱼的邮件,不要点击任何链接,直接标记为垃圾邮件。
- 对来源正规但不想再收到的营销邮件,可以去官方设置页面关闭邮件通知,而不是点击邮件里的退订链接。
- 对无法确认来源的邮件,先查看邮件头,确认 SPF、DKIM、DMARC 结果后再决定是否退订。
举报也很关键。邮箱服务商都有自己的垃圾邮件举报机制,当你把一封邮件标记为垃圾邮件时,服务商会分析其特征,并增强对类似邮件的拦截能力。举报得越多,过滤效果越好。
5. 联系表单防爬实战:Honeypot、时间戳与限流
前面提到,联系表单是替代明文邮箱的好方式。但如果只是把mailto:换成表单,不加强后端防护,爬虫依然可以通过构造请求来轰炸你。下面用一个 Flask 示例,演示一套轻量级的联系表单防爬方案。
5.1 核心思路
这套方案包含三个关键点:
Honeypot(蜜罐):在表单中隐藏一个真实用户不会填写的字段,如果后端发现该字段有内容,就判定为机器人,直接拒绝。
时间戳校验:表单页面加载时记录当前时间,用户提交时将这个时间一并发送到后端。如果提交时间与页面加载时间间隔太短,说明是脚本自动提交,而不是人工填写。
频率限制:记录同一 IP 的提交间隔,如果 60 秒内有多次提交,返回 429 状态码,防止批量轰炸。
这三个点不需要引入重型中间件,对独立开发者的轻量站点来说完全够用。
5.2 Flask 后端示例
首先安装 Flask。这里不绑定具体版本,建议使用较新的稳定版本:
pip install flask后端代码保存为app.py:
import time from flask import Flask, jsonify, request app = Flask(__name__) # 简单的内存频率记录表,生产环境建议用 Redis _submit_records = {} def is_spam_form(form): # 1. Honeypot 字段:真实用户不会填写 honeypot = form.get("website", "").strip() if honeypot: return True # 2. 时间戳校验:页面加载到提交至少需要 3 秒 try: form_ts = float(form.get("form_ts", "0")) except ValueError: return True elapsed = time.time() - form_ts if elapsed < 3: return True return False @app.route("/api/contact", methods=["POST"]) def contact(): form = request.form # 先做垃圾请求判断 if is_spam_form(form): return jsonify({"ok": False, "message": "rejected"}), 400 # 频率限制:同一 IP 60 秒内只能提交一次 ip = request.remote_addr or "unknown" now = time.time() last = _submit_records.get(ip, 0) if now - last < 60: return jsonify({"ok": False, "message": "too frequent"}), 429 _submit_records[ip] = now # 在这里写入你的业务逻辑: # 例如发送邮件、创建工单、写入数据库 email = form.get("email", "").strip() content = form.get("content", "").strip() print(f"收到有效联系请求: {email} -> {content[:50]}") return jsonify({"ok": True, "message": "received"}) if __name__ == "__main__": app.run(host="0.0.0.0", port=5000)代码有几个需要注意的地方:
- 内存字典
_submit_records只适合单进程开发环境。生产环境部署多个进程时,需要把计数放到 Redis 中,否则频率限制会失效。 - 时间戳校验使用的是“页面加载时间”,而不是用户开始填写的时间。正常用户从页面加载到写完内容提交,通常会超过 3 秒,所以 3 秒阈值是安全的。
- 实际业务中不要用
print代替正式邮件发送,这在生产环境是不可靠的。示例中用print只是为了让你快速跑通流程。
5.3 前端页面示例
保存一个templates/index.html,内容如下:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>联系我们</title> </head> <body> <h1>联系我们</h1> <form id="contactForm" method="post" action="/api/contact"> <!-- 时间戳字段 --> <input type="hidden" name="form_ts" id="formTs" value=""> <!-- Honeypot 隐藏字段,真实用户看不到 --> <div style="display:none;"> <input type="text" name="website" tabindex="-1" autocomplete="off"> </div> <p> <label>你的邮箱</label> <input type="email" name="email" required> </p> <p> <label>留言内容</label> <textarea name="content" rows="6" required></textarea> </p> <button type="submit">提交</button> </form> <script> // 页面加载时写入当前时间戳 document.getElementById('formTs').value = Date.now() / 1000; // 前端再做一层 Honeypot 拦截 document.getElementById('contactForm').addEventListener('submit', function (e) { const honeypot = document.querySelector('[name=website]'); if (honeypot && honeypot.value) { e.preventDefault(); alert('提交失败'); } }); </script> </body> </html>前端加了一层 Honeypot 拦截,目的是减少无效请求到达后端。但前端校验不能替代后端校验,因为爬虫完全可以绕过前端脚本直接 POST 到接口。
如果你不想用 Flask 模板渲染,可以把 HTML 文件单独放在static/目录下,通过 Nginx 托管,前端直接请求后端的/api/contact接口即可。
5.4 运行与验证
启动服务:
python app.py然后用浏览器访问http://localhost:5000/,正常填写表单后提交,后端会打印一条记录。如果直接使用 curl 模拟机器人请求,不携带form_ts字段,会被返回 400:
curl -X POST http://localhost:5000/api/contact -d "email=test@test.com&content=hello"输出结果:
{ "message": "rejected", "ok": false }连续快速提交第二次,会触发频率限制,返回 429:
{ "message": "too frequent", "ok": false }这套方案虽然简单,但已经能过滤掉大部分批量脚本。真实项目中,还可以叠加图形验证码、IP 黑名单、关键词过滤、滑动验证等机制,进一步降低垃圾提交量。
6. 发送邮件也要讲策略:避免自己变成“垃圾邮件制造者”
防止收到垃圾邮件只是问题的一半。如果你的产品有邮件发送功能,比如给用户发通知、发激活链接、发营销活动,那么你还要注意另一件事:不要让自己被邮箱服务商判定为垃圾邮件发送者。
6.1 个人邮箱与交易邮件的区别
很多开发者会在产品初期直接用个人邮箱发送通知邮件,这其实是一个陷阱。个人邮箱的发送域名没有配置 SPF、DKIM、DMARC 记录,也没有专门的邮件发送域名,很容易被收件方的邮件服务商拦截,或者直接被扔进垃圾箱。
更严重的情况是,如果你的个人邮箱被大量用户举报,域名信誉会下降,以后正常邮件也可能发不出去。
建议的做法是:将交易邮件和营销邮件拆分使用不同的发送通道。交易邮件(注册激活、密码重置、订单通知)使用专门的事务邮件服务,例如各家云服务商提供的邮件发送产品;营销邮件则使用订阅型邮件服务,走双选确认机制。不同服务的配置差异很大,这里不写具体产品,但核心原则是一致的:用官方支持的发送通道,配置好域名验证信息,监控送达率和退信率。
6.2 List-Unsubscribe 退订头
如果你需要向用户发送邮件通知,请在邮件头中正确携带List-Unsubscribe字段。这个字段可以让 Gmail、Outlook 等邮箱服务商在邮件界面上展示“退订”按钮,而不需要用户手动查找退订链接。
List-Unsubscribe: <mailto:unsubscribe@yourdomain.com?subject=unsubscribe>更重要的是,当用户点击退订后,你的系统要真正停止给该用户发送邮件,而不是把退订请求当作无效操作。现在很多邮箱服务商已经对退订成功率做了监控,频繁发送被用户举报的邮件,会影响域名信誉,最终导致正常邮件进入垃圾箱。
6.3 用户许可与隐私保护
从产品设计角度来说,获取用户的邮件地址后,第一件事不是发营销邮件,而是让用户明确知道他会被用于什么场景。默认勾选营销订阅是很多产品被投诉垃圾邮件的根源。
建议遵循最小授权原则:
- 注册时只要求填写必要信息。
- 营销订阅使用单独的勾选框,不默认勾选。
- 在邮件底部提供清晰的退订链接。
- 用户退订后,在 48 小时内完成处理。
这不仅是用户体验问题,也涉及个人信息保护合规。具体的法规要求需要咨询专业人士,但“获得授权、提供退订、尊重选择”是所有邮件发送方都应该遵守的基本底线。
7. 常见问题与排查清单
这一节整理上线后最常见的几个问题场景,你可以直接对照排查。
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 上线后收到大量营销邮件 | 邮箱地址被爬虫采集 | 更换公开邮箱为角色邮箱,添加过滤规则,逐步迁移到新地址 |
| 收到来自自己域名的可疑邮件 | 域名 SPF/DKIM/DMARC 未配置或配置错误 | 检查 DNS 记录,补齐三项认证,开启 DMARC 报表监控 |
| 收到大量订阅确认邮件 | 订阅接口被脚本批量调用 | 给订阅接口加验证码、频率限制,检查订阅日志中的异常 IP |
| 同一账号短时间内收到大量邮件 | 邮箱被“订阅轰炸”攻击 | 不要点击邮件中的确认链接,联系邮箱服务商投诉,启用更严格的过滤规则 |
| 过滤规则误杀了客户邮件 | 规则设置过宽 | 检查垃圾箱和过滤规则,将被误判的发件人加入白名单 |
| 正常邮件发不出去或进垃圾箱 | 发送域名信誉低或未配置认证 | 使用专业邮件服务,配置 SPF/DKIM/DMARC,控制发送频率 |
7.1 上线后垃圾邮件已经爆发,怎么办
如果已经出现垃圾邮件刷屏的情况,不要一封一封手动删除,按照下面的顺序处理:
第一步,确认哪些邮件是垃圾邮件,哪些是真实用户邮件。按发件域名、主题关键词快速批量标记。
第二步,创建过滤规则,把明显的垃圾邮件域名和关键词统一归档到 Spam 标签,不再进入收件箱。
第三步,统计垃圾邮件的发件域名。如果 80% 的垃圾邮件来自某几个域名,可以直接在邮箱层面屏蔽整个域名。
第四步,更换公开邮箱。将官网、Product Hunt、社交媒体上的邮箱地址替换为新的角色邮箱或别名,并逐步迁移重要联系人。
第五步,检查是否有真实用户因为垃圾邮件问题而失去耐心,尽快恢复正常的商务沟通渠道。
7.2 被“订阅轰炸”了怎么办
订阅轰炸通常是有人利用你的订阅表单,批量提交别的邮箱地址,让那些邮箱收到大量订阅确认邮件,用来干扰你或者攻击第三方用户。
处理方式如下:
- 立即检查订阅接口是否有频率限制、验证码等防爬措施。
- 查看订阅日志中的 IP 和邮箱列表,如果是明显批量生成的数据,可以直接清除。
- 不要在邮件中提供“一键确认订阅”的链接,至少使用双次确认。
- 如果持续遭受攻击,可以暂时关闭公开订阅接口,改为人工审核模式。
7.3 过滤规则误判了正常邮件怎么办
过滤规则使用的是“关键词”和“域名”匹配,难免误伤。例如合作伙伴的邮件标题里包含“推广”字样,就可能被归档到 Spam。
解决办法是使用“标签 + 跳过收件箱”而不是“直接删除”,这样即使被误判,也能在标签下找到邮件。同时,对重要联系人单独设置白名单,确保规则不会应用到该发件人的邮件上。
8. 长期策略:把垃圾邮件当成一种安全信号
处理完眼前的垃圾邮件之后,建议把策略眼光放长远一些。垃圾邮件不只是骚扰,它背后隐藏着很多安全信号。
当你的域名邮箱突然开始收到大量伪造邮件,可能说明你的域名信息被恶意爬取,或者域名邮件配置存在漏洞。当你网站上的联系表单开始频繁收到色情广告和营销推广,说明你的防爬措施已经失效,需要及时更新。当你的个人邮箱被订阅轰炸,说明某个公开渠道的邮箱已经泄露,应该考虑更换别名或邮箱地址。
长期维护建议可以概括为以下几点:
第一,保持最小化公开信息。每次公开发布活动前,先搜索自己的域名和常用昵称,看看能关联到哪些个人邮箱,及时清理。GitHub 上开启邮件隐私,提交记录使用 noreply 邮箱;域名开启 WHOIS 隐私保护;官网只留必要的联系入口。
第二,维护邮件监控与日志。如果自建邮件系统,定期查看退信率和垃圾投诉率。如果使用第三方邮箱服务,关注后台的送达数据。异常波动往往说明域名被冒用或邮件内容被用户举报。
第三,定期清理不需要的别名和转发规则。为每次营销活动、产品上线单独生成的别名,在活动结束后可以停用删除,避免成为长期的垃圾邮件接收器。
第四,关注邮件安全配置。每年检查一次域名的 SPF、DKIM、DMARC 记录,确保没有被恶意添加新的 include 记录。DNS 管理平台的账号开启双因素认证,防止域名被劫持后恶意发送钓鱼邮件。
最后再提醒一句:网络是公开的,任何你在产品上线时公开的信息都可能被采集。不要等到垃圾邮件淹没收件箱才想起来防护,把邮件防护和隐私设计当成产品上线的一部分,才是真正省心的做法。希望这篇文章能帮你把收件箱清理干净,也祝你接下来的产品上线,收到的是真实用户的反馈,而不是一堆讨人厌的 spam。