为无服务器React应用添加邮件发送频率限制方案咨询
无服务器React应用实现EmailJS发送频率限制的方案
核心结论:React前端没有类似express-rate-limit的专用防刷包,纯前端限制极易被技术用户绕过。想要有效拦截恶意刷量,需要结合前端临时防护+后端验证,或是利用EmailJS/邮件服务商的原生限制规则。
1. 前端本地临时限制(仅作基础拦截)
这种方法只能拦截普通用户的误操作,懂技术的人可通过清除本地存储绕过,仅作为辅助手段。
实现思路:用localStorage或sessionStorage记录用户上次发送邮件的时间戳,触发发送前先校验时间差:
const canSendEmail = () => { const lastSentTime = localStorage.getItem('lastEmailSentTime'); const now = Date.now(); // 30分钟对应的毫秒数:30 * 60 * 1000 = 1800000 if (!lastSentTime || now - parseInt(lastSentTime) > 1800000) { localStorage.setItem('lastEmailSentTime', now.toString()); return true; } return false; }; // 调用EmailJS前执行校验 const handleSendEmail = () => { if (!canSendEmail()) { alert('每30分钟仅可发送1封邮件,请稍后再试'); return; } // 此处编写EmailJS发送逻辑 };
2. 利用EmailJS及邮件服务商的原生限制
不少邮件服务提供商(如Gmail、Outlook)本身自带发送频率限制,你可以先检查:
- 登录EmailJS控制台,查看绑定的邮件服务是否有发送次数/频率的配置选项
- 部分EmailJS套餐会限制免费用户的日发送量,升级套餐可获得更灵活的限制权限
3. 新增无服务器函数中间层(最可靠的防刷方案)
作为无服务器React应用,可借助Vercel Functions、Netlify Functions这类无服务器函数做转发层,在中间层实现严格的频率控制:
- 创建无服务器函数(比如
api/send-email.js) - 在函数中使用
express-rate-limit或rate-limiter-flexible实现频率校验 - 前端不再直接调用EmailJS API,转而请求该无服务器函数,由函数代为调用EmailJS发送邮件
示例代码(Vercel Functions + express-rate-limit):
import express from 'express'; import rateLimit from 'express-rate-limit'; import emailjs from '@emailjs/nodejs'; const app = express(); app.use(express.json()); const limiter = rateLimit({ windowMs: 30 * 60 * 1000, // 时间窗口:30分钟 max: 1, // 每个IP仅允许1次请求 message: '每30分钟仅可发送1封邮件,请稍后再试' }); app.post('/', limiter, async (req, res) => { try { // 调用EmailJS发送邮件 await emailjs.send( process.env.EMAILJS_SERVICE_ID, process.env.EMAILJS_TEMPLATE_ID, req.body, { publicKey: process.env.EMAILJS_PUBLIC_KEY, privateKey: process.env.EMAILJS_PRIVATE_KEY } ); res.status(200).json({ success: true }); } catch (error) { res.status(500).json({ success: false, error: error.message }); } }); export default app;
前端请求该接口时,会先经过无服务器函数的频率验证,后端限制无法通过前端操作绕过,能有效拦截恶意刷量。
内容的提问来源于stack exchange,提问作者Zhenjie Liang
相关产品推荐
相关产品推荐

