我用 Gemini 3 Pro 手搓了一个并发邮件群发神器(附源码)

这个周末我失业了 。

起因很简单:公司项目原因,我需要给订阅列表里的几千个用户发一封更新通知。 市面上的邮件营销工具(Mailchimp
之类)死贵,还要一个个导入联系人;自己写脚本吧,以前得折腾半天
SMTP 协议、搞定并发限制、处理失败重试……想想就头秃 。

正好有 Gemini 3 Pro ,代码能力逆天。我就想试探一下它的底线。 结果这一试,我后背发凉。

我本来只想要个 Demo,它直接给了我一个带连接池
(Connection Pool)、
任务队列(Task Queue)、甚至还顺手写了服务端渲染
(SSR) 的完整全栈应用。

以前我写这套东西起码得两天,这次连写带调,2 小时收工

今天复盘一下我是怎么压榨 Antigravity - Gemini 3 Pro 开发出这个Turbo Mail Sender的。

不仅要看得下去,还要骚气点

我给第一个 Prompt 很简单,但也很刁钻:

我要做一个邮件群发工具的单页 UI。要求:

  1. 写邮件(集成 Quill 富文本编辑器
    )。
  2. 包含监控发送进度(要有一个骚气的进度条和实时日志)。

  3. Tailwind CSS,设计风格要轻色单栏,带点微交互动画。
  4. 直接给我 HTML 单文件就行。

它思考了大概几分钟(网络环境有点差 )。它没有给我堆砌div,它直接甩出了基于 Tailwind 的完整布局,甚至贴心地加上了@keyframes fadeInUp入场动画。

看看这个生成的 UI 代码片段,它连backdrop-filtershadow的细节都处理好了:

<style> @keyframes fadeInUp { from { opacity: 0; transform: translateY(6px);} to { opacity:1; transform: translateY(0); } } .log-entry { opacity:0; transform:translateY(6px); animation: fadeInUp 420ms ease forwards; } /* 进度条的光泽动画,这审美绝了 */ @keyframes shimmer { 0% { background-position: -200px 0 } 100% { background-position: 200px 0 } } </style>

最骚的是,它连 JS 里的富文本编辑器初始化都帮我写好了,甚至考虑到了 SSR 的数据回填逻辑。这哪里是 AI,这简直就是自带 3 年经验的前端同事。

从普通的脚本到工程化

UI 画好了,接下来是后端。这里才是见真章的地方。 很多新手写发邮件脚本,就是写个for循环调用sendMail。结果就是发 100 封后 IP 被封,或者内存溢出。

我给 Gemini 的 Prompt 是:

后端用
Express +
Nodemailer。注意,我要发送几万封邮件。

  1. 必须有连接池 (Connection Pooling),不能每次发送都握手。
  2. 必须有生产者-消费者队列,控制并发数(Concurrency)。
  3. 失败要自动重试。
  4. 给我写出架构级的代码。

如果是以前的 AI,大概率会给我瞎编一个队列。 但它给出的server.js,让我这个老前端都挑不出毛病。

自动实现了连接池缓存

它自己封装了一个TransporterCache类,防止重复创建 SMTP 连接。这波操作直接把性能拉满了。

// server.js 核心片段:连接池 class TransporterCache { constructor() { this.cache = new Map(); } get(host, port, user, pass) { const key = `${user}@${host}`; if (this.cache.has(key)) return this.cache.get(key); // Gemini 居然知道开启 pool: true 选项 const transporter = nodemailer.createTransport({ pool: true, host: host, port: Number(port), secure: Number(port) === 465, auth: { user, pass }, maxConnections: 3, // 自动限制最大连接数 rateLimit: 5 // 还有速率限制,讲究 }); this.cache.set(key, transporter); return transporter; } }

像模像样的任务队列

它没有引入 Redis(因为我要轻量级),而是手搓了一个内存版的TaskManagerWorker

// server.js 核心片段:消费者 Worker class Worker { constructor() { setInterval(() => this.tick(), 500); } tick() { // 经典的消费逻辑:控制并发数 while (taskManager.running < CONFIG.CONCURRENCY && taskManager.queue.length > 0) { const id = taskManager.queue.shift(); const task = taskManager.getTask(id); if (task) this.processTask(task); } } // ...发送与重试逻辑 }

看到这段代码时,我意识到:Gemini 不仅仅是在翻译需求,它更懂架构。

最后的细节修改

做到这里,工具已经能用了。但我故意刁难了一下 Gemini:

现在的配置(SMTP服务器、端口)每次刷新页面就没了,体验太差。但我不想用数据库。你想办法解决一下。

Gemini 3 Pro 给出的方案是:SSR (服务端渲染) + LocalStorage 双重兜底

它直接修改了server.js/路由,在返回 HTML 之前,把 URL 参数里的配置通过正则替换注入到 HTML 中。不用数据库,却实现了配置持久化的错觉。

// server.js:极其暴力的正则替换 SSR,简单粗暴但有效 if (host) { html = html.replace(/id="smtpHost"\s+type="text"\s+value="[^"]*"/, `id="smtpHost" type="text" value="${host}"`); }

说实话,这种正则替换虽然看起来很脏,但在这种微型工具里,不仅省事,而且性能极高。AI 这种能力(知道是小工具就不上重型框架),才是最可怕的。

成果与开源

最终,这个Turbo Mail Sender具备了以下能力:

  • 高并发发送:连接池 + 异步队列。
  • 实时可视化:能看到每一封邮件的发送状态、耗时。
  • 智能重试:遇到网络抖动自动重发。
  • CSV 导入:支持批量导入收件人。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1155125.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IT6251FN:LVDS转DisplayPort 1.1a发射机

IT6251 是一款高性能单芯片 De-SSC LVDS 转 DisplayPort 转换器。结合LVDS接收器和DisplayPort发射器&#xff0c;IT6251通过转换功能支持LVDS输入和DisplayPort 1.1a输出。内置的LVDS接收器支持单链路和双链路LVDS输入&#xff0c;内置的DisplayPort发射器完全符合DisplayPort…

Nodejs和vue框架的基于大数据的水产品安全信息管理系统_ 可视化大屏系统

文章目录基于大数据的水产品安全信息管理系统可视化大屏摘要--nodejs技术栈--结论源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;基于大数据的水产品安全信息管理系统可视化大屏摘要 该系统结合Node.js后端与Vue.js前端框架&#xff0…

Agent Skills解决了什么问题?何时使用?

Agent Skills 可以被看作是给 AI 助手配备的“职业技能培训手册”。简单来说&#xff0c;它的核心目标是让 AI 从一个“通才”变成“身怀绝技的专家”&#xff0c;并且在处理复杂任务时更加稳定、高效。&#x1f3af; Agent Skills 到底解决了什么问题&#xff1f;在 Agent Ski…

性能监控之首屏性能监控小实践

背景&#xff1a;终于完成了阶段性的首屏性能优化的开发部分&#xff0c;该写监控代码验收成效了&#xff0c;这两天研究了下&#xff0c;先看下结果吧&#xff1a;核心性能指标均实现大幅下降&#xff0c;优化效果显著&#xff0c;具体分析如下&#xff1a;指标优化前均值&…

cesium 优化面

节点优化提升加载面数据 // 简化边界数据 function simplifyPolygon(positions, tolerance) {// 实现简化算法或使用第三方库return simplifiedPositions; }// 使用Primitive API&#xff08;更节省内存&#xff09; function createOptimizedPolygon(positions) {const geome…

JavaScript Date 语法要过时了!以后用这个替代!

1. 前言作为一名前端开发工程师&#xff0c;你一定被 JavaScript 的日期处理折磨过。这不是你的问题&#xff0c;是 JavaScript 自己的问题——它的 Date 功能真的很糟糕。2. Date 的离谱行为让我给你举几个例子&#xff0c;你就明白有多离谱了&#xff1a;月份从 0 开始计数&a…

Nodejs和vue框架的基于的家庭设备维修服务系统__没 项目源码

文章目录项目概述核心功能模块技术实现亮点部署与扩展性--nodejs技术栈--结论源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;项目概述 基于Node.js和Vue框架的家庭设备维修服务系统是一个全栈Web应用&#xff0c;旨在为用户提供便捷的…

产品催: 1 天优化 Vue 官网 SEO?我用这个插件半天搞定(不重构 Nuxt)

上周四早上刚坐下&#xff0c;还没来得及摸鱼&#xff0c;产品就紧急拉了个会&#xff0c;说为了搞流量&#xff0c;咱们官网得做 SEO 优化。 然后直接甩了一份市场部出的 SEO 规范文档到群里&#xff1a;这文档里的要求&#xff1a;每个页面要有独立标题、关键词&#xff0c;内…

Nodejs和vue框架的个人健康菜谱生成系统_ 项目源码

文章目录项目概述技术架构核心功能算法逻辑代码结构部署与扩展--nodejs技术栈--结论源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;项目概述 该项目基于Node.js与Vue.js构建了一个智能化的个人健康菜谱生成系统。后端采用Node.js的Exp…

常用的sql语句汇总(个人版)

1、sql按照指定数组顺序查询数据 2、数据库SQL 某字段按首字母排序 基础语句 1、SELECT&#xff1a;选择数据表中的数据 SELECT column_name1, column_name2 FROM table_name;2、WHERE&#xff1a;筛选符合条件的数据 SELECT column_name FROM table_name WHERE column_nam…

前端面试了10来个人,聊聊他们被挂的原因..

现在前端面试真的头大&#xff01;这周面了9个人全挂&#xff0c;不是没经验&#xff0c;是细节准备太拉胯了&#xff01; 1. JS基础不牢&#xff1a;闭包、事件循环这些核心概念说不明白&#xff0c;手写Promise.all、深拷贝还卡壳。得搞懂V8引擎咋干活&#xff0c;this绑定、…

AI人脸隐私卫士效果对比:传统打码与智能打码的差异

AI人脸隐私卫士效果对比&#xff1a;传统打码与智能打码的差异 1. 引言&#xff1a;为何需要更智能的人脸隐私保护&#xff1f; 随着社交媒体、公共监控和数字档案的普及&#xff0c;个人面部信息正以前所未有的速度被采集和传播。传统的“手动打码”方式虽然简单直接&#x…

【豆包写的】深入解析 torch.argmax 中 dim=1 与 one-hot 转整数标签的关系

深入解析 torch.argmax 中 dim1 与 one-hot 转整数标签的关系 你想理解在 torch.argmax(y_true_cce, dim1) 中参数 dim1 的具体含义&#xff0c;尤其是结合把 one-hot 标签转换为整数标签的场景——这是 PyTorch 处理张量维度的核心基础&#xff0c;我会用通俗的语言可视化的例…

基于超像素(super-pixel)边缘检测的呼吸监测和小波去噪、EVM PVM进行对比实验附Matlab复现

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1…

论文写作“隐藏技巧”:7款AI神器告别焦虑,导师不会告诉你的秘密

你知道吗&#xff1f;你隔壁实验室那个从不熬夜、却能轻松产出高质量论文的同学&#xff0c;可能正在用这些“隐藏工具”。而你的导师&#xff0c;大概率知道&#xff0c;却永远不会主动告诉你。 是不是经常感觉&#xff0c;论文写作像一场信息不对等的“军备竞赛”&#xff1f…

数据库常用的SQL查询语句(非常详细),看完这一篇就足够了

1. 无条件查询 --查询表中所有数据 select * from 表名;2. 查询在…到…之间(between and / && / and) --查询users表中年龄在18~25岁之间的记录 --方式1 between..and.. select * from users where age between 18 and 25;--方式2 && select * from users w…

Debug:mlx-omni-server服务器用qwen3模型出错

背景&#xff1a;AI回答出错&#xff0c;开始以为是代码问题使得之前的对话出现在上下文&#xff0c;没想到是mlx-omni-server的问题 debug过程&#xff1a; 最开始比较好运地在github论坛找到同样的问题&#xff0c;大概率确认服务器出错。 之后用copilot写了一个简单的go代码…

计算机毕业设计springboot基于的乡村有机产品交易平台 基于SpringBoot的“田间直达”有机农产品商城 SpringBoot驱动的“乡味鲜”绿色土特产交易平台

计算机毕业设计springboot基于的乡村有机产品交易平台6842sqf9&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。在“健康中国”与“乡村振兴”双重战略的催化下&#xff0c;城市餐…

从RAG落地失败到用户满意度提升90%:我们靠这一招Query Rewrite,收藏起来避免踩坑!

本文分享了RAG系统落地实践中的关键问题与解决方案。团队发现直接使用用户原始问题进行检索效果不佳&#xff0c;因为用户提问通常口语化、指代不清且含情绪。通过引入Query Rewrite能力&#xff0c;将用户问题转化为系统可理解的检索查询&#xff0c;包括问题拆解和上下文补全…

x64dbg动态分析实战案例:从零实现函数追踪(完整示例)

x64dbg实战&#xff1a;手把手教你实现函数追踪与参数解析你有没有遇到过这样的场景&#xff1f;面对一个闭源的加密程序&#xff0c;你想搞清楚它是如何调用核心加密函数的&#xff0c;但没有源码、没有符号信息&#xff0c;甚至连入口点都找不到。这时候静态分析就像在黑暗中…