
freeCodeCamp 本地开发如何用 Mailpit 捕获 API 发出的邮件【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp在 freeCodeCamp 仓库做本地开发时API 需要发送注册、验证、邮件订阅等邮件但开发环境里不能让真实邮件发出去也不能依赖 AWS SES 的生产凭证。项目的做法是本地把邮件服务商设为 nodemailer让所有发信请求走一个运行在 Docker 里的 Mailpit 实例API 发到MAILPIT_HOST:1025你在 Mailpit 的 Web 界面里就能查到每一封被捕获的邮件。本文基于仓库内的 sample.env、docker/docker-compose.yml、docker/docker-compose.ports.yml 和 api/src/plugins/mail-providers/nodemailer.ts 给出这条路径的配置与验证方式。邮件如何被路由到 Mailpit先弄清楚判定逻辑后续配置才不会出错。API 创建邮件 provider 的入口在 api/src/plugins/mail-providers/nodemailer.ts 的createMailProvider()它只根据一个环境变量分叉EMAIL_PROVIDER ses时连接SES_SMTP_HOST端口 465TLS使用SES_SMTP_USERNAME/SES_SMTP_PASSWORD认证这是生产配置其他任何值本地开发用nodemailer时连接MAILPIT_HOST端口固定为 1025secure: false认证写死为user: test, pass: test。MAILPIT_HOST的解析在 api/src/utils/env.ts// Mailpit is used in development and test environments, hence the localhost export const MAILPIT_HOST process.env.MAILPIT_HOST ?? localhost;也就是说只要 API 跑在宿主机上且没有覆盖MAILPIT_HOST它会默认发往localhost:1025。sample.env 中给出的本地默认值与此一致# Email # use ses in production, nodemailer for local development (with Mailpit) EMAIL_PROVIDERnodemailer # Mailpit runs in docker/docker-compose.yml MAILPIT_HOSTlocalhost所以本地开发要做的只有两件事确保环境里是EMAIL_PROVIDERnodemailer并让 Mailpit 容器真的在MAILPIT_HOST:1025上监听。准备条件Node24、pnpm10根 package.json 的engines声明。可用的 Docker用来跑 compose 里的 Mailpit以及同文件的db、setup服务。仓库根目录的环境文件.env仓库提供模板 sample.env其中client_id_from_auth0_dashboard、api_key_from_algolia_dashboard等值是占位符需要你按自己的凭证替换SESSION_SECRET、COOKIE_SECRET、JWT_SECRET同样要填。compose 文件引用的是根目录.env见 docker/docker-compose.e2e.yml 中的env_file: - ../.env所以把配置好的.env放在仓库根目录即可。sample.env中与应用路径相关的本地默认值供参考HOME_LOCATIONhttp://localhost:8000、API_LOCATIONhttp://localhost:3000。启动 MailpitMailpit 服务定义在 docker/docker-compose.ymlmailpit: image: axllent/mailpit restart: unless-stopped同一个 compose 文件里还有dbmongo:8.2带 healthcheck和一次性的setup初始化 replica set服务API 本地开发同样需要所以直接整体启动即可。主路径API 跑在宿主机上。此时还需要 docker/docker-compose.ports.yml 把端口发布到宿主机docker compose -f docker/docker-compose.yml -f docker/docker-compose.ports.yml up -d该覆盖文件只增加端口映射其中 Mailpit 的两个端口是理解整个方案的关键mailpit: ports: - 1025:1025 # SMTP 收信端口API 的 nodemailer 连接这里 - 8025:8025 # Mailpit Web 界面端口API 通过localhost:1025发信你在http://localhost:8025的 Mailpit 界面里就能看到被捕获的邮件。可选分支在开发容器devcontainer里跑 API。docker/docker-compose.ports.yml 顶部的注释说明了这个差异Host ports for the setup without a container. The dev container omits this file, because a service sharing the db network namespace cannot publish a port.即 devcontainer 场景只加载基础 compose 文件docker compose -f docker/docker-compose.yml up -d不加载 ports 文件。此时 API 与 Mailpit 在同一 Docker 网络里不能再用localhost互访——docker/docker-compose.e2e.yml 给出了官方示例容器内要覆盖为服务名environment: # The api cannot connect to mongodb or mailpit via localhost from inside the # container, so we have to override these variables. - MONGOHQ_URLmongodb://mongodb:27017/freecodecamp?replicaSetrs0 - MAILPIT_HOSTmailpit如果你在自己的容器化开发环境里遇到API 连不上 Mailpit先检查MAILPIT_HOST是否仍写着localhost。启动 API 并触发发信环境与容器就绪后用仓库根目录的开发脚本启动见根 package.json 的 scriptspnpm develop等价于turbo develop只起 API 可用pnpm develop:api。由于.env里是EMAIL_PROVIDERnodemailercreateMailProvider()会走 Mailpit 分支。之后 API 每次发信比如注册、更新邮箱等流程触发的邮件都会被 Mailpit 收下而不是真实投递。验证捕获是否成功文档给出的判定点在端口映射这一层SMTP 通道API 日志中发信不再报连接失败说明MAILPIT_HOST:1025通了nodemailer 非 ses 分支固定连 1025 端口。查看邮件浏览器打开http://localhost:8025非容器场景由8025:8025映射提供在 Mailpit 收件列表中应能看到 API 刚发出的那封邮件核对收件人、主题是否符合预期。仓库中没有对 UI 截图或具体邮件内容的文档示例界面内容以你实际触发流程后看到为准。排查与限制容器内不能依赖localhost这是仓库文档明确写出的限制docker/docker-compose.e2e.yml 的注释容器内必须用服务名mailpit覆盖MAILPIT_HOST。MAILPIT_HOST不设置时会静默落到localhostapi/src/utils/env.ts 的默认值如果 API 在容器内运行又忘了覆盖发信会失败且不会指向 Mailpit 服务。生产环境不走 MailpitEMAIL_PROVIDERses时走 SES SMTP465 端口、TLS且SES_SMTP_USERNAME/SES_SMTP_PASSWORD/SES_SMTP_HOST为生产必需sample.env 注释SES SMTP credentials required in production。本文的 Mailpit 路径只适用于 development/test 环境。devcontainer 场景不发布 8025 端口ports 文件被省略Web 界面的访问方式随你的容器网络配置而定本文不展开。下一步如果你要跑 E2E 测试而不是手工开发仓库给出的完整组合是三个文件一起加载docker/docker-compose.e2e.yml 顶部注释docker compose -f docker/docker-compose.yml -f docker/docker-compose.ports.yml -f docker/docker-compose.e2e.yml up -d该场景下api服务额外声明depends_on: db, mailpit并自带MAILPIT_HOSTmailpit的覆盖邮件同样会被 Mailpit 捕获。【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考